using System.Runtime.CompilerServices;

namespace Server.Factions;

public enum MerchantTitle
{
    None,
    Scribe,
    Carpenter,
    Blacksmith,
    Bowyer,
    Tailor
}

public class MerchantTitleInfo
{
    public MerchantTitleInfo(
        SkillName skill, double requirement, TextDefinition title, TextDefinition label,
        TextDefinition assigned
    )
    {
        Skill = skill;
        Requirement = requirement;
        Title = title;
        Label = label;
        Assigned = assigned;
    }

    public SkillName Skill { get; }

    public double Requirement { get; }

    public TextDefinition Title { get; }

    public TextDefinition Label { get; }

    public TextDefinition Assigned { get; }
}

public static class MerchantTitles
{
    public static MerchantTitleInfo[] Info { get; } =
    [
        new MerchantTitleInfo(
            SkillName.Inscribe,
            90.0,
            1060773, // Scribe
            1011468, // SCRIBE
            1010121  // You now have the faction title of scribe
        ),
        new MerchantTitleInfo(
            SkillName.Carpentry,
            90.0,
            1060774, // Carpenter
            1011469, // CARPENTER
            1010122  // You now have the faction title of carpenter
        ),
        new MerchantTitleInfo(
            SkillName.Tinkering,
            90.0,
            1022984, // Tinker
            1011470, // TINKER
            1010123  // You now have the faction title of tinker
        ),
        new MerchantTitleInfo(
            SkillName.Blacksmith,
            90.0,
            1023016, // Blacksmith
            1011471, // BLACKSMITH
            1010124  // You now have the faction title of blacksmith
        ),
        new MerchantTitleInfo(
            SkillName.Fletching,
            90.0,
            1023022, // Bowyer
            1011472, // BOWYER
            1010125  // You now have the faction title of Bowyer
        ),
        new MerchantTitleInfo(
            SkillName.Tailoring,
            90.0,
            1022982, // Tailor
            1018300, // TAILOR
            1042162  // You now have the faction title of Tailor
        )
    ];

    public static MerchantTitleInfo GetInfo(MerchantTitle title)
    {
        var idx = (int)title - 1;

        if (idx >= 0 && idx < Info.Length)
        {
            return Info[idx];
        }

        return null;
    }

    public static bool HasMerchantQualifications(Mobile mob)
    {
        for (var i = 0; i < Info.Length; ++i)
        {
            if (IsQualified(mob, Info[i]))
            {
                return true;
            }
        }

        return false;
    }

    [MethodImpl(MethodImplOptions.AggressiveInlining)]
    public static bool IsQualified(Mobile mob, MerchantTitle title) => IsQualified(mob, GetInfo(title));

    [MethodImpl(MethodImplOptions.AggressiveInlining)]
    public static bool IsQualified(Mobile mob, MerchantTitleInfo info) => mob?.Skills[info.Skill].Value >= info?.Requirement;
}
