use std::fmt::Display;

use num_enum::FromPrimitive;

#[derive(Debug, PartialEq, Eq, Clone, Copy, FromPrimitive)]
#[repr(u32)]
pub enum ESceneType {
    #[default]
    Unknown = 0,
    Hall = 1,
    Hollow = 2,
    Fight = 3,
    Fresh = 4,
    MultiFight = 5,
}

#[derive(Debug, Default, PartialEq, Eq, Clone, Copy, FromPrimitive)]
#[repr(u32)]
pub enum ESystem {
    #[default]
    None = 0xFFFFFFFF,
    VhsStore = 7,
    Gacha = 21,
    Hadal = 43,
    MonsterCard = 40,
    AbyssCollect = 45,
    Vhs = 1,
    ActivityPv = 48,
    StoryModeSwitch = 12,
    RamenStore = 8,
    QteSwitch = 13,
    DoubleElite = 36,
    LandRevive = 35,
    HadalShop = 47,
    Role = 2,
    Grocery = 10,
    AvatarBase = 33,
    Activity = 27,
    BuddyInstall = 26,
    AvatarEquip = 34,
    TartarusHounds = 20,
    BossBig = 38,
    Buddy = 25,
    Interknot = 6,
    Workbench = 9,
    HIA = 39,
    Smithy = 3,
    Trash = 23,
    UseStoryMode = 15,
    Photowall = 44,
    AbyssShop = 46,
    AbyssHeat = 29,
    DailyQuest = 41,
    Newsstand = 17,
    Cafe = 22,
    Rally = 42,
    HollowQuest = 0,
    Package = 4,
    VideoShop = 11,
    BattleDaily = 24,
    Arcade = 19,
    BossSmall = 37,
    LineupSelect = 14,
    ArcadeRoom = 30,
    Teleport = 5,
    Train = 32,
    UseManualQteMode = 16,
    ArcadeGame = 31,
    Abyss = 28,
    Toy = 18,
}

#[derive(Default, Debug, Clone, Copy, FromPrimitive)]
#[repr(u32)]
pub enum EOperator {
    Enter = 0,
    Log = 1,
    Leave = 2,
    #[default]
    Undefined = 0xFFFFFFFF,
}

#[derive(Debug, Clone, Copy)]
#[repr(u32)]
pub enum TimePeriodType {
    Morning = 0,
    Evening = 1,
    Night = 2,
}

impl Display for TimePeriodType {
    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
        std::fmt::Debug::fmt(self, f)
    }
}

#[derive(Default, Debug, Clone, Copy)]
#[repr(u32)]
pub enum WeatherType {
    SunShine = 0,
    Fog = 1,
    Cloudy = 2,
    Rain = 3,
    Thunder = 4,
    ThickFog = 5,
    ThickCloudy = 6,
    #[default]
    None = 0xFFFFFFFF,
}

impl Display for WeatherType {
    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
        std::fmt::Debug::fmt(self, f)
    }
}

#[allow(dead_code)]
#[derive(Debug, Clone, Copy)]
#[repr(u32)]
pub enum ENPCInteraction {
    OnStart = 0,
    OnEnd = 1,
    OnInteract = 2,
    OnAddInteract = 3,
    OnRemoveInteract = 4,
}

impl Display for ENPCInteraction {
    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
        std::fmt::Debug::fmt(self, f)
    }
}

#[derive(Default, Debug, Clone, Copy)]
pub enum ELocalPlayType {
    TrainingRoom = 290,
    BigBossBattle = 211,
    BossLittleBattleLongfight = 215,
    PureHollowBattle = 280,
    DualElite = 208,
    PureHollowBattleHardmode = 282,
    OperationBetaDemo = 216,
    AvatarDemoTrial = 213,
    BossRushBattle = 218,
    BossBattle = 210,
    GuideSpecial = 203,
    DailyChallenge = 206,
    OperationTeamCoop = 219,
    TrainingRoomFight = 291,
    LevelZero = 205,
    ArchiveLongFight = 212,
    MpBigBossBattle = 214,
    RallyLongFight = 207,
    BigBossBattleLongfight = 217,
    ArchiveBattle = 201,
    PureHollowBattleLonghfight = 281,
    HadalZone = 209,
    ChessBoardBattle = 202,
    #[default]
    Unknown = 0,
}
