package git

/*
#include <git2.h>

extern void _go_git_revspec_free(git_revspec *revspec);
*/
import "C"
import (
	"runtime"
	"unsafe"
)

type RevparseFlag int

const (
	RevparseSingle    RevparseFlag = C.GIT_REVPARSE_SINGLE
	RevparseRange     RevparseFlag = C.GIT_REVPARSE_RANGE
	RevparseMergeBase RevparseFlag = C.GIT_REVPARSE_MERGE_BASE
)

type Revspec struct {
	to    Object
	from  Object
	flags RevparseFlag
}

func (rs *Revspec) To() Object {
	return rs.to
}

func (rs *Revspec) From() Object {
	return rs.from
}

func (rs *Revspec) Flags() RevparseFlag {
	return rs.flags
}

func newRevspecFromC(ptr *C.git_revspec, repo *Repository) *Revspec {
	var to Object
	var from Object

	if ptr.to != nil {
		to = allocObject(ptr.to, repo)
	}

	if ptr.from != nil {
		from = allocObject(ptr.from, repo)
	}

	return &Revspec{
		to:    to,
		from:  from,
		flags: RevparseFlag(ptr.flags),
	}
}

func (r *Repository) Revparse(spec string) (*Revspec, error) {
	cspec := C.CString(spec)
	defer C.free(unsafe.Pointer(cspec))

	var crevspec C.git_revspec

	runtime.LockOSThread()
	defer runtime.UnlockOSThread()

	ecode := C.git_revparse(&crevspec, r.ptr, cspec)
	if ecode != 0 {
		return nil, MakeGitError(ecode)
	}

	return newRevspecFromC(&crevspec, r), nil
}

func (v *Repository) RevparseSingle(spec string) (Object, error) {
	cspec := C.CString(spec)
	defer C.free(unsafe.Pointer(cspec))

	var ptr *C.git_object

	runtime.LockOSThread()
	defer runtime.UnlockOSThread()

	ecode := C.git_revparse_single(&ptr, v.ptr, cspec)
	if ecode < 0 {
		return nil, MakeGitError(ecode)
	}

	return allocObject(ptr, v), nil
}

func (r *Repository) RevparseExt(spec string) (Object, *Reference, error) {
	cspec := C.CString(spec)
	defer C.free(unsafe.Pointer(cspec))

	var obj *C.git_object
	var ref *C.git_reference

	runtime.LockOSThread()
	defer runtime.UnlockOSThread()

	ecode := C.git_revparse_ext(&obj, &ref, r.ptr, cspec)
	if ecode != 0 {
		return nil, nil, MakeGitError(ecode)
	}

	if ref == nil {
		return allocObject(obj, r), nil, nil
	}

	return allocObject(obj, r), newReferenceFromC(ref, r), nil
}
