package player

import "time"

// State tracks an in-world player entity managed by the zone goroutine.
type State struct {
	ID          string
	CharacterID int
	AccountID   int
	Name        string
	Race        string
	X           int
	Y           int
	HP          int
	MaxHP       int
	Mana        int
	MaxMana     int
	Fatigue     int
	MaxFatigue  int
	Strength    int
	Dexterity   int
	Agility     int
	Intelligence int
	Spirit      int
	InCombat    bool
	LastCombat  time.Time
	LastAction  time.Time
	Conn        BroadcastFunc
}

type BroadcastFunc func(msgType string, payload map[string]any)

func New(characterID, accountID, x, y int) *State {
	return &State{
		ID:          fmtID(characterID),
		CharacterID: characterID,
		AccountID:   accountID,
		X:           x,
		Y:           y,
		Strength:    10,
		Dexterity:   10,
		Agility:     10,
		Intelligence: 10,
		Spirit:      10,
		HP:          100,
		MaxHP:       100,
		Mana:        50,
		MaxMana:     50,
		Fatigue:     100,
		MaxFatigue:  100,
		LastAction:  time.Now(),
	}
}

func fmtID(characterID int) string {
	return "player:" + itoa(characterID)
}

func itoa(n int) string {
	if n == 0 {
		return "0"
	}
	neg := n < 0
	if neg {
		n = -n
	}
	var buf [20]byte
	i := len(buf)
	for n > 0 {
		i--
		buf[i] = byte('0' + n%10)
		n /= 10
	}
	if neg {
		i--
		buf[i] = '-'
	}
	return string(buf[i:])
}
