use crate::statistics::StatBlock;

#[derive(Debug, Clone)]
pub struct Comp {
    id: String,           // Unique Item ID
    name: String,         // Display Name
    slots: u8,            // Spell slots, between 1 and 10
    mstorage: u8,         // Spell storage, powers of 2, 16-128 (MiB)
    gstorage: u8,         // Program storage, powers of 2, 8-32 (GiB)
    stat_mods: StatBlock, // Bufs/debufs
    flavor: String,       // Flavortext
    description: String,  // Description text
}
impl Comp {
    pub fn new() -> Self {
        Self {
            id: String::from("COMP_BLANK"),
            name: String::from("Basic DMD"),
            slots: 1,
            mstorage: 16,
            gstorage: 8,
            stat_mods: StatBlock::new_zero(),
            flavor: String::from("A basic bitch digital magick device"),
            description: String::from(
                "One spell slot, 16MiB of spell storage, and 8GiB of program storage",
            ),
        }
    }
    pub fn id(self) -> String {
        self.id
    }
    pub fn name(self) -> String {
        self.name
    }
    pub fn slots(self) -> u8 {
        self.slots
    }
    pub fn spell_storage(self) -> u8 {
        self.mstorage
    }
    pub fn program_storage(self) -> u8 {
        self.gstorage
    }
    pub fn stat_mods(self) -> StatBlock {
        self.stat_mods
    }
    pub fn description(self) -> String {
        self.description
    }
    pub fn flavor(self) -> String {
        self.flavor
    }

    // Low teir gear
    pub fn cef_8080() -> Self {
        Self {
            id: String::from("COMP_CEF_8080"),
            name: String::from("CEF 8080"),
            slots: 1,
            mstorage: 16,
            gstorage: 8,
            stat_mods: StatBlock::new_zero(),
            flavor: String::from("Mass produced garbage."),
            description: String::from(
                "One spell slot, 16MiB of spell storage, and 8GiB of program storage.",
            ),
        }
    }
    pub fn chiba_e3() -> Self {
        let mut stat_mods = StatBlock::new_zero();
        stat_mods.set_intellect(1);
        Self {
            id: String::from("COMP_CHIBA_E3"),
            name: String::from("Chiba E3"),
            slots: 1,
            mstorage: 16,
            gstorage: 8,
            stat_mods,
            flavor: String::from("Handmade with love by Gideon Chiba, good luck out there trainee!"),
            description: String::from("+1 Intellect, 1 spell slot, 16MiB of spell storage, 8GiB of program storage."),
        }
    }
    pub fn spiceworks_v3() -> Self {
        let mut stat_mods = StatBlock::new_zero();
        stat_mods.set_magick(1);
        Self {
            id: String::from("COMP_SPICE_V3"),
            name: String::from("Spiceworks V3"),
            slots: 2,
            mstorage: 16,
            gstorage: 8,
            stat_mods,
            flavor: String::from("A heart is scratched into the side."),
            description: String::from("+1 Magick, 2 spell slots, 16MiB of spell storage, 8GiB of program storage."),
        }
    }

    // Mid teir gear
    pub fn chiba_d35() -> Self {
        let mut mods = StatBlock::new_zero();
        mods.set_intellect(3);
        Self {
            id: String::from("COMP_CHIBA_D35"),
            name: String::from("Chiba D35"),
            slots: 6,
            mstorage: 64,
            gstorage: 16,
            stat_mods: mods,
            flavor: String::from("The hottest new offering from Gideon Chiba's handcrafted digital magick devices"),
            description: String::from("+3 Intellect, six spell slots, 64MiB of spell storage, and 16GiB of program storage"),
        }
    }
    pub fn cef_8081() -> Self {
        Self {
            id: String::from("COMP_CEF_8081"),
            name: String::from("CEF 8081"),
            slots: 5,
            mstorage: 128,
            gstorage: 16,
            stat_mods: StatBlock::new_zero(),
            flavor: String::from("Mass produced garbage."),
            description: String::from("Five spell slots, 128MiB of spell storage, and 16GiB of program storage."),
        }
    }

    // Gear Sets for AI unit generation
    pub fn low_level_opts() -> [Self; 3] {
        [Self::cef_8080(), Self::chiba_e3(), Self::spiceworks_v3()]
    }
    pub fn mid_level_opts() -> [Self; 2] {
        [Self::chiba_d35(), Self::cef_8081()]
    }
}