use serde::{Serialize, Deserialize};

#[derive(Debug, Copy, Clone)]
pub enum ItemParseError {
    InvalidToolBytes,
    InvalidToolType,
}

#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq, Serialize, Deserialize, enum_utils::FromStr, derive_more::Display)]
pub enum ToolType {
    Monomate,
    Dimate,
    Trimate,
    Monofluid,
    Difluid,
    Trifluid,
    SolAtomizer,
    MoonAtomizer,
    StarAtomizer,
    Antidote,
    Antiparalysis,
    Telepipe,
    TrapVision,
    ScapeDoll,
    Monogrinder,
    Digrinder,
    Trigrinder,
    PowerMaterial,
    MindMaterial,
    EvadeMaterial,
    HpMaterial,
    TpMaterial,
    DefMaterial,
    LuckMaterial,
    CellOfMag502,
    CellOfMag213,
    PartsOfRobochao,
    HeartOfOpaOpa,
    HeartOfPian,
    HeartOfChao,
    SorcerersRightArm,
    SBeatsArms,
    PArmsArms,
    DelsabersRightArm,
    BringersRightArm,
    DelsabersLeftArm,
    SRedsArms,
    DragonsClaw,
    HildebearsHead,
    HildebluesHead,
    PartsOfBaranz,
    BelrasRightArm,
    GiGuesBody,
    SinowBerillsArms,
    GrassAssassinsArms,
    BoomasRightArm,
    GoboomasRightArm,
    GigoboomasRightArm,
    GalGryphonsWing,
    RappysWing,
    CladdingOfEpsilon,
    DeRolLeShell,
    BerillPhoton,
    ParasiticGeneFlow,
    MagicStoneIritista,
    BlueBlackStone,
    Syncesta,
    MagicWater,
    ParasiticCellTypeD,
    MagicRockHeartKey,
    MagicRockMoola,
    StarAmplifier,
    BookOfHitogata,
    HeartOfChuChu,
    PartsOfEggBlaster,
    HeartOfAngel,
    HeartOfDevil,
    KitOfHamburger,
    PanthersSpirit,
    KitOfMark3,
    KitOfMasterSystem,
    KitOfGenesis,
    KitOfSegaSaturn,
    KitOfDreamcast,
    AmplifierOfResta,
    AmplifierOfAnti,
    AmplifierOfShifta,
    AmplifierOfDeband,
    AmplifierOfFoie,
    AmplifierOfGifoie,
    AmplifierOfRafoie,
    AmplifierOfBarta,
    AmplifierOfGibarta,
    AmplifierOfRabarta,
    AmplifierOfZonde,
    AmplifierOfGizonde,
    AmplifierOfRazonde,
    AmplifierOfRed,
    AmplifierOfBlue,
    AmplifierOfYellow,
    HeartOfKapuKapu,
    PhotonBooster,
    Addslot,
    PhotonDrop,
    PhotonSphere,
    PhotonCrystal,
    SecretTicket,
    PhotonTicket,
    BookOfKatana1,
    BookOfKatana2,
    BookOfKatana3,
    WeaponsBronzeBadge,
    WeaponsSilverBadge,
    WeaponsGoldBadge,
    WeaponsCrystalBadge,
    WeaponsSteelBadge,
    WeaponsAluminumBadge,
    WeaponsLeatherBadge,
    WeaponsBoneBadge,
    LetterOfAppreciation,
    ItemTicket,
    ValentinesChocolate,
    NewYearsCard,
    ChristmasCard,
    BirthdayCard,
    ProofOfSonicTeam,
    SpecialEventTicket,
    FlowerBouquet,
    Cake,
    Accessories,
    MrNakasBusinessCard,
    Present,
    Chocolate,
    Candy,
    Cake2,
    WeaponsSilverBadge2,
    WeaponsGoldBadge2,
    WeaponsCrystalBadge2,
    WeaponsSteelBadge2,
    WeaponsAluminumBadge2,
    WeaponsLeatherBadge2,
    WeaponsBoneBadge2,
    Bouquet,
    Decoction,
    ChristmasPresent,
    EasterEgg,
    JackOLantern,
    DiskVol1WeddingMarch,
    DiskVol2DayLight,
    DiskVol3BurningRangers,
    DiskVol4OpenYourHeart,
    DiskVol5LiveLearn,
    DiskVol6Nights,
    DiskVol7EndingThemePianoVer,
    DiskVol8HeartToHeart,
    DiskVol9StrangeBlue,
    DiskVol10ReunionSystem,
    DiskVol11Pinnacles,
    DiskVol12FightInsideTheSpaceship,
    HuntersReport,
    HuntersReport2,
    HuntersReport3,
    HuntersReport4,
    HuntersReport5,
    Tablet,
    Unknown2,
    DragonScale,
    HeavenStrikerCoat,
    PioneerParts,
    AmitiesMemo,
    HeartOfMorolian,
    RappysBeak,
    YahoosEngine,
    DPhotonCore,
    LibertaKit,
    CellOfMag0503,
    CellOfMag0504,
    CellOfMag0505,
    CellOfMag0506,
    CellOfMag0507,
    TeamPoints500,
    TeamPoints1000,
    TeamPoints5000,
    TeamPoints10000,
}

impl ToolType {
    pub fn is_stackable(&self) -> bool {
        match self {
            ToolType::Monomate => true,
            ToolType::Dimate => true,
            ToolType::Trimate => true,
            ToolType::Monofluid => true,
            ToolType::Difluid => true,
            ToolType::Trifluid => true,
            ToolType::SolAtomizer => true,
            ToolType::MoonAtomizer => true,
            ToolType::StarAtomizer => true,
            ToolType::Antidote => true,
            ToolType::Antiparalysis => true,
            ToolType::Telepipe => true,
            ToolType::TrapVision => true,
            ToolType::Monogrinder => true,
            ToolType::Digrinder => true,
            ToolType::Trigrinder => true,
            ToolType::PowerMaterial => true,
            ToolType::MindMaterial => true,
            ToolType::EvadeMaterial => true,
            ToolType::HpMaterial => true,
            ToolType::TpMaterial => true,
            ToolType::DefMaterial => true,
            ToolType::LuckMaterial => true,
            ToolType::Addslot => true,
            ToolType::PhotonDrop => true,
            ToolType::PhotonSphere => true,
            ToolType::PhotonCrystal => true,
            _ => false,
        }
    }

    pub fn max_stack(&self) -> usize {
        match self {
            ToolType::Monomate => 10,
            ToolType::Dimate => 10,
            ToolType::Trimate => 10,
            ToolType::Monofluid => 10,
            ToolType::Difluid => 10,
            ToolType::Trifluid => 10,
            ToolType::SolAtomizer => 10,
            ToolType::MoonAtomizer => 10,
            ToolType::StarAtomizer => 10,
            ToolType::Antidote => 10,
            ToolType::Antiparalysis => 10,
            ToolType::Telepipe => 10,
            ToolType::TrapVision => 10,
            ToolType::Monogrinder => 99,
            ToolType::Digrinder => 99,
            ToolType::Trigrinder => 99,
            ToolType::PowerMaterial => 99,
            ToolType::MindMaterial => 99,
            ToolType::EvadeMaterial => 99,
            ToolType::HpMaterial => 99,
            ToolType::TpMaterial => 99,
            ToolType::DefMaterial => 99,
            ToolType::LuckMaterial => 99,
            ToolType::Addslot => 99,
            ToolType::PhotonDrop => 99,
            ToolType::PhotonSphere => 99,
            ToolType::PhotonCrystal => 99,
            _ => 1,
        }
    }

    pub fn is_mag_cell(&self) -> bool {
        match self {
            ToolType::CellOfMag502 => true,
            ToolType::CellOfMag213 => true,
            ToolType::PartsOfRobochao => true,
            ToolType::HeartOfOpaOpa => true,
            ToolType::HeartOfPian => true,
            ToolType::HeartOfChao => true,
            ToolType::HeartOfAngel => true,
            ToolType::HeartOfDevil => true,
            ToolType::KitOfHamburger => true,
            ToolType::PanthersSpirit => true,
            ToolType::KitOfMark3 => true,
            ToolType::KitOfMasterSystem => true,
            ToolType::KitOfGenesis => true,
            ToolType::KitOfSegaSaturn => true,
            ToolType::KitOfDreamcast => true,
            ToolType::Tablet => true,
            ToolType::DragonScale => true,
            ToolType::HeavenStrikerCoat => true,
            ToolType::PioneerParts => true,
            ToolType::AmitiesMemo => true,
            ToolType::HeartOfMorolian => true,
            ToolType::RappysBeak => true,
            ToolType::YahoosEngine => true,
            ToolType::DPhotonCore => true,
            ToolType::LibertaKit => true,
            ToolType::CellOfMag0503 => true,
            ToolType::CellOfMag0504 => true,
            ToolType::CellOfMag0505 => true,
            ToolType::CellOfMag0506 => true,
            ToolType::CellOfMag0507 => true,
            _ => false,
        }
    }

    pub fn value(&self) -> [u8; 3] {
        match self {
            ToolType::Monomate => [0x03, 0x00, 0x00],
            ToolType::Dimate => [0x03, 0x00, 0x01],
            ToolType::Trimate => [0x03, 0x00, 0x02],
            ToolType::Monofluid => [0x03, 0x01, 0x00],
            ToolType::Difluid => [0x03, 0x01, 0x01],
            ToolType::Trifluid => [0x03, 0x01, 0x02],
            ToolType::SolAtomizer => [0x03, 0x03, 0x00],
            ToolType::MoonAtomizer => [0x03, 0x04, 0x00],
            ToolType::StarAtomizer => [0x03, 0x05, 0x00],
            ToolType::Antidote => [0x03, 0x06, 0x00],
            ToolType::Antiparalysis => [0x03, 0x06, 0x01],
            ToolType::Telepipe => [0x03, 0x07, 0x00],
            ToolType::TrapVision => [0x03, 0x08, 0x00],
            ToolType::ScapeDoll => [0x03, 0x09, 0x00],
            ToolType::Monogrinder => [0x03, 0x0A, 0x00],
            ToolType::Digrinder => [0x03, 0x0A, 0x01],
            ToolType::Trigrinder => [0x03, 0x0A, 0x02],
            ToolType::PowerMaterial => [0x03, 0x0B, 0x00],
            ToolType::MindMaterial => [0x03, 0x0B, 0x01],
            ToolType::EvadeMaterial => [0x03, 0x0B, 0x02],
            ToolType::HpMaterial => [0x03, 0x0B, 0x03],
            ToolType::TpMaterial => [0x03, 0x0B, 0x04],
            ToolType::DefMaterial => [0x03, 0x0B, 0x05],
            ToolType::LuckMaterial => [0x03, 0x0B, 0x06],
            ToolType::CellOfMag502 => [0x03, 0x0C, 0x00],
            ToolType::CellOfMag213 => [0x03, 0x0C, 0x01],
            ToolType::PartsOfRobochao => [0x03, 0x0C, 0x02],
            ToolType::HeartOfOpaOpa => [0x03, 0x0C, 0x03],
            ToolType::HeartOfPian => [0x03, 0x0C, 0x04],
            ToolType::HeartOfChao => [0x03, 0x0C, 0x05],
            ToolType::SorcerersRightArm => [0x03, 0x0D, 0x00],
            ToolType::SBeatsArms => [0x03, 0x0D, 0x01],
            ToolType::PArmsArms => [0x03, 0x0D, 0x02],
            ToolType::DelsabersRightArm => [0x03, 0x0D, 0x03],
            ToolType::BringersRightArm => [0x03, 0x0D, 0x04],
            ToolType::DelsabersLeftArm => [0x03, 0x0D, 0x05],
            ToolType::SRedsArms => [0x03, 0x0D, 0x06],
            ToolType::DragonsClaw => [0x03, 0x0D, 0x07],
            ToolType::HildebearsHead => [0x03, 0x0D, 0x08],
            ToolType::HildebluesHead => [0x03, 0x0D, 0x09],
            ToolType::PartsOfBaranz => [0x03, 0x0D, 0x0A],
            ToolType::BelrasRightArm => [0x03, 0x0D, 0x0B],
            ToolType::GiGuesBody => [0x03, 0x0D, 0x0C],
            ToolType::SinowBerillsArms => [0x03, 0x0D, 0x0D],
            ToolType::GrassAssassinsArms => [0x03, 0x0D, 0x0E],
            ToolType::BoomasRightArm => [0x03, 0x0D, 0x0F],
            ToolType::GoboomasRightArm => [0x03, 0x0D, 0x10],
            ToolType::GigoboomasRightArm => [0x03, 0x0D, 0x11],
            ToolType::GalGryphonsWing => [0x03, 0x0D, 0x12],
            ToolType::RappysWing => [0x03, 0x0D, 0x13],
            ToolType::CladdingOfEpsilon => [0x03, 0x0D, 0x14],
            ToolType::DeRolLeShell => [0x03, 0x0D, 0x15],
            ToolType::BerillPhoton => [0x03, 0x0E, 0x00],
            ToolType::ParasiticGeneFlow => [0x03, 0x0E, 0x01],
            ToolType::MagicStoneIritista => [0x03, 0x0E, 0x02],
            ToolType::BlueBlackStone => [0x03, 0x0E, 0x03],
            ToolType::Syncesta => [0x03, 0x0E, 0x04],
            ToolType::MagicWater => [0x03, 0x0E, 0x05],
            ToolType::ParasiticCellTypeD => [0x03, 0x0E, 0x06],
            ToolType::MagicRockHeartKey => [0x03, 0x0E, 0x07],
            ToolType::MagicRockMoola => [0x03, 0x0E, 0x08],
            ToolType::StarAmplifier => [0x03, 0x0E, 0x09],
            ToolType::BookOfHitogata => [0x03, 0x0E, 0x0A],
            ToolType::HeartOfChuChu => [0x03, 0x0E, 0x0B],
            ToolType::PartsOfEggBlaster => [0x03, 0x0E, 0x0C],
            ToolType::HeartOfAngel => [0x03, 0x0E, 0x0D],
            ToolType::HeartOfDevil => [0x03, 0x0E, 0x0E],
            ToolType::KitOfHamburger => [0x03, 0x0E, 0x0F],
            ToolType::PanthersSpirit => [0x03, 0x0E, 0x10],
            ToolType::KitOfMark3 => [0x03, 0x0E, 0x11],
            ToolType::KitOfMasterSystem => [0x03, 0x0E, 0x12],
            ToolType::KitOfGenesis => [0x03, 0x0E, 0x13],
            ToolType::KitOfSegaSaturn => [0x03, 0x0E, 0x14],
            ToolType::KitOfDreamcast => [0x03, 0x0E, 0x15],
            ToolType::AmplifierOfResta => [0x03, 0x0E, 0x16],
            ToolType::AmplifierOfAnti => [0x03, 0x0E, 0x17],
            ToolType::AmplifierOfShifta => [0x03, 0x0E, 0x18],
            ToolType::AmplifierOfDeband => [0x03, 0x0E, 0x19],
            ToolType::AmplifierOfFoie => [0x03, 0x0E, 0x1A],
            ToolType::AmplifierOfGifoie => [0x03, 0x0E, 0x1B],
            ToolType::AmplifierOfRafoie => [0x03, 0x0E, 0x1C],
            ToolType::AmplifierOfBarta => [0x03, 0x0E, 0x1D],
            ToolType::AmplifierOfGibarta => [0x03, 0x0E, 0x1E],
            ToolType::AmplifierOfRabarta => [0x03, 0x0E, 0x1F],
            ToolType::AmplifierOfZonde => [0x03, 0x0E, 0x20],
            ToolType::AmplifierOfGizonde => [0x03, 0x0E, 0x21],
            ToolType::AmplifierOfRazonde => [0x03, 0x0E, 0x22],
            ToolType::AmplifierOfRed => [0x03, 0x0E, 0x23],
            ToolType::AmplifierOfBlue => [0x03, 0x0E, 0x24],
            ToolType::AmplifierOfYellow => [0x03, 0x0E, 0x25],
            ToolType::HeartOfKapuKapu => [0x03, 0x0E, 0x26],
            ToolType::PhotonBooster => [0x03, 0x0E, 0x27],
            ToolType::Addslot => [0x03, 0x0F, 0x00],
            ToolType::PhotonDrop => [0x03, 0x10, 0x00],
            ToolType::PhotonSphere => [0x03, 0x10, 0x01],
            ToolType::PhotonCrystal => [0x03, 0x10, 0x02],
            ToolType::SecretTicket => [0x03, 0x10, 0x03],
            ToolType::PhotonTicket => [0x03, 0x10, 0x04],
            ToolType::BookOfKatana1 => [0x03, 0x11, 0x00],
            ToolType::BookOfKatana2 => [0x03, 0x11, 0x01],
            ToolType::BookOfKatana3 => [0x03, 0x11, 0x02],
            ToolType::WeaponsBronzeBadge => [0x03, 0x12, 0x00],
            ToolType::WeaponsSilverBadge => [0x03, 0x12, 0x01],
            ToolType::WeaponsGoldBadge => [0x03, 0x12, 0x02],
            ToolType::WeaponsCrystalBadge => [0x03, 0x12, 0x03],
            ToolType::WeaponsSteelBadge => [0x03, 0x12, 0x04],
            ToolType::WeaponsAluminumBadge => [0x03, 0x12, 0x05],
            ToolType::WeaponsLeatherBadge => [0x03, 0x12, 0x06],
            ToolType::WeaponsBoneBadge => [0x03, 0x12, 0x07],
            ToolType::LetterOfAppreciation => [0x03, 0x12, 0x08],
            ToolType::ItemTicket => [0x03, 0x12, 0x09],
            ToolType::ValentinesChocolate => [0x03, 0x12, 0x0A],
            ToolType::NewYearsCard => [0x03, 0x12, 0x0B],
            ToolType::ChristmasCard => [0x03, 0x12, 0x0C],
            ToolType::BirthdayCard => [0x03, 0x12, 0x0D],
            ToolType::ProofOfSonicTeam => [0x03, 0x12, 0x0E],
            ToolType::SpecialEventTicket => [0x03, 0x12, 0x0F],
            ToolType::FlowerBouquet => [0x03, 0x12, 0x10],
            ToolType::Cake => [0x03, 0x12, 0x11],
            ToolType::Accessories => [0x03, 0x12, 0x12],
            ToolType::MrNakasBusinessCard => [0x03, 0x12, 0x13],
            ToolType::Present => [0x03, 0x13, 0x00],
            ToolType::Chocolate => [0x03, 0x14, 0x00],
            ToolType::Candy => [0x03, 0x14, 0x01],
            ToolType::Cake2 => [0x03, 0x14, 0x02],
            ToolType::WeaponsSilverBadge2 => [0x03, 0x14, 0x03],
            ToolType::WeaponsGoldBadge2 => [0x03, 0x14, 0x04],
            ToolType::WeaponsCrystalBadge2 => [0x03, 0x14, 0x05],
            ToolType::WeaponsSteelBadge2 => [0x03, 0x14, 0x06],
            ToolType::WeaponsAluminumBadge2 => [0x03, 0x14, 0x07],
            ToolType::WeaponsLeatherBadge2 => [0x03, 0x14, 0x08],
            ToolType::WeaponsBoneBadge2 => [0x03, 0x14, 0x09],
            ToolType::Bouquet => [0x03, 0x14, 0x0A],
            ToolType::Decoction => [0x03, 0x14, 0x0B],
            ToolType::ChristmasPresent => [0x03, 0x15, 0x00],
            ToolType::EasterEgg => [0x03, 0x15, 0x01],
            ToolType::JackOLantern => [0x03, 0x15, 0x02],
            ToolType::DiskVol1WeddingMarch => [0x03, 0x16, 0x00],
            ToolType::DiskVol2DayLight => [0x03, 0x16, 0x01],
            ToolType::DiskVol3BurningRangers => [0x03, 0x16, 0x02],
            ToolType::DiskVol4OpenYourHeart => [0x03, 0x16, 0x03],
            ToolType::DiskVol5LiveLearn => [0x03, 0x16, 0x04],
            ToolType::DiskVol6Nights => [0x03, 0x16, 0x05],
            ToolType::DiskVol7EndingThemePianoVer => [0x03, 0x16, 0x06],
            ToolType::DiskVol8HeartToHeart => [0x03, 0x16, 0x07],
            ToolType::DiskVol9StrangeBlue => [0x03, 0x16, 0x08],
            ToolType::DiskVol10ReunionSystem => [0x03, 0x16, 0x09],
            ToolType::DiskVol11Pinnacles => [0x03, 0x16, 0x0A],
            ToolType::DiskVol12FightInsideTheSpaceship => [0x03, 0x16, 0x0B],
            ToolType::HuntersReport => [0x03, 0x17, 0x00],
            ToolType::HuntersReport2 => [0x03, 0x17, 0x01],
            ToolType::HuntersReport3 => [0x03, 0x17, 0x02],
            ToolType::HuntersReport4 => [0x03, 0x17, 0x03],
            ToolType::HuntersReport5 => [0x03, 0x17, 0x04],
            ToolType::Tablet => [0x03, 0x18, 0x00],
            ToolType::Unknown2 => [0x03, 0x18, 0x01],
            ToolType::DragonScale => [0x03, 0x18, 0x02],
            ToolType::HeavenStrikerCoat => [0x03, 0x18, 0x03],
            ToolType::PioneerParts => [0x03, 0x18, 0x04],
            ToolType::AmitiesMemo => [0x03, 0x18, 0x05],
            ToolType::HeartOfMorolian => [0x03, 0x18, 0x06],
            ToolType::RappysBeak => [0x03, 0x18, 0x07],
            ToolType::YahoosEngine => [0x03, 0x18, 0x08],
            ToolType::DPhotonCore => [0x03, 0x18, 0x09],
            ToolType::LibertaKit => [0x03, 0x18, 0x0A],
            ToolType::CellOfMag0503 => [0x03, 0x18, 0x0B],
            ToolType::CellOfMag0504 => [0x03, 0x18, 0x0C],
            ToolType::CellOfMag0505 => [0x03, 0x18, 0x0D],
            ToolType::CellOfMag0506 => [0x03, 0x18, 0x0E],
            ToolType::CellOfMag0507 => [0x03, 0x18, 0x0F],
            ToolType::TeamPoints500 => [0x03, 0x19, 0x00],
            ToolType::TeamPoints1000 => [0x03, 0x19, 0x01],
            ToolType::TeamPoints5000 => [0x03, 0x19, 0x02],
            ToolType::TeamPoints10000 => [0x03, 0x19, 0x03],
        }
    }

    pub fn parse_type(data: [u8; 3]) -> Result<ToolType, ItemParseError> {
        match data {
            [0x03, 0x00, 0x00] => Ok(ToolType::Monomate),
            [0x03, 0x00, 0x01] => Ok(ToolType::Dimate),
            [0x03, 0x00, 0x02] => Ok(ToolType::Trimate),
            [0x03, 0x01, 0x00] => Ok(ToolType::Monofluid),
            [0x03, 0x01, 0x01] => Ok(ToolType::Difluid),
            [0x03, 0x01, 0x02] => Ok(ToolType::Trifluid),
            [0x03, 0x03, 0x00] => Ok(ToolType::SolAtomizer),
            [0x03, 0x04, 0x00] => Ok(ToolType::MoonAtomizer),
            [0x03, 0x05, 0x00] => Ok(ToolType::StarAtomizer),
            [0x03, 0x06, 0x00] => Ok(ToolType::Antidote),
            [0x03, 0x06, 0x01] => Ok(ToolType::Antiparalysis),
            [0x03, 0x07, 0x00] => Ok(ToolType::Telepipe),
            [0x03, 0x08, 0x00] => Ok(ToolType::TrapVision),
            [0x03, 0x09, 0x00] => Ok(ToolType::ScapeDoll),
            [0x03, 0x0A, 0x00] => Ok(ToolType::Monogrinder),
            [0x03, 0x0A, 0x01] => Ok(ToolType::Digrinder),
            [0x03, 0x0A, 0x02] => Ok(ToolType::Trigrinder),
            [0x03, 0x0B, 0x00] => Ok(ToolType::PowerMaterial),
            [0x03, 0x0B, 0x01] => Ok(ToolType::MindMaterial),
            [0x03, 0x0B, 0x02] => Ok(ToolType::EvadeMaterial),
            [0x03, 0x0B, 0x03] => Ok(ToolType::HpMaterial),
            [0x03, 0x0B, 0x04] => Ok(ToolType::TpMaterial),
            [0x03, 0x0B, 0x05] => Ok(ToolType::DefMaterial),
            [0x03, 0x0B, 0x06] => Ok(ToolType::LuckMaterial),
            [0x03, 0x0C, 0x00] => Ok(ToolType::CellOfMag502),
            [0x03, 0x0C, 0x01] => Ok(ToolType::CellOfMag213),
            [0x03, 0x0C, 0x02] => Ok(ToolType::PartsOfRobochao),
            [0x03, 0x0C, 0x03] => Ok(ToolType::HeartOfOpaOpa),
            [0x03, 0x0C, 0x04] => Ok(ToolType::HeartOfPian),
            [0x03, 0x0C, 0x05] => Ok(ToolType::HeartOfChao),
            [0x03, 0x0D, 0x00] => Ok(ToolType::SorcerersRightArm),
            [0x03, 0x0D, 0x01] => Ok(ToolType::SBeatsArms),
            [0x03, 0x0D, 0x02] => Ok(ToolType::PArmsArms),
            [0x03, 0x0D, 0x03] => Ok(ToolType::DelsabersRightArm),
            [0x03, 0x0D, 0x04] => Ok(ToolType::BringersRightArm),
            [0x03, 0x0D, 0x05] => Ok(ToolType::DelsabersLeftArm),
            [0x03, 0x0D, 0x06] => Ok(ToolType::SRedsArms),
            [0x03, 0x0D, 0x07] => Ok(ToolType::DragonsClaw),
            [0x03, 0x0D, 0x08] => Ok(ToolType::HildebearsHead),
            [0x03, 0x0D, 0x09] => Ok(ToolType::HildebluesHead),
            [0x03, 0x0D, 0x0A] => Ok(ToolType::PartsOfBaranz),
            [0x03, 0x0D, 0x0B] => Ok(ToolType::BelrasRightArm),
            [0x03, 0x0D, 0x0C] => Ok(ToolType::GiGuesBody),
            [0x03, 0x0D, 0x0D] => Ok(ToolType::SinowBerillsArms),
            [0x03, 0x0D, 0x0E] => Ok(ToolType::GrassAssassinsArms),
            [0x03, 0x0D, 0x0F] => Ok(ToolType::BoomasRightArm),
            [0x03, 0x0D, 0x10] => Ok(ToolType::GoboomasRightArm),
            [0x03, 0x0D, 0x11] => Ok(ToolType::GigoboomasRightArm),
            [0x03, 0x0D, 0x12] => Ok(ToolType::GalGryphonsWing),
            [0x03, 0x0D, 0x13] => Ok(ToolType::RappysWing),
            [0x03, 0x0D, 0x14] => Ok(ToolType::CladdingOfEpsilon),
            [0x03, 0x0D, 0x15] => Ok(ToolType::DeRolLeShell),
            [0x03, 0x0E, 0x00] => Ok(ToolType::BerillPhoton),
            [0x03, 0x0E, 0x01] => Ok(ToolType::ParasiticGeneFlow),
            [0x03, 0x0E, 0x02] => Ok(ToolType::MagicStoneIritista),
            [0x03, 0x0E, 0x03] => Ok(ToolType::BlueBlackStone),
            [0x03, 0x0E, 0x04] => Ok(ToolType::Syncesta),
            [0x03, 0x0E, 0x05] => Ok(ToolType::MagicWater),
            [0x03, 0x0E, 0x06] => Ok(ToolType::ParasiticCellTypeD),
            [0x03, 0x0E, 0x07] => Ok(ToolType::MagicRockHeartKey),
            [0x03, 0x0E, 0x08] => Ok(ToolType::MagicRockMoola),
            [0x03, 0x0E, 0x09] => Ok(ToolType::StarAmplifier),
            [0x03, 0x0E, 0x0A] => Ok(ToolType::BookOfHitogata),
            [0x03, 0x0E, 0x0B] => Ok(ToolType::HeartOfChuChu),
            [0x03, 0x0E, 0x0C] => Ok(ToolType::PartsOfEggBlaster),
            [0x03, 0x0E, 0x0D] => Ok(ToolType::HeartOfAngel),
            [0x03, 0x0E, 0x0E] => Ok(ToolType::HeartOfDevil),
            [0x03, 0x0E, 0x0F] => Ok(ToolType::KitOfHamburger),
            [0x03, 0x0E, 0x10] => Ok(ToolType::PanthersSpirit),
            [0x03, 0x0E, 0x11] => Ok(ToolType::KitOfMark3),
            [0x03, 0x0E, 0x12] => Ok(ToolType::KitOfMasterSystem),
            [0x03, 0x0E, 0x13] => Ok(ToolType::KitOfGenesis),
            [0x03, 0x0E, 0x14] => Ok(ToolType::KitOfSegaSaturn),
            [0x03, 0x0E, 0x15] => Ok(ToolType::KitOfDreamcast),
            [0x03, 0x0E, 0x16] => Ok(ToolType::AmplifierOfResta),
            [0x03, 0x0E, 0x17] => Ok(ToolType::AmplifierOfAnti),
            [0x03, 0x0E, 0x18] => Ok(ToolType::AmplifierOfShifta),
            [0x03, 0x0E, 0x19] => Ok(ToolType::AmplifierOfDeband),
            [0x03, 0x0E, 0x1A] => Ok(ToolType::AmplifierOfFoie),
            [0x03, 0x0E, 0x1B] => Ok(ToolType::AmplifierOfGifoie),
            [0x03, 0x0E, 0x1C] => Ok(ToolType::AmplifierOfRafoie),
            [0x03, 0x0E, 0x1D] => Ok(ToolType::AmplifierOfBarta),
            [0x03, 0x0E, 0x1E] => Ok(ToolType::AmplifierOfGibarta),
            [0x03, 0x0E, 0x1F] => Ok(ToolType::AmplifierOfRabarta),
            [0x03, 0x0E, 0x20] => Ok(ToolType::AmplifierOfZonde),
            [0x03, 0x0E, 0x21] => Ok(ToolType::AmplifierOfGizonde),
            [0x03, 0x0E, 0x22] => Ok(ToolType::AmplifierOfRazonde),
            [0x03, 0x0E, 0x23] => Ok(ToolType::AmplifierOfRed),
            [0x03, 0x0E, 0x24] => Ok(ToolType::AmplifierOfBlue),
            [0x03, 0x0E, 0x25] => Ok(ToolType::AmplifierOfYellow),
            [0x03, 0x0E, 0x26] => Ok(ToolType::HeartOfKapuKapu),
            [0x03, 0x0E, 0x27] => Ok(ToolType::PhotonBooster),
            [0x03, 0x0F, 0x00] => Ok(ToolType::Addslot),
            [0x03, 0x10, 0x00] => Ok(ToolType::PhotonDrop),
            [0x03, 0x10, 0x01] => Ok(ToolType::PhotonSphere),
            [0x03, 0x10, 0x02] => Ok(ToolType::PhotonCrystal),
            [0x03, 0x10, 0x03] => Ok(ToolType::SecretTicket),
            [0x03, 0x10, 0x04] => Ok(ToolType::PhotonTicket),
            [0x03, 0x11, 0x00] => Ok(ToolType::BookOfKatana1),
            [0x03, 0x11, 0x01] => Ok(ToolType::BookOfKatana2),
            [0x03, 0x11, 0x02] => Ok(ToolType::BookOfKatana3),
            [0x03, 0x12, 0x00] => Ok(ToolType::WeaponsBronzeBadge),
            [0x03, 0x12, 0x01] => Ok(ToolType::WeaponsSilverBadge),
            [0x03, 0x12, 0x02] => Ok(ToolType::WeaponsGoldBadge),
            [0x03, 0x12, 0x03] => Ok(ToolType::WeaponsCrystalBadge),
            [0x03, 0x12, 0x04] => Ok(ToolType::WeaponsSteelBadge),
            [0x03, 0x12, 0x05] => Ok(ToolType::WeaponsAluminumBadge),
            [0x03, 0x12, 0x06] => Ok(ToolType::WeaponsLeatherBadge),
            [0x03, 0x12, 0x07] => Ok(ToolType::WeaponsBoneBadge),
            [0x03, 0x12, 0x08] => Ok(ToolType::LetterOfAppreciation),
            [0x03, 0x12, 0x09] => Ok(ToolType::ItemTicket),
            [0x03, 0x12, 0x0A] => Ok(ToolType::ValentinesChocolate),
            [0x03, 0x12, 0x0B] => Ok(ToolType::NewYearsCard),
            [0x03, 0x12, 0x0C] => Ok(ToolType::ChristmasCard),
            [0x03, 0x12, 0x0D] => Ok(ToolType::BirthdayCard),
            [0x03, 0x12, 0x0E] => Ok(ToolType::ProofOfSonicTeam),
            [0x03, 0x12, 0x0F] => Ok(ToolType::SpecialEventTicket),
            [0x03, 0x12, 0x10] => Ok(ToolType::FlowerBouquet),
            [0x03, 0x12, 0x11] => Ok(ToolType::Cake),
            [0x03, 0x12, 0x12] => Ok(ToolType::Accessories),
            [0x03, 0x12, 0x13] => Ok(ToolType::MrNakasBusinessCard),
            [0x03, 0x13, 0x00] => Ok(ToolType::Present),
            [0x03, 0x14, 0x00] => Ok(ToolType::Chocolate),
            [0x03, 0x14, 0x01] => Ok(ToolType::Candy),
            [0x03, 0x14, 0x02] => Ok(ToolType::Cake2),
            [0x03, 0x14, 0x03] => Ok(ToolType::WeaponsSilverBadge2),
            [0x03, 0x14, 0x04] => Ok(ToolType::WeaponsGoldBadge2),
            [0x03, 0x14, 0x05] => Ok(ToolType::WeaponsCrystalBadge2),
            [0x03, 0x14, 0x06] => Ok(ToolType::WeaponsSteelBadge2),
            [0x03, 0x14, 0x07] => Ok(ToolType::WeaponsAluminumBadge2),
            [0x03, 0x14, 0x08] => Ok(ToolType::WeaponsLeatherBadge2),
            [0x03, 0x14, 0x09] => Ok(ToolType::WeaponsBoneBadge2),
            [0x03, 0x14, 0x0A] => Ok(ToolType::Bouquet),
            [0x03, 0x14, 0x0B] => Ok(ToolType::Decoction),
            [0x03, 0x15, 0x00] => Ok(ToolType::ChristmasPresent),
            [0x03, 0x15, 0x01] => Ok(ToolType::EasterEgg),
            [0x03, 0x15, 0x02] => Ok(ToolType::JackOLantern),
            [0x03, 0x16, 0x00] => Ok(ToolType::DiskVol1WeddingMarch),
            [0x03, 0x16, 0x01] => Ok(ToolType::DiskVol2DayLight),
            [0x03, 0x16, 0x02] => Ok(ToolType::DiskVol3BurningRangers),
            [0x03, 0x16, 0x03] => Ok(ToolType::DiskVol4OpenYourHeart),
            [0x03, 0x16, 0x04] => Ok(ToolType::DiskVol5LiveLearn),
            [0x03, 0x16, 0x05] => Ok(ToolType::DiskVol6Nights),
            [0x03, 0x16, 0x06] => Ok(ToolType::DiskVol7EndingThemePianoVer),
            [0x03, 0x16, 0x07] => Ok(ToolType::DiskVol8HeartToHeart),
            [0x03, 0x16, 0x08] => Ok(ToolType::DiskVol9StrangeBlue),
            [0x03, 0x16, 0x09] => Ok(ToolType::DiskVol10ReunionSystem),
            [0x03, 0x16, 0x0A] => Ok(ToolType::DiskVol11Pinnacles),
            [0x03, 0x16, 0x0B] => Ok(ToolType::DiskVol12FightInsideTheSpaceship),
            [0x03, 0x17, 0x00] => Ok(ToolType::HuntersReport),
            [0x03, 0x17, 0x01] => Ok(ToolType::HuntersReport2),
            [0x03, 0x17, 0x02] => Ok(ToolType::HuntersReport3),
            [0x03, 0x17, 0x03] => Ok(ToolType::HuntersReport4),
            [0x03, 0x17, 0x04] => Ok(ToolType::HuntersReport5),
            [0x03, 0x18, 0x00] => Ok(ToolType::Tablet),
            [0x03, 0x18, 0x01] => Ok(ToolType::Unknown2),
            [0x03, 0x18, 0x02] => Ok(ToolType::DragonScale),
            [0x03, 0x18, 0x03] => Ok(ToolType::HeavenStrikerCoat),
            [0x03, 0x18, 0x04] => Ok(ToolType::PioneerParts),
            [0x03, 0x18, 0x05] => Ok(ToolType::AmitiesMemo),
            [0x03, 0x18, 0x06] => Ok(ToolType::HeartOfMorolian),
            [0x03, 0x18, 0x07] => Ok(ToolType::RappysBeak),
            [0x03, 0x18, 0x08] => Ok(ToolType::YahoosEngine),
            [0x03, 0x18, 0x09] => Ok(ToolType::DPhotonCore),
            [0x03, 0x18, 0x0A] => Ok(ToolType::LibertaKit),
            [0x03, 0x18, 0x0B] => Ok(ToolType::CellOfMag0503),
            [0x03, 0x18, 0x0C] => Ok(ToolType::CellOfMag0504),
            [0x03, 0x18, 0x0D] => Ok(ToolType::CellOfMag0505),
            [0x03, 0x18, 0x0E] => Ok(ToolType::CellOfMag0506),
            [0x03, 0x18, 0x0F] => Ok(ToolType::CellOfMag0507),
            [0x03, 0x19, 0x00] => Ok(ToolType::TeamPoints500),
            [0x03, 0x19, 0x01] => Ok(ToolType::TeamPoints1000),
            [0x03, 0x19, 0x02] => Ok(ToolType::TeamPoints5000),
            [0x03, 0x19, 0x03] => Ok(ToolType::TeamPoints10000),
            _ => Err(ItemParseError::InvalidToolType),
        }
    }
}


#[derive(Copy, Clone, Debug, PartialEq, Serialize, Deserialize)]
pub struct Tool {
    pub tool: ToolType,
}

impl Tool {
    pub fn as_individual_bytes(&self) -> [u8; 16] {
        let mut result = [0; 16];
        result[0..3].copy_from_slice(&self.tool.value());
        result
    }

    pub fn as_stacked_bytes(&self, len: usize) -> [u8; 16] {
        let mut result = [0; 16];
        result[0..3].copy_from_slice(&self.tool.value());
        result[5] = len as u8;
        result
    }

    pub fn from_bytes(data: [u8; 16]) -> Result<Tool, ItemParseError> {
        let t = ToolType::parse_type([data[0], data[1], data[2]]); 
        if t.is_ok() {
            Ok(Tool {
                tool: t.unwrap(),
            })
        }
        else {
            Err(ItemParseError::InvalidToolBytes) // TODO: error handling if wrong bytes are given
        }
    }

    pub fn is_stackable(&self) -> bool {
        self.tool.is_stackable()
    }

    pub fn max_stack(&self) -> usize {
        self.tool.max_stack()
    }
}