package hinters

import (
	"sort"
	"sync"

	"github.com/liamg/darktile/internal/app/darktile/termutil"
)

type HinterRegistration struct {
	Priority Priority
	Hinter   Hinter
}

type Priority uint8

const (
	PriorityNone     = 0
	PriorityVeryLow  = 48
	PriorityLow      = 96
	PriorityMedium   = 128
	PriorityHigh     = 192
	PriorityVeryHigh = 224
	PriorityCritical = 255
)

type Hinter interface {
	// Match should return the index in the text of the matched occurrence
	Match(text string, cursorIndex int) (matched bool, offset int, length int)
	// Activate fires when mouseover happens afer a match - takes raw coords
	Activate(api HintAPI, match string, start termutil.Position, end termutil.Position) error
	Deactivate(api HintAPI) error
	Click(api HintAPI) error
}

var hintLock sync.RWMutex
var hinters []HinterRegistration

func register(h Hinter, p Priority) {
	hintLock.Lock()
	defer hintLock.Unlock()
	hinters = append(hinters, HinterRegistration{
		Priority: p,
		Hinter:   h,
	})
}

func All() []Hinter {
	hintLock.RLock()
	defer hintLock.RUnlock()

	var output []Hinter

	sort.Slice(hinters, func(i, j int) bool {
		return hinters[i].Priority > hinters[j].Priority
	})

	for _, hinter := range hinters {
		output = append(output, hinter.Hinter)
	}

	return output
}