package hinters

import (
	"regexp"
	"strconv"
	"strings"
	"syscall"
	"time"

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

func init() {
	register(&DmesgTimestampHinter{}, PriorityVeryLow)
	setSysStartTime()
}

var sysStart time.Time

type DmesgTimestampHinter struct{}

var dmsegTsMatcher = regexp.MustCompile(`^\[\s*\d+.\d{6}\]`)

func (h *DmesgTimestampHinter) Match(text string, cursorIndex int) (matched bool, offset int, length int) {
	matches := dmsegTsMatcher.FindAllStringIndex(text, -1)
	for _, match := range matches {
		if match[0] <= cursorIndex && match[1] > cursorIndex {
			return true, match[0], match[1] - match[0]
		}
	}
	return
}

func (h *DmesgTimestampHinter) Activate(api HintAPI, match string, start termutil.Position, end termutil.Position) error {
	match = strings.Split(strings.Trim(match, "[] "), ".")[0]
	seconds, err := strconv.ParseFloat(match, 32)
	if err != nil {
		return err
	}
	result := sysStart.Add(time.Duration(seconds) * time.Second).Format(time.ANSIC)
	api.Highlight(start, end, result, nil)
	return nil
}

func (h *DmesgTimestampHinter) Deactivate(api HintAPI) error {
	api.ClearHighlight()
	return nil
}

func (h *DmesgTimestampHinter) Click(api HintAPI) error {
	return nil
}

func setSysStartTime() {
	sysInfo := &syscall.Sysinfo_t{}
	_ = syscall.Sysinfo(sysInfo)
	sysStart = time.Now().Local().Add(time.Duration(int(sysInfo.Uptime*-1)) * time.Second)
}
