package debug

import (
	"encoding/binary"
	"fmt"

	visedb "git.defalsify.org/vise.git/db"
	storedb "git.grassecon.net/grassrootseconomics/sarafu-vise/store/db"
)

var (
	dbTypStr map[storedb.DataTyp]string = make(map[storedb.DataTyp]string)
)

type KeyInfo struct {
	SessionId   string
	Typ         uint8
	SubTyp      storedb.DataTyp
	Label       string
	Description string
}

func (k KeyInfo) String() string {
	v := uint16(k.SubTyp)
	s := subTypToString(k.SubTyp)
	if s == "" {
		v = uint16(k.Typ)
		s = typToString(k.Typ)
	}
	return fmt.Sprintf("Session Id: %s\nTyp: %s (%d)\n", k.SessionId, s, v)
}

func ToKeyInfo(k []byte, sessionId string) (KeyInfo, error) {
	o := KeyInfo{}

	o.SessionId = sessionId
	o.Typ = uint8(k[0])
	k = k[1:]

	if o.Typ == visedb.DATATYPE_USERDATA {
		if len(k) == 0 {
			return o, fmt.Errorf("missing subtype key")
		}
		v := binary.BigEndian.Uint16(k[:2])
		o.SubTyp = storedb.DataTyp(v)
		o.Label = subTypToString(o.SubTyp)
		k = k[2:]
		if len(k) != 0 {
			return o, fmt.Errorf("excess key information: %x", k)
		}
	} else {
		o.Label = typToString(o.Typ)
		k = k[2:]
	}

	return o, nil
}

func subTypToString(v storedb.DataTyp) string {
	return dbTypStr[v+visedb.DATATYPE_USERDATA+1]
}

func typToString(v uint8) string {
	return dbTypStr[storedb.DataTyp(uint16(v))]
}