namespace Theriapolis.Core.Util;

/// <summary>
/// Simple syllable-based settlement name generator.
/// Names are deterministic from the RNG stream passed in.
/// </summary>
public static class NameGenerator
{
    // Prefixes keyed roughly by biome/region character
    private static readonly string[] ForestPrefixes =
        { "Mill", "Wood", "Ash", "Elm", "Oak", "Dark", "Green", "Birch", "Briar", "Hollow" };
    private static readonly string[] GrasslandPrefixes =
        { "Flat", "Wind", "Broad", "Long", "Wide", "Open", "West", "East", "South", "High" };
    private static readonly string[] MountainPrefixes =
        { "Stone", "Iron", "Crag", "Peak", "High", "Cold", "Hard", "Grey", "Frost", "Ridge" };
    private static readonly string[] CoastPrefixes =
        { "Port", "Bay", "Salt", "Shore", "Wave", "Tide", "Sea", "Gull", "Haven", "Cove" };
    private static readonly string[] IndustrialPrefixes =
        { "Iron", "Coal", "Forge", "Mill", "Steel", "Smoke", "Works", "Rail", "Ash", "Soot" };
    private static readonly string[] DefaultPrefixes =
        { "North", "South", "East", "West", "New", "Old", "Cross", "Red", "Black", "White" };

    private static readonly string[] Roots =
    {
        "haven", "feld", "ford", "bridge", "bury", "ton", "wick", "croft", "moor", "vale",
        "thorpe", "worth", "stead", "gate", "well", "lea", "marsh", "brook", "heath", "down",
        "field", "wood", "ridge", "cliff", "holm", "beck", "burn", "shaw", "thwaite", "garth",
    };

    private static readonly string[] Suffixes =
        { "", "", "", "ville", "ton", "burg", "berg", "port", "ford", "cross", "hall", "keep" };

    /// <summary>
    /// Generate a settlement name from the given RNG and biome character.
    /// The biome parameter is the macro cell's biome type string.
    /// </summary>
    public static string Generate(SeededRng rng, string biomeType)
    {
        var prefixes = biomeType.ToLowerInvariant() switch
        {
            var b when b.Contains("forest")       => ForestPrefixes,
            var b when b.Contains("grassland")    => GrasslandPrefixes,
            var b when b.Contains("mountain")     => MountainPrefixes,
            var b when b.Contains("coast")        => CoastPrefixes,
            var b when b.Contains("industrial")   => IndustrialPrefixes,
            var b when b.Contains("subtropical")  => CoastPrefixes,
            var b when b.Contains("wetland")      => ForestPrefixes,
            _                                     => DefaultPrefixes,
        };

        string prefix = prefixes[rng.NextInt(prefixes.Length)];
        string root   = Roots[rng.NextInt(Roots.Length)];
        string suffix = Suffixes[rng.NextInt(Suffixes.Length)];

        // Avoid awkward concatenations (e.g., "Millmill")
        if (root.StartsWith(prefix.ToLowerInvariant()))
            prefix = DefaultPrefixes[rng.NextInt(DefaultPrefixes.Length)];

        return prefix + root + suffix;
    }
}
