namespace Theriapolis.GodotHost.UI;

/// <summary>
/// All 18 skills with display labels, governing ability, and codex
/// flavor descriptions. Entries are keyed by their snake_case JSON id —
/// the same string that appears in <c>class.skill_options</c> and
/// <c>background.skill_proficiencies</c> in <c>Content/Data</c>.
///
/// Labels and ability mapping mirror Theriapolis.Core.Rules.Stats.SkillId;
/// descriptions are ported verbatim from <c>src/data.jsx</c>'s
/// <c>SKILL_DESC</c> table in the React prototype. If the JSON schema
/// gains a description field later, swap to a data-driven lookup.
/// </summary>
public static class SkillsCatalog
{
    public record SkillEntry(string JsonId, string Label, string Ability, string Description);

    public static readonly SkillEntry[] All =
    {
        new("acrobatics",      "Acrobatics",       "DEX",
            "Tumbling, balance, and the kind of footwork that keeps you upright on a coliseum sand-floor or a warren-rope. Body-cunning under pressure."),
        new("animal_handling", "Animal Handling",  "WIS",
            "Reading and steering non-sentient beasts — feral hounds, draft-kine, the wild cousins of your own clade. Calming, herding, riding."),
        new("arcana",          "Arcana",           "INT",
            "Knowledge of the older magics: scent-sorcery, blood-sigil, the half-forgotten rites that pre-date the Covenant of Claws."),
        new("athletics",       "Athletics",        "STR",
            "Raw physical effort. Climbing scaffold, swimming the foul canal, hauling a packmate from the pit, breaking a hold."),
        new("deception",       "Deception",        "CHA",
            "Speaking convincingly past your scent. The art of the false posture, the planted rumor, the answer that is technically true."),
        new("history",         "History",          "INT",
            "The long memory of Theriapolis — the Imperium's fall, the Compact's ratification, which clade owes which other a centuries-old debt."),
        new("insight",         "Insight",          "WIS",
            "Reading another's true posture beneath their words. Catching the off-note in a snarl, the held breath, the lie in a friendly tail."),
        new("intimidation",    "Intimidation",     "CHA",
            "Bared-teeth diplomacy. The threat made plain enough that violence is not required to extract compliance."),
        new("investigation",   "Investigation",    "INT",
            "Methodical search and inference: scene-reading, document-sifting, the patient accumulation of small facts into a verdict."),
        new("medicine",        "Medicine",         "WIS",
            "Field surgery, poultice-craft, knowing which clade tolerates which tincture. Stabilizing the dying without finishing them."),
        new("nature",          "Nature",           "INT",
            "Knowledge of the wild outside the city wall — terrain, weather, plant-lore, and the unsigned beasts that observe no Covenant."),
        new("perception",      "Perception",       "WIS",
            "Awareness through every sense your clade gives you: ear-cock, scent-prickle, the half-glimpsed shape at the edge of vision."),
        new("performance",     "Performance",      "CHA",
            "Holding an audience — coliseum crowd, courtroom gallery, market square. Song, oratory, the body that compels watching."),
        new("persuasion",      "Persuasion",       "CHA",
            "Open-handed argument. The case made on its merits, the appeal to mutual benefit, the patient construction of agreement."),
        new("religion",        "Religion",         "INT",
            "The hymn-cycles of the Cervid liturgy, the Compact's sacred clauses, the small household rites your clade keeps without thinking."),
        new("sleight_of_hand", "Sleight of Hand",  "DEX",
            "Quiet fingers — pickpocketing, palmed coins, the swap performed under another's nose. Useful in markets and courtrooms alike."),
        new("stealth",         "Stealth",          "DEX",
            "Movement unseen and unsmelled. Wind-checking, scent-suppression, the slow weight-shift on a creaking floor."),
        new("survival",        "Survival",         "WIS",
            "Field-craft beyond the wall: tracking, foraging, fire-making, knowing which run-off is safe to drink and which carries the upstream butcher's leavings."),
    };

    public static readonly string[] Abilities = { "STR", "DEX", "CON", "INT", "WIS", "CHA" };

    public static readonly System.Collections.Generic.Dictionary<string, string> AbilityFullName = new()
    {
        { "STR", "Strength"     },
        { "DEX", "Dexterity"    },
        { "CON", "Constitution" },
        { "INT", "Intellect"    },
        { "WIS", "Wisdom"       },
        { "CHA", "Charisma"     },
    };

    public static SkillEntry? Get(string jsonId) =>
        System.Array.Find(All, s => s.JsonId == jsonId);

    public static System.Collections.Generic.IEnumerable<SkillEntry> ByAbility(string ability)
    {
        foreach (var s in All)
            if (s.Ability == ability) yield return s;
    }
}
