package game

import (
	"galaxy/calc"
	"strings"

	"github.com/google/uuid"
)

type Relation string

const (
	RelationWar   Relation = "WAR"
	RelationPeace Relation = "PEACE"
)

var (
	relationSet = map[string]Relation{
		strings.ToLower(RelationWar.String()):   RelationWar,
		strings.ToLower(RelationPeace.String()): RelationPeace,
	}
)

type Race struct {
	ID        uuid.UUID      `json:"id"`
	Name      string         `json:"name"`
	TTL       uint           `json:"ttl"`
	Extinct   bool           `json:"extinct"`
	Votes     Float          `json:"votes"`
	VoteFor   uuid.UUID      `json:"voteFor"`
	Relations []RaceRelation `json:"relations"`
	Tech      TechSet        `json:"tech"`
	Sciences  []Science      `json:"science,omitempty"`
	ShipTypes []ShipType     `json:"shipType,omitempty"`
}

func ParseRelation(v string) (Relation, bool) {
	if v, ok := relationSet[strings.ToLower(v)]; ok {
		return v, ok
	}
	return Relation(""), false
}

func (r Relation) String() string {
	return string(r)
}

type RaceRelation struct {
	RaceID   uuid.UUID `json:"raceId"`
	Relation Relation  `json:"relation"`
}

func (r Race) TechLevel(t Tech) float64 {
	return r.Tech.Value(t)
}

func (r Race) FlightDistance() float64 {
	return calc.FligthDistance(r.TechLevel(TechDrive))
}

func (r Race) VisibilityDistance() float64 {
	return calc.VisibilityDistance(r.TechLevel(TechDrive))
}
