using ChatTwo.Resources;
using ChatTwo.Util;

namespace ChatTwo.Code;

internal static class ChatTypeExt {
    internal static readonly (string, ChatType[])[] SortOrder = {
        (Language.Options_Tabs_ChannelTypes_Chat, new[] {
            ChatType.Say,
            ChatType.Yell,
            ChatType.Shout,
            ChatType.TellIncoming,
            ChatType.TellOutgoing,
            ChatType.Party,
            ChatType.CrossParty,
            ChatType.Alliance,
            ChatType.FreeCompany,
            ChatType.PvpTeam,
            ChatType.CrossLinkshell1,
            ChatType.CrossLinkshell2,
            ChatType.CrossLinkshell3,
            ChatType.CrossLinkshell4,
            ChatType.CrossLinkshell5,
            ChatType.CrossLinkshell6,
            ChatType.CrossLinkshell7,
            ChatType.CrossLinkshell8,
            ChatType.Linkshell1,
            ChatType.Linkshell2,
            ChatType.Linkshell3,
            ChatType.Linkshell4,
            ChatType.Linkshell5,
            ChatType.Linkshell6,
            ChatType.Linkshell7,
            ChatType.Linkshell8,
            ChatType.NoviceNetwork,
            ChatType.StandardEmote,
            ChatType.CustomEmote,
        }),
        (Language.Options_Tabs_ChannelTypes_Battle, new[] {
            ChatType.Damage,
            ChatType.Miss,
            ChatType.Action,
            ChatType.Item,
            ChatType.Healing,
            ChatType.GainBuff,
            ChatType.LoseBuff,
            ChatType.GainDebuff,
            ChatType.LoseDebuff,
        }),
        (Language.Options_Tabs_ChannelTypes_Announcements, new[] {
            ChatType.System,
            ChatType.BattleSystem,
            ChatType.GatheringSystem,
            ChatType.Error,
            ChatType.Echo,
            ChatType.NoviceNetworkSystem,
            ChatType.FreeCompanyAnnouncement,
            ChatType.PvpTeamAnnouncement,
            ChatType.FreeCompanyLoginLogout,
            ChatType.PvpTeamLoginLogout,
            ChatType.RetainerSale,
            ChatType.NpcDialogue,
            ChatType.NpcAnnouncement,
            ChatType.LootNotice,
            ChatType.Progress,
            ChatType.LootRoll,
            ChatType.Crafting,
            ChatType.Gathering,
            ChatType.PeriodicRecruitmentNotification,
            ChatType.Sign,
            ChatType.RandomNumber,
            ChatType.Orchestrion,
            ChatType.MessageBook,
            ChatType.Alarm,
        }),
    };

    internal static string Name(this ChatType type) {
        return type switch {
            ChatType.Debug => "Debug",
            ChatType.Urgent => "Urgent",
            ChatType.Notice => "Notice",
            ChatType.Say => "Say",
            ChatType.Shout => "Shout",
            ChatType.TellOutgoing => "Tell (Outgoing)",
            ChatType.TellIncoming => "Tell (Incoming)",
            ChatType.Party => "Party",
            ChatType.Alliance => "Alliance",
            ChatType.Linkshell1 => "Linkshell [1]",
            ChatType.Linkshell2 => "Linkshell [2]",
            ChatType.Linkshell3 => "Linkshell [3]",
            ChatType.Linkshell4 => "Linkshell [4]",
            ChatType.Linkshell5 => "Linkshell [5]",
            ChatType.Linkshell6 => "Linkshell [6]",
            ChatType.Linkshell7 => "Linkshell [7]",
            ChatType.Linkshell8 => "Linkshell [8]",
            ChatType.FreeCompany => "Free Company",
            ChatType.NoviceNetwork => "Novice Network",
            ChatType.CustomEmote => "Custom Emotes",
            ChatType.StandardEmote => "Standard Emotes",
            ChatType.Yell => "Yell",
            ChatType.CrossParty => "Cross-world Party",
            ChatType.PvpTeam => "PvP Team",
            ChatType.CrossLinkshell1 => "Cross-world Linkshell [1]",
            ChatType.Damage => "Damage dealt",
            ChatType.Miss => "Failed attacks",
            ChatType.Action => "Actions used",
            ChatType.Item => "Items used",
            ChatType.Healing => "Healing",
            ChatType.GainBuff => "Beneficial effects granted",
            ChatType.GainDebuff => "Detrimental effects inflicted",
            ChatType.LoseBuff => "Beneficial effects lost",
            ChatType.LoseDebuff => "Detrimental effects cured",
            ChatType.Alarm => "Alarm Notifications",
            ChatType.Echo => "Echo",
            ChatType.System => "System Messages",
            ChatType.BattleSystem => "Battle System Messages",
            ChatType.GatheringSystem => "Gathering System Messages",
            ChatType.Error => "Error Messages",
            ChatType.NpcDialogue => "NPC Dialogue",
            ChatType.LootNotice => "Loot Notices",
            ChatType.Progress => "Progression Messages",
            ChatType.LootRoll => "Loot Messages",
            ChatType.Crafting => "Synthesis Messages",
            ChatType.Gathering => "Gathering Messages",
            ChatType.NpcAnnouncement => "NPC Dialogue (Announcements)",
            ChatType.FreeCompanyAnnouncement => "Free Company Announcements",
            ChatType.FreeCompanyLoginLogout => "Free Company Member Login Notifications",
            ChatType.RetainerSale => "Retainer Sale Notifications",
            ChatType.PeriodicRecruitmentNotification => "Periodic Recruitment Notifications",
            ChatType.Sign => "Sign Messages for PC Targets",
            ChatType.RandomNumber => "Random Number Messages",
            ChatType.NoviceNetworkSystem => "Novice Network Notifications",
            ChatType.Orchestrion => "Current Orchestrion Track Messages",
            ChatType.PvpTeamAnnouncement => "PvP Team Announcements",
            ChatType.PvpTeamLoginLogout => "PvP Team Member Login Notifications",
            ChatType.MessageBook => "Message Book Alert",
            ChatType.GmTell => "Tell (GM)",
            ChatType.GmSay => "Say (GM)",
            ChatType.GmShout => "Shout (GM)",
            ChatType.GmYell => "Yell (GM)",
            ChatType.GmParty => "Party (GM)",
            ChatType.GmFreeCompany => "Free Company (GM)",
            ChatType.GmLinkshell1 => "Linkshell [1] (GM)",
            ChatType.GmLinkshell2 => "Linkshell [2] (GM)",
            ChatType.GmLinkshell3 => "Linkshell [3] (GM)",
            ChatType.GmLinkshell4 => "Linkshell [4] (GM)",
            ChatType.GmLinkshell5 => "Linkshell [5] (GM)",
            ChatType.GmLinkshell6 => "Linkshell [6] (GM)",
            ChatType.GmLinkshell7 => "Linkshell [7] (GM)",
            ChatType.GmLinkshell8 => "Linkshell [8] (GM)",
            ChatType.GmNoviceNetwork => "Novice Network (GM)",
            ChatType.CrossLinkshell2 => "Cross-world Linkshell [2]",
            ChatType.CrossLinkshell3 => "Cross-world Linkshell [3]",
            ChatType.CrossLinkshell4 => "Cross-world Linkshell [4]",
            ChatType.CrossLinkshell5 => "Cross-world Linkshell [5]",
            ChatType.CrossLinkshell6 => "Cross-world Linkshell [6]",
            ChatType.CrossLinkshell7 => "Cross-world Linkshell [7]",
            ChatType.CrossLinkshell8 => "Cross-world Linkshell [8]",
            _ => type.ToString(),
        };
    }

    internal static uint? DefaultColour(this ChatType type) {
        switch (type) {
            case ChatType.Debug:
                return ColourUtil.ComponentsToRgba(204, 204, 204);
            case ChatType.Urgent:
                return ColourUtil.ComponentsToRgba(255, 127, 127);
            case ChatType.Notice:
                return ColourUtil.ComponentsToRgba(179, 140, 255);

            case ChatType.Say:
            case ChatType.GmSay:
                return ColourUtil.ComponentsToRgba(247, 247, 247);
            case ChatType.Shout:
            case ChatType.GmShout:
                return ColourUtil.ComponentsToRgba(255, 166, 102);
            case ChatType.TellIncoming:
            case ChatType.TellOutgoing:
            case ChatType.GmTell:
                return ColourUtil.ComponentsToRgba(255, 184, 222);
            case ChatType.Party:
            case ChatType.CrossParty:
            case ChatType.GmParty:
                return ColourUtil.ComponentsToRgba(102, 229, 255);
            case ChatType.Alliance:
                return ColourUtil.ComponentsToRgba(255, 127, 0);
            case ChatType.NoviceNetwork:
            case ChatType.NoviceNetworkSystem:
            case ChatType.GmNoviceNetwork:
                return ColourUtil.ComponentsToRgba(212, 255, 125);
            case ChatType.Linkshell1:
            case ChatType.Linkshell2:
            case ChatType.Linkshell3:
            case ChatType.Linkshell4:
            case ChatType.Linkshell5:
            case ChatType.Linkshell6:
            case ChatType.Linkshell7:
            case ChatType.Linkshell8:
            case ChatType.CrossLinkshell1:
            case ChatType.CrossLinkshell2:
            case ChatType.CrossLinkshell3:
            case ChatType.CrossLinkshell4:
            case ChatType.CrossLinkshell5:
            case ChatType.CrossLinkshell6:
            case ChatType.CrossLinkshell7:
            case ChatType.CrossLinkshell8:
            case ChatType.GmLinkshell1:
            case ChatType.GmLinkshell2:
            case ChatType.GmLinkshell3:
            case ChatType.GmLinkshell4:
            case ChatType.GmLinkshell5:
            case ChatType.GmLinkshell6:
            case ChatType.GmLinkshell7:
            case ChatType.GmLinkshell8:
                return ColourUtil.ComponentsToRgba(212, 255, 125);
            case ChatType.StandardEmote:
                return ColourUtil.ComponentsToRgba(186, 255, 240);
            case ChatType.CustomEmote:
                return ColourUtil.ComponentsToRgba(186, 255, 240);
            case ChatType.Yell:
            case ChatType.GmYell:
                return ColourUtil.ComponentsToRgba(255, 255, 0);
            case ChatType.Echo:
                return ColourUtil.ComponentsToRgba(204, 204, 204);
            case ChatType.System:
            case ChatType.GatheringSystem:
            case ChatType.PeriodicRecruitmentNotification:
            case ChatType.Orchestrion:
            case ChatType.Alarm:
            case ChatType.RetainerSale:
            case ChatType.Sign:
            case ChatType.MessageBook:
                return ColourUtil.ComponentsToRgba(204, 204, 204);
            case ChatType.NpcAnnouncement:
            case ChatType.NpcDialogue:
                return ColourUtil.ComponentsToRgba(171, 214, 71);
            case ChatType.Error:
                return ColourUtil.ComponentsToRgba(255, 74, 74);
            case ChatType.FreeCompany:
            case ChatType.FreeCompanyAnnouncement:
            case ChatType.FreeCompanyLoginLogout:
            case ChatType.GmFreeCompany:
                return ColourUtil.ComponentsToRgba(171, 219, 229);
            case ChatType.PvpTeam:
                return ColourUtil.ComponentsToRgba(171, 219, 229);
            case ChatType.PvpTeamAnnouncement:
            case ChatType.PvpTeamLoginLogout:
                return ColourUtil.ComponentsToRgba(171, 219, 229);
            case ChatType.Action:
            case ChatType.Item:
            case ChatType.LootNotice:
                return ColourUtil.ComponentsToRgba(255, 255, 176);
            case ChatType.Progress:
                return ColourUtil.ComponentsToRgba(255, 222, 115);
            case ChatType.LootRoll:
            case ChatType.RandomNumber:
                return ColourUtil.ComponentsToRgba(199, 191, 158);
            case ChatType.Crafting:
            case ChatType.Gathering:
                return ColourUtil.ComponentsToRgba(222, 191, 247);
            case ChatType.Damage:
                return ColourUtil.ComponentsToRgba(255, 125, 125);
            case ChatType.Miss:
                return ColourUtil.ComponentsToRgba(204, 204, 204);
            case ChatType.Healing:
                return ColourUtil.ComponentsToRgba(212, 255, 125);
            case ChatType.GainBuff:
            case ChatType.LoseBuff:
                return ColourUtil.ComponentsToRgba(148, 191, 255);
            case ChatType.GainDebuff:
            case ChatType.LoseDebuff:
                return ColourUtil.ComponentsToRgba(255, 138, 196);
            case ChatType.BattleSystem:
                return ColourUtil.ComponentsToRgba(204, 204, 204);
            default:
                return null;
        }
    }

    internal static InputChannel? ToInputChannel(this ChatType type) => type switch {
        ChatType.TellOutgoing => InputChannel.Tell,
        ChatType.Say => InputChannel.Say,
        ChatType.Party => InputChannel.Party,
        ChatType.Alliance => InputChannel.Alliance,
        ChatType.Yell => InputChannel.Yell,
        ChatType.Shout => InputChannel.Shout,
        ChatType.FreeCompany => InputChannel.FreeCompany,
        ChatType.PvpTeam => InputChannel.PvpTeam,
        ChatType.NoviceNetwork => InputChannel.NoviceNetwork,
        ChatType.CrossLinkshell1 => InputChannel.CrossLinkshell1,
        ChatType.CrossLinkshell2 => InputChannel.CrossLinkshell2,
        ChatType.CrossLinkshell3 => InputChannel.CrossLinkshell3,
        ChatType.CrossLinkshell4 => InputChannel.CrossLinkshell4,
        ChatType.CrossLinkshell5 => InputChannel.CrossLinkshell5,
        ChatType.CrossLinkshell6 => InputChannel.CrossLinkshell6,
        ChatType.CrossLinkshell7 => InputChannel.CrossLinkshell7,
        ChatType.CrossLinkshell8 => InputChannel.CrossLinkshell8,
        ChatType.Linkshell1 => InputChannel.Linkshell1,
        ChatType.Linkshell2 => InputChannel.Linkshell2,
        ChatType.Linkshell3 => InputChannel.Linkshell3,
        ChatType.Linkshell4 => InputChannel.Linkshell4,
        ChatType.Linkshell5 => InputChannel.Linkshell5,
        ChatType.Linkshell6 => InputChannel.Linkshell6,
        ChatType.Linkshell7 => InputChannel.Linkshell7,
        ChatType.Linkshell8 => InputChannel.Linkshell8,
        _ => null,
    };

    internal static bool IsGm(this ChatType type) => type switch {
        ChatType.GmTell => true,
        ChatType.GmSay => true,
        ChatType.GmShout => true,
        ChatType.GmYell => true,
        ChatType.GmParty => true,
        ChatType.GmFreeCompany => true,
        ChatType.GmLinkshell1 => true,
        ChatType.GmLinkshell2 => true,
        ChatType.GmLinkshell3 => true,
        ChatType.GmLinkshell4 => true,
        ChatType.GmLinkshell5 => true,
        ChatType.GmLinkshell6 => true,
        ChatType.GmLinkshell7 => true,
        ChatType.GmLinkshell8 => true,
        ChatType.GmNoviceNetwork => true,
        _ => false,
    };

    internal static bool HasSource(this ChatType type) => type switch {
        // Battle
        ChatType.Damage => true,
        ChatType.Miss => true,
        ChatType.Action => true,
        ChatType.Item => true,
        ChatType.Healing => true,
        ChatType.GainBuff => true,
        ChatType.LoseBuff => true,
        ChatType.GainDebuff => true,
        ChatType.LoseDebuff => true,

        // Announcements
        ChatType.Progress => true,
        ChatType.LootRoll => true,
        ChatType.Crafting => true,
        ChatType.Gathering => true,
        _ => false,
    };
}
