#ifndef GITATTR_H
#define GITATTR_H

#include <nan.h>
#include <string>

extern "C" {
#include <git2.h>
}

#include "../include/repository.h"


using namespace node;
using namespace v8;

class GitAttr : public ObjectWrap {
  public:

    static Persistent<Function> constructor_template;
    static void Initialize (Handle<v8::Object> target);

    
  private:
    
    static NAN_METHOD(New);

    
                  
    struct GetBaton {
      int error_code;
      const git_error* error;
                    const char * value_out;
                            git_repository * repo;
                            uint32_t flags;
                            const char * path;
                            const char * name;
                  };
    class GetWorker : public NanAsyncWorker {
      public:
        GetWorker(
            GetBaton *_baton,
            NanCallback *callback
        ) : NanAsyncWorker(callback)
          , baton(_baton) {};
        ~GetWorker() {};
        void Execute();
        void HandleOKCallback();

      private:
        GetBaton *baton;
    };
        
    static NAN_METHOD(Get);
                        
    struct GetManyBaton {
      int error_code;
      const git_error* error;
                    const char * values_out;
                            git_repository * repo;
                            uint32_t flags;
                            const char * path;
                            size_t num_attr;
                            const char ** names;
                  };
    class GetManyWorker : public NanAsyncWorker {
      public:
        GetManyWorker(
            GetManyBaton *_baton,
            NanCallback *callback
        ) : NanAsyncWorker(callback)
          , baton(_baton) {};
        ~GetManyWorker() {};
        void Execute();
        void HandleOKCallback();

      private:
        GetManyBaton *baton;
    };
        
    static NAN_METHOD(GetMany);
                                  
    static NAN_METHOD(CacheFlush);
                        
    static NAN_METHOD(AddMacro);
          
    };

#endif
