using ModernUO.Serialization;

namespace Server.Items;

[SerializationGenerator(0, false)]
public partial class AncientFarmersKasa : Kasa
{
    [Constructible]
    public AncientFarmersKasa()
    {
        Attributes.BonusStr = 5;
        Attributes.BonusStam = 5;
        Attributes.RegenStam = 5;

        SkillBonuses.SetValues(0, SkillName.AnimalLore, 5.0);
    }

    public override int LabelNumber => 1070922; // Ancient Farmer's Kasa
    public override int BaseColdResistance => 19;

    public override int InitMinHits => 255;
    public override int InitMaxHits => 255;
}

[SerializationGenerator(0, false)]
public partial class AncientSamuraiDo : PlateDo
{
    [Constructible]
    public AncientSamuraiDo()
    {
        ArmorAttributes.LowerStatReq = 100;
        ArmorAttributes.MageArmor = 1;
        SkillBonuses.SetValues(0, SkillName.Parry, 10.0);
    }

    public override int LabelNumber => 1070926; // Ancient Samurai Do

    public override int BasePhysicalResistance => 15;
    public override int BaseFireResistance => 12;
    public override int BaseColdResistance => 10;
    public override int BasePoisonResistance => 11;
    public override int BaseEnergyResistance => 8;

    public override int InitMinHits => 255;
    public override int InitMaxHits => 255;
}

[SerializationGenerator(0, false)]
public partial class ArmsOfTacticalExcellence : LeatherHiroSode
{
    [Constructible]
    public ArmsOfTacticalExcellence()
    {
        Attributes.BonusDex = 5;
        SkillBonuses.SetValues(0, SkillName.Tactics, 12.0);
    }

    public override int LabelNumber => 1070921; // Arms of Tactical Excellence

    public override int BaseFireResistance => 9;
    public override int BaseColdResistance => 13;
    public override int BasePoisonResistance => 8;

    public override int InitMinHits => 255;
    public override int InitMaxHits => 255;
}

[SerializationGenerator(0, false)]
public partial class BlackLotusHood : ClothNinjaHood
{
    [Constructible]
    public BlackLotusHood()
    {
        Attributes.LowerManaCost = 6;
        Attributes.AttackChance = 6;
        ClothingAttributes.SelfRepair = 5;
    }

    public override int LabelNumber => 1070919; // Black Lotus Hood

    public override int BasePhysicalResistance => 0;
    public override int BaseFireResistance => 11;
    public override int BaseColdResistance => 15;
    public override int BasePoisonResistance => 11;
    public override int BaseEnergyResistance => 11;

    public override int InitMinHits => 255;
    public override int InitMaxHits => 255;
}

[SerializationGenerator(0, false)]
public partial class DaimyosHelm : PlateBattleKabuto
{
    [Constructible]
    public DaimyosHelm()
    {
        ArmorAttributes.LowerStatReq = 100;
        ArmorAttributes.MageArmor = 1;
        ArmorAttributes.SelfRepair = 3;
        Attributes.WeaponSpeed = 10;
    }

    public override int LabelNumber => 1070920; // Daimyo's Helm

    public override int BaseColdResistance => 10;

    public override int InitMinHits => 255;
    public override int InitMaxHits => 255;
}

[SerializationGenerator(0, false)]
public partial class DemonForks : Sai
{
    [Constructible]
    public DemonForks()
    {
        WeaponAttributes.ResistFireBonus = 10;
        WeaponAttributes.ResistPoisonBonus = 10;

        Attributes.ReflectPhysical = 10;
        Attributes.WeaponDamage = 35;
        Attributes.DefendChance = 10;
    }

    public override int LabelNumber => 1070917; // Demon Forks

    public override int InitMinHits => 255;
    public override int InitMaxHits => 255;
}

[SerializationGenerator(0, false)]
public partial class DragonNunchaku : Nunchaku
{
    [Constructible]
    public DragonNunchaku()
    {
        WeaponAttributes.ResistFireBonus = 5;
        WeaponAttributes.SelfRepair = 3;
        WeaponAttributes.HitFireball = 50;

        Attributes.WeaponDamage = 40;
        Attributes.WeaponSpeed = 20;
    }

    public override int LabelNumber => 1070914; // Dragon Nunchaku

    public override int InitMinHits => 255;
    public override int InitMaxHits => 255;
}

[SerializationGenerator(0, false)]
public partial class Exiler : Tetsubo
{
    [Constructible]
    public Exiler()
    {
        WeaponAttributes.HitDispel = 33;
        Slayer = SlayerName.Exorcism;

        Attributes.WeaponDamage = 40;
        Attributes.WeaponSpeed = 20;
    }

    public override int LabelNumber => 1070913; // Exiler

    public override int InitMinHits => 255;
    public override int InitMaxHits => 255;

    public override void GetDamageTypes(
        Mobile wielder, out int phys, out int fire, out int cold, out int pois,
        out int nrgy, out int chaos, out int direct
    )
    {
        phys = fire = cold = pois = chaos = direct = 0;

        nrgy = 100;
    }
}

[SerializationGenerator(0, false)]
public partial class GlovesOfTheSun : LeatherNinjaMitts
{
    [Constructible]
    public GlovesOfTheSun()
    {
        Attributes.RegenHits = 2;
        Attributes.NightSight = 1;
        Attributes.LowerManaCost = 5;
        Attributes.LowerRegCost = 18;
    }

    public override int LabelNumber => 1070924; // Gloves of the Sun

    public override int BaseFireResistance => 24;

    public override int InitMinHits => 255;
    public override int InitMaxHits => 255;
}

[SerializationGenerator(0, false)]
public partial class HanzosBow : Yumi
{
    [Constructible]
    public HanzosBow()
    {
        WeaponAttributes.HitLeechHits = 40;
        WeaponAttributes.SelfRepair = 3;

        Attributes.WeaponDamage = 50;

        SkillBonuses.SetValues(0, SkillName.Ninjitsu, 10);
    }

    public override int LabelNumber => 1070918; // Hanzo's Bow

    public override int InitMinHits => 255;
    public override int InitMaxHits => 255;
}

[SerializationGenerator(0, false)]
public partial class LegsOfStability : PlateSuneate
{
    [Constructible]
    public LegsOfStability()
    {
        Attributes.BonusStam = 5;

        ArmorAttributes.SelfRepair = 3;
        ArmorAttributes.LowerStatReq = 100;
        ArmorAttributes.MageArmor = 1;
    }

    public override int LabelNumber => 1070925; // Legs of Stability

    public override int BasePhysicalResistance => 20;
    public override int BasePoisonResistance => 18;

    public override int InitMinHits => 255;
    public override int InitMaxHits => 255;
}

[SerializationGenerator(0, false)]
public partial class PeasantsBokuto : Bokuto
{
    [Constructible]
    public PeasantsBokuto()
    {
        WeaponAttributes.SelfRepair = 3;
        WeaponAttributes.HitLowerDefend = 30;

        Attributes.WeaponDamage = 35;
        Attributes.WeaponSpeed = 10;
        Slayer = SlayerName.SnakesBane;
    }

    public override int LabelNumber => 1070912; // Peasant's Bokuto

    public override int InitMinHits => 255;
    public override int InitMaxHits => 255;
}

[SerializationGenerator(0, false)]
public partial class PilferedDancerFans : Tessen
{
    [Constructible]
    public PilferedDancerFans()
    {
        Attributes.WeaponDamage = 20;
        Attributes.WeaponSpeed = 20;
        Attributes.CastRecovery = 2;
        Attributes.DefendChance = 5;
        Attributes.SpellChanneling = 1;
    }

    public override int LabelNumber => 1070916; // Pilfered Dancer Fans

    public override int InitMinHits => 255;
    public override int InitMaxHits => 255;
}

[SerializationGenerator(0, false)]
public partial class TheDestroyer : NoDachi
{
    [Constructible]
    public TheDestroyer()
    {
        WeaponAttributes.HitLeechStam = 40;

        Attributes.BonusStr = 6;
        Attributes.AttackChance = 10;
        Attributes.WeaponDamage = 50;
    }

    public override int LabelNumber => 1070915; // The Destroyer

    public override int InitMinHits => 255;
    public override int InitMaxHits => 255;
}

[SerializationGenerator(0, false)]
public partial class TomeOfEnlightenment : Spellbook
{
    [Constructible]
    public TomeOfEnlightenment()
    {
        LootType = LootType.Regular;
        Hue = 0x455;

        Attributes.BonusInt = 5;
        Attributes.SpellDamage = 10;
        Attributes.CastSpeed = 1;
    }

    public override int LabelNumber => 1070934; // Tome of Enlightenment
}

[SerializationGenerator(0, false)]
public partial class LeurociansMempoOfFortune : LeatherMempo
{
    [Constructible]
    public LeurociansMempoOfFortune()
    {
        LootType = LootType.Regular;
        Hue = 0x501;

        Attributes.Luck = 300;
        Attributes.RegenMana = 1;
    }

    public override int LabelNumber => 1071460; // Leurocian's mempo of fortune

    public override int BasePhysicalResistance => 15;
    public override int BaseFireResistance => 10;
    public override int BaseColdResistance => 10;
    public override int BasePoisonResistance => 10;
    public override int BaseEnergyResistance => 15;
    public override int InitMinHits => 255;
    public override int InitMaxHits => 255;
}

// Non weapon/armor ones:

[SerializationGenerator(0, false)]
public partial class AncientUrn : Item
{
    [InvalidateProperties]
    [SerializableField(0)]
    [SerializedCommandProperty(AccessLevel.GameMaster)]
    private string _urnName;

    [Constructible]
    public AncientUrn() : this(Names.RandomElement())
    {
    }

    [Constructible]
    public AncientUrn(string urnName) : base(0x241D) => _urnName = urnName;

    public override double DefaultWeight => 1.0;

    public static string[] Names { get; } =
    {
        "Akira",
        "Avaniaga",
        "Aya",
        "Chie",
        "Emiko",
        "Fumiyo",
        "Gennai",
        "Gennosuke",
        "Genjo",
        "Hamato",
        "Harumi",
        "Ikuyo",
        "Juri",
        "Kaori",
        "Kaoru",
        "Kiyomori",
        "Mayako",
        "Motoki",
        "Musashi",
        "Nami",
        "Nobukazu",
        "Roku",
        "Romi",
        "Ryo",
        "Sanzo",
        "Sakamae",
        "Satoshi",
        "Takamori",
        "Takuro",
        "Teruyo",
        "Toshiro",
        "Yago",
        "Yeijiro",
        "Yoshi",
        "Zeshin"
    };

    public override int LabelNumber => 1071014; // Ancient Urn

    [AfterDeserialization]
    private void AfterDeserialization()
    {
        Utility.Intern(ref _urnName);
    }

    public override void AddNameProperty(IPropertyList list)
    {
        list.Add(1070935, _urnName); // Ancient Urn of ~1_name~
    }

    public override void OnSingleClick(Mobile from)
    {
        LabelTo(from, 1070935, _urnName); // Ancient Urn of ~1_name~
    }
}

[SerializationGenerator(0, false)]
public partial class HonorableSwords : Item
{
    [InvalidateProperties]
    [SerializableField(0)]
    [SerializedCommandProperty(AccessLevel.GameMaster)]
    private string _swordsName;

    [Constructible]
    public HonorableSwords() : this(AncientUrn.Names.RandomElement())
    {
    }

    [Constructible]
    public HonorableSwords(string swordsName) : base(0x2853) => _swordsName = swordsName;

    public override double DefaultWeight => 5.0;

    public override int LabelNumber => 1071015; // Honorable Swords

    public override void AddNameProperty(IPropertyList list)
    {
        list.Add(1070936, _swordsName); // Honorable Swords of ~1_name~
    }

    public override void OnSingleClick(Mobile from)
    {
        LabelTo(from, 1070936, _swordsName); // Honorable Swords of ~1_name~
    }

    [AfterDeserialization]
    private void AfterDeserialization()
    {
        Utility.Intern(ref _swordsName);
    }
}

[Furniture]
[Flippable(0x2811, 0x2812)]
[SerializationGenerator(0, false)]
public partial class ChestOfHeirlooms : LockableContainer
{
    [Constructible]
    public ChestOfHeirlooms() : base(0x2811)
    {
        Locked = true;
        LockLevel = 95;
        MaxLockLevel = 140;
        RequiredSkill = 95;

        TrapType = TrapType.ExplosionTrap;
        TrapLevel = 10;
        TrapPower = 100;

        GumpID = 0x10B;

        for (var i = 0; i < 10; ++i)
        {
            var item = Loot.RandomChestOfHeirloomsContent();

            var attributeCount = Utility.RandomMinMax(1, 5);
            var min = 20;
            var max = 80;

            if (item is BaseWeapon weapon)
            {
                if (Core.AOS)
                {
                    BaseRunicTool.ApplyAttributesTo(weapon, attributeCount, min, max);
                }
                else
                {
                    weapon.DamageLevel = (WeaponDamageLevel)Utility.Random(6);
                    weapon.AccuracyLevel = (WeaponAccuracyLevel)Utility.Random(6);
                    weapon.DurabilityLevel = (WeaponDurabilityLevel)Utility.Random(6);
                }
            }
            else if (item is BaseArmor armor)
            {
                if (Core.AOS)
                {
                    BaseRunicTool.ApplyAttributesTo(armor, attributeCount, min, max);
                }
                else
                {
                    armor.ProtectionLevel = (ArmorProtectionLevel)Utility.Random(6);
                    armor.Durability = (ArmorDurabilityLevel)Utility.Random(6);
                }
            }
            else if (Core.AOS)
            {
                if (item is BaseHat hat)
                {
                    BaseRunicTool.ApplyAttributesTo(hat, attributeCount, min, max);
                }
                else if (item is BaseJewel jewel)
                {
                    BaseRunicTool.ApplyAttributesTo(jewel, attributeCount, min, max);
                }
            }

            DropItem(item);
        }
    }

    public override int LabelNumber => 1070937; // Chest of heirlooms
}

[SerializationGenerator(0, false)]
public partial class FluteOfRenewal : BambooFlute
{
    [Constructible]
    public FluteOfRenewal()
    {
        // -1 to exclude Fey slayer.  Try to confirm no fey slayer on this on OSI
        Slayer = SlayerGroup.Groups[Utility.Random(SlayerGroup.Groups.Length - 1)].Super.Name;

        ReplenishesCharges = true;
    }

    public override int LabelNumber => 1070927; // Flute of Renewal

    public override int InitMinUses => 300;
    public override int InitMaxUses => 300;
}

public enum LesserPigmentType
{
    None,
    PaleOrange,
    FreshRose,
    ChaosBlue,
    Silver,
    NobleGold,
    LightGreen,
    PaleBlue,
    FreshPlum,
    DeepBrown,
    BurntBrown
}

[SerializationGenerator(0, false)]
public partial class LesserPigmentsOfTokuno : BasePigmentsOfTokuno
{
    private static readonly int[][] _table =
    {
        // Hue, Label
        new[]
        {
            /*PigmentType.None,*/ 0, -1
        },
        new[]
        {
            /*PigmentType.PaleOrange,*/ 0x02E, 1071458
        },
        new[]
        {
            /*PigmentType.FreshRose,*/ 0x4B9, 1071455
        },
        new[]
        {
            /*PigmentType.ChaosBlue,*/ 0x005, 1071459
        },
        new[]
        {
            /*PigmentType.Silver,*/ 0x3E9, 1071451
        },
        new[]
        {
            /*PigmentType.NobleGold,*/ 0x227, 1071457
        },
        new[]
        {
            /*PigmentType.LightGreen,*/ 0x1C8, 1071454
        },
        new[]
        {
            /*PigmentType.PaleBlue,*/ 0x24F, 1071456
        },
        new[]
        {
            /*PigmentType.FreshPlum,*/ 0x145, 1071450
        },
        new[]
        {
            /*PigmentType.DeepBrown,*/ 0x3F0, 1071452
        },
        new[]
        {
            /*PigmentType.BurntBrown,*/ 0x41A, 1071453
        }
    };

    [Constructible]
    public LesserPigmentsOfTokuno() : this((LesserPigmentType)Utility.Random(0, 11))
    {
    }

    [Constructible]
    public LesserPigmentsOfTokuno(LesserPigmentType type) : base(1) => Type = type;

    [SerializableProperty(0)]
    [CommandProperty(AccessLevel.GameMaster)]
    public LesserPigmentType Type
    {
        get => _type;
        set
        {
            _type = value;

            var v = (int)_type;

            if (v >= 0 && v < _table.Length)
            {
                Hue = _table[v][0];
                Label = _table[v][1];
            }
            else
            {
                Hue = 0;
                Label = -1;
            }
        }
    }

    public static int[] GetInfo(LesserPigmentType type)
    {
        var v = (int)type;

        if (v < 0 || v >= _table.Length)
        {
            v = 0;
        }

        return _table[v];
    }
}

[SerializationGenerator(0, false)]
public partial class MetalPigmentsOfTokuno : BasePigmentsOfTokuno
{
    [Constructible]
    public MetalPigmentsOfTokuno() : base(1)
    {
        RandomHue();
        Label = -1;
    }

    public void RandomHue()
    {
        var a = Utility.Random(0, 30);
        if (a != 0)
        {
            Hue = a + 0x960;
        }
        else
        {
            Hue = 0;
        }
    }
}
