package model

import "time"

// Achievement defines a static achievement template.
type Achievement struct {
	ID             string `json:"id"`
	Title          string `json:"title"`
	Description    string `json:"description"`
	ConditionType  string `json:"conditionType"`  // level, kills, gold, elite_kills, loot_legendary, kills_no_death
	ConditionValue int    `json:"conditionValue"`
	RewardType     string `json:"rewardType"`  // gold, potion, title
	RewardAmount   int    `json:"rewardAmount"`
}

// HeroAchievement records that a hero has unlocked an achievement.
type HeroAchievement struct {
	HeroID        int64        `json:"heroId"`
	AchievementID string       `json:"achievementId"`
	UnlockedAt    time.Time    `json:"unlockedAt"`
	Achievement   *Achievement `json:"achievement,omitempty"`
}

// AchievementView is the response struct combining an achievement definition
// with unlock status for a specific hero.
type AchievementView struct {
	Achievement
	Unlocked   bool       `json:"unlocked"`
	UnlockedAt *time.Time `json:"unlockedAt,omitempty"`
}

// CheckAchievementCondition returns true if the hero's stats satisfy the
// achievement's unlock condition.
func CheckAchievementCondition(a *Achievement, hero *Hero) bool {
	switch a.ConditionType {
	case "level":
		return hero.Level >= a.ConditionValue
	case "kills":
		return hero.TotalKills >= a.ConditionValue
	case "gold":
		return hero.Gold >= int64(a.ConditionValue)
	case "elite_kills":
		return hero.EliteKills >= a.ConditionValue
	case "loot_legendary":
		return hero.LegendaryDrops >= a.ConditionValue
	case "kills_no_death":
		return hero.KillsSinceDeath >= a.ConditionValue
	default:
		return false
	}
}
