namespace DolCon.Models;

using Enums;

public record LocationType(
    string Type,
    Rarity Rarity,
    Rarity MaxRarity,
    int? Biome,
    bool IsBurgLocation,
    LocationSize Size,
    bool AllowMultiple,
    bool NeedsPort,
    bool NeedsCitadel,
    bool NeedsPlaza,
    bool NeedsShanty,
    bool NeedsTemple,
    bool NeedsWalls,
    bool NeedsCityOfLight,
    bool isWild,
    string[] Goods,
    ServiceType[] Services
);

public static class LocationTypes
{
    public static List<LocationType> Types { get; } = new()
    {
        new LocationType(
            "abandoned mine",
            Rarity.Uncommon,
            Rarity.Uncommon,
            null,
            false,
            LocationSize.medium,
            false,
            false,
            false,
            false,
            false,
            false,
            false,
            false,
            true,
            Array.Empty<string>(),
            Array.Empty<ServiceType>()
        ),
        new LocationType(
            "abandoned temple",
            Rarity.Rare,
            Rarity.Rare,
            null,
            false,
            LocationSize.small,
            false,
            false,
            false,
            false,
            false,
            false,
            false,
            false,
            true,
            Array.Empty<string>(),
            Array.Empty<ServiceType>()
        ),
        new LocationType(
            "abandoned wizard tower",
            Rarity.Epic,
            Rarity.Epic,
            null,
            false,
            LocationSize.medium,
            false,
            false,
            false,
            false,
            false,
            false,
            false,
            false,
            true,
            Array.Empty<string>(),
            Array.Empty<ServiceType>()
        ),
        new LocationType(
            "ancient battlefield",
            Rarity.Epic,
            Rarity.Epic,
            null,
            false,
            LocationSize.medium,
            false,
            false,
            false,
            false,
            false,
            false,
            false,
            false,
            true,
            Array.Empty<string>(),
            Array.Empty<ServiceType>()
        ),
        new LocationType(
            "ruins",
            Rarity.Uncommon,
            Rarity.Uncommon,
            null,
            false,
            LocationSize.medium,
            false,
            false,
            false,
            false,
            false,
            false,
            false,
            false,
            true,
            Array.Empty<string>(),
            Array.Empty<ServiceType>()
        ),
        new LocationType(
            "ancient tomb",
            Rarity.Rare,
            Rarity.Rare,
            null,
            false,
            LocationSize.medium,
            false,
            false,
            false,
            false,
            false,
            false,
            false,
            false,
            true,
            Array.Empty<string>(),
            Array.Empty<ServiceType>()
        ),
        new LocationType(
            "arena",
            Rarity.Uncommon,
            Rarity.Uncommon,
            null,
            true,
            LocationSize.unexplorable,
            false,
            false,
            false,
            true,
            false,
            false,
            false,
            false,
            false,
            Array.Empty<string>(),
            new[] { ServiceType.Combat, ServiceType.Entertainment }
        ),
        new LocationType(
            "armory",
            Rarity.Uncommon,
            Rarity.Epic,
            null,
            true,
            LocationSize.unexplorable,
            true,
            false,
            false,
            false,
            false,
            false,
            false,
            false,
            false,
            new[]
            {
                "Light Armor",
                "Medium Armor",
                "Heavy Armor",
                "Shield",
                "Simple Melee Weapon",
                "Martial Melee Weapon",
                "Martial Ranged Weapon",
                "Simple Ranged Weapon",
            },
            new[] { ServiceType.Repair }
        ),
        new LocationType(
            "bandit camp",
            Rarity.Rare,
            Rarity.Rare,
            null,
            false,
            LocationSize.small,
            false,
            false,
            false,
            false,
            false,
            false,
            false,
            false,
            false,
            Array.Empty<string>(),
            Array.Empty<ServiceType>()
        ),
        new LocationType(
            "tavern",
            Rarity.Common,
            Rarity.Rare,
            null,
            true,
            LocationSize.unexplorable,
            true,
            false,
            false,
            false,
            false,
            false,
            false,
            false,
            false,
            new[]
            {
                "Snack",
                "Meal",
                "Spirits"
            },
            new[] { ServiceType.Drinks, ServiceType.Food }
        ),
        new LocationType(
            "blacksmith",
            Rarity.Uncommon,
            Rarity.Legendary,
            null,
            true,
            LocationSize.unexplorable,
            true,
            false,
            false,
            false,
            false,
            false,
            false,
            false,
            false,
            Array.Empty<string>(),
            new[] { ServiceType.Repair, ServiceType.Upgrade }
        ),
        new LocationType(
            "manor",
            Rarity.Rare,
            Rarity.Rare,
            null,
            true,
            LocationSize.small,
            false,
            false,
            true,
            false,
            false,
            false,
            false,
            false,
            false,
            Array.Empty<string>(),
            Array.Empty<ServiceType>()
        ),
        new LocationType(
            "castle",
            Rarity.Rare,
            Rarity.Rare,
            null,
            true,
            LocationSize.medium,
            false,
            false,
            true,
            false,
            false,
            false,
            false,
            false,
            false,
            Array.Empty<string>(),
            Array.Empty<ServiceType>()
        ),
        new LocationType(
            "fortress",
            Rarity.Epic,
            Rarity.Epic,
            null,
            true,
            LocationSize.large,
            false,
            false,
            true,
            false,
            false,
            false,
            false,
            false,
            false,
            Array.Empty<string>(),
            Array.Empty<ServiceType>()
        ),
        new LocationType(
            "citadel",
            Rarity.Legendary,
            Rarity.Legendary,
            null,
            true,
            LocationSize.huge,
            false,
            false,
            true,
            false,
            false,
            false,
            false,
            false,
            false,
            Array.Empty<string>(),
            Array.Empty<ServiceType>()
        ),
        new LocationType(
            "cave",
            Rarity.Uncommon,
            Rarity.Uncommon,
            null,
            false,
            LocationSize.large,
            false,
            false,
            false,
            false,
            false,
            false,
            false,
            false,
            true,
            Array.Empty<string>(),
            Array.Empty<ServiceType>()
        ),
        new LocationType(
            "cemetery",
            Rarity.Uncommon,
            Rarity.Uncommon,
            null,
            true,
            LocationSize.medium,
            false,
            false,
            false,
            false,
            false,
            false,
            false,
            false,
            false,
            Array.Empty<string>(),
            Array.Empty<ServiceType>()
        ),
        new LocationType(
            "colosseum",
            Rarity.Epic,
            Rarity.Epic,
            null,
            true,
            LocationSize.unexplorable,
            false,
            false,
            false,
            true,
            false,
            false,
            false,
            false,
            false,
            Array.Empty<string>(),
            new[] { ServiceType.Combat, ServiceType.Entertainment }
        ),
        new LocationType(
            "crypt",
            Rarity.Rare,
            Rarity.Rare,
            null,
            false,
            LocationSize.large,
            false,
            false,
            false,
            false,
            false,
            false,
            false,
            false,
            false,
            Array.Empty<string>(),
            Array.Empty<ServiceType>()
        ),
        new LocationType(
            "dungeon",
            Rarity.Rare,
            Rarity.Rare,
            null,
            true,
            LocationSize.large,
            false,
            false,
            false,
            false,
            true,
            false,
            true,
            false,
            false,
            Array.Empty<string>(),
            Array.Empty<ServiceType>()
        ),
        new LocationType(
            "farm",
            Rarity.Common,
            Rarity.Common,
            null,
            false,
            LocationSize.unexplorable,
            true,
            false,
            false,
            false,
            false,
            false,
            false,
            false,
            false,
            new[]
            {
                "Snack"
            },
            new[] { ServiceType.Food }
        ),
        new LocationType(
            "fort",
            Rarity.Rare,
            Rarity.Rare,
            null,
            false,
            LocationSize.medium,
            false,
            false,
            false,
            false,
            false,
            false,
            false,
            false,
            false,
            Array.Empty<string>(),
            new[] { ServiceType.Food, ServiceType.Combat, ServiceType.Lodging, ServiceType.Repair }
        ),
        new LocationType(
            "garden",
            Rarity.Uncommon,
            Rarity.Rare,
            null,
            true,
            LocationSize.small,
            false,
            false,
            false,
            true,
            false,
            false,
            false,
            false,
            false,
            new[]
            {
                "Snack",
                "Meal"
            },
            new[] { ServiceType.Food }
        ),
        new LocationType(
            "general store",
            Rarity.Common,
            Rarity.Rare,
            null,
            true,
            LocationSize.unexplorable,
            true,
            false,
            false,
            false,
            false,
            false,
            false,
            false,
            false,
            new[]
            {
                "Snack",
                "Light Armor", 
                "Simple Melee Weapon",
                "Simple Ranged Weapon",
                "Adventure Gear",
                "Tools"
            },
            Array.Empty<ServiceType>()
        ),
        new LocationType(
            "inn",
            Rarity.Uncommon,
            Rarity.Epic,
            null,
            true,
            LocationSize.unexplorable,
            true,
            false,
            false,
            false,
            false,
            false,
            false,
            false,
            false,
            new[]
            {
                "Snack",
                "Meal",
                "Spirits"
            },
            new[] { ServiceType.Food, ServiceType.Lodging }
        ),
        new LocationType(
            "library",
            Rarity.Rare,
            Rarity.Legendary,
            null,
            true,
            LocationSize.small,
            false,
            false,
            false,
            false,
            false,
            false,
            false,
            false,
            false,
            Array.Empty<string>(),
            Array.Empty<ServiceType>()
        ),
        new LocationType(
            "mine",
            Rarity.Uncommon,
            Rarity.Uncommon,
            null,
            false,
            LocationSize.large,
            false,
            false,
            false,
            false,
            false,
            false,
            false,
            false,
            false,
            Array.Empty<string>(),
            Array.Empty<ServiceType>()
        ),
        new LocationType(
            "pier",
            Rarity.Common,
            Rarity.Common,
            null,
            true,
            LocationSize.unexplorable,
            false,
            true,
            false,
            false,
            false,
            false,
            false,
            false,
            false,
            Array.Empty<string>(),
            new[] { ServiceType.Ships }
        ),
        new LocationType(
            "dock",
            Rarity.Uncommon,
            Rarity.Uncommon,
            null,
            true,
            LocationSize.unexplorable,
            false,
            true,
            false,
            false,
            false,
            false,
            false,
            false,
            false,
            Array.Empty<string>(),
            new[] { ServiceType.Ships }
        ),
        new LocationType(
            "harbor",
            Rarity.Rare,
            Rarity.Rare,
            null,
            true,
            LocationSize.unexplorable,
            false,
            true,
            false,
            false,
            false,
            false,
            false,
            false,
            false,
            Array.Empty<string>(),
            new[] { ServiceType.Ships }
        ),
        new LocationType(
            "port",
            Rarity.Epic,
            Rarity.Epic,
            null,
            true,
            LocationSize.unexplorable,
            false,
            true,
            false,
            false,
            false,
            false,
            false,
            false,
            false,
            Array.Empty<string>(),
            new[] { ServiceType.Ships }
        ),
        new LocationType(
            "sewer",
            Rarity.Rare,
            Rarity.Rare,
            null,
            true,
            LocationSize.large,
            false,
            false,
            false,
            false,
            false,
            false,
            false,
            false,
            false,
            Array.Empty<string>(),
            Array.Empty<ServiceType>()
        ),
        new LocationType(
            "shrine",
            Rarity.Uncommon,
            Rarity.Uncommon,
            null,
            true,
            LocationSize.unexplorable,
            false,
            false,
            false,
            false,
            false,
            false,
            false,
            false,
            false,
            Array.Empty<string>(),
            new[] { ServiceType.Healing }
        ),
        new LocationType(
            "temple",
            Rarity.Rare,
            Rarity.Rare,
            null,
            true,
            LocationSize.unexplorable,
            false,
            false,
            false,
            false,
            false,
            false,
            false,
            false,
            false,
            Array.Empty<string>(),
            new[] { ServiceType.Healing }
        ),
        new LocationType(
            "basilica",
            Rarity.Epic,
            Rarity.Epic,
            null,
            true,
            LocationSize.unexplorable,
            false,
            false,
            false,
            false,
            false,
            true,
            false,
            false,
            false,
            Array.Empty<string>(),
            new[] { ServiceType.Healing, ServiceType.Lodging }
        ),
        new LocationType(
            "The Citadel of Eternity",
            Rarity.Legendary,
            Rarity.Legendary,
            null,
            true,
            LocationSize.unexplorable,
            false,
            false,
            false,
            false,
            false,
            false,
            false,
            true,
            false,
            Array.Empty<string>(),
            new[] { ServiceType.Healing }
        ),
        new LocationType(
            "The Cave of Life",
            Rarity.Legendary,
            Rarity.Legendary,
            null,
            true,
            LocationSize.unexplorable,
            false,
            false,
            false,
            false,
            false,
            false,
            false,
            true,
            false,
            Array.Empty<string>(),
            Array.Empty<ServiceType>()
        ),
        new LocationType(
            "The Conclave's Tower",
            Rarity.Legendary,
            Rarity.Legendary,
            null,
            true,
            LocationSize.unexplorable,
            false,
            false,
            false,
            false,
            false,
            false,
            false,
            true,
            false,
            Array.Empty<string>(),
            Array.Empty<ServiceType>()
        ),
        new LocationType(
            "The University",
            Rarity.Legendary,
            Rarity.Legendary,
            null,
            true,
            LocationSize.unexplorable,
            false,
            false,
            false,
            false,
            false,
            false,
            false,
            true,
            false,
            Array.Empty<string>(),
            Array.Empty<ServiceType>()
        ),
        new LocationType(
            "The Knight's Barracks",
            Rarity.Legendary,
            Rarity.Legendary,
            null,
            true,
            LocationSize.unexplorable,
            false,
            false,
            false,
            false,
            false,
            false,
            false,
            true,
            false,
            Array.Empty<string>(),
            new[] { ServiceType.Lodging, ServiceType.Food, ServiceType.Combat }
        ),
        new LocationType(
            "The Paladin's Fortress",
            Rarity.Legendary,
            Rarity.Legendary,
            null,
            true,
            LocationSize.unexplorable,
            false,
            false,
            false,
            false,
            false,
            false,
            false,
            true,
            false,
            Array.Empty<string>(),
            new[] { ServiceType.Lodging, ServiceType.Healing, ServiceType.Food, ServiceType.Drinks, ServiceType.Combat }
        ),
        new LocationType(
            "The Paladin's Forge",
            Rarity.Legendary,
            Rarity.Legendary,
            null,
            true,
            LocationSize.unexplorable,
            false,
            false,
            false,
            false,
            false,
            false,
            false,
            true,
            false,
            new[]
            {
                "Light Armor",
                "Medium Armor",
                "Heavy Armor",
                "Shield",
                "Simple Melee Weapon", 
                "Martial Melee Weapon", 
                "Martial Ranged Weapon", 
                "Simple Ranged Weapon"
            },
            new[] { ServiceType.Repair, ServiceType.Upgrade }
        ),
        new LocationType(
            "The Judicator's Court",
            Rarity.Legendary,
            Rarity.Legendary,
            null,
            true,
            LocationSize.unexplorable,
            false,
            false,
            false,
            false,
            false,
            false,
            false,
            true,
            false,
            Array.Empty<string>(),
            Array.Empty<ServiceType>()
        ),
        new LocationType(
            "The Hall of Penitence",
            Rarity.Legendary,
            Rarity.Legendary,
            null,
            true,
            LocationSize.large,
            false,
            false,
            false,
            false,
            false,
            false,
            false,
            true,
            false,
            Array.Empty<string>(),
            Array.Empty<ServiceType>()
        ),
        new LocationType(
            "The Sky Temple",
            Rarity.Legendary,
            Rarity.Legendary,
            null,
            true,
            LocationSize.unexplorable,
            false,
            false,
            false,
            false,
            false,
            false,
            false,
            true,
            false,
            Array.Empty<string>(),
            Array.Empty<ServiceType>()
        ),
        new LocationType(
            "hamlet with a shrine",
            Rarity.Uncommon,
            Rarity.Uncommon,
            null,
            false,
            LocationSize.unexplorable,
            true,
            false,
            false,
            false,
            false,
            false,
            false,
            false,
            false,
            Array.Empty<string>(),
            new[] { ServiceType.Healing }
        ),
        new LocationType(
            "hamlet",
            Rarity.Common,
            Rarity.Common,
            null,
            false,
            LocationSize.unexplorable,
            true,
            false,
            false,
            false,
            false,
            false,
            false,
            false,
            false,
            Array.Empty<string>(),
            Array.Empty<ServiceType>()
        ),
        new LocationType(
            "hamlet with a tavern",
            Rarity.Common,
            Rarity.Common,
            null,
            false,
            LocationSize.unexplorable,
            true,
            false,
            false,
            false,
            false,
            false,
            false,
            false,
            false,
            Array.Empty<string>(),
            new[] { ServiceType.Food, ServiceType.Drinks }
        ),
        new LocationType(
            "roadhouse",
            Rarity.Rare,
            Rarity.Rare,
            null,
            false,
            LocationSize.unexplorable,
            false,
            false,
            false,
            false,
            false,
            false,
            false,
            false,
            false,
            Array.Empty<string>(),
            new[] { ServiceType.Food, ServiceType.Drinks, ServiceType.Lodging }
        )
    };
}
