use uuid::Uuid;

use rand::prelude::*;
use rand::distributions::Alphanumeric;
use std::iter;

use cryp::{Cryp};
use skill::{Skill};

pub fn generate_mob() -> Cryp {
    let mut rng = thread_rng();

    let name: String = iter::repeat(())
        .map(|()| rng.sample(Alphanumeric))
        .take(8)
        .collect();

    let mob = Cryp::new()
        .named(&name);

    return mob;
}

// fn quick_game(team_size: usize) -> Vec<Cryp> {
//     iter::repeat_with(||
//             generate_mob()
//                 .set_account(Uuid::nil())
//                 .learn(Skill::Attack))
//         .take(team_size)
//         .collect::<Vec<Cryp>>()
// }

pub fn instance_mobs(team_id: Uuid) -> Vec<Cryp> {
    iter::repeat_with(||
            generate_mob()
                .set_account(team_id)
                .learn(Skill::Attack))
        .take(3)
        .collect::<Vec<Cryp>>()
}

// fn zone_3v2_attack(player_lvl: u8) -> Vec<Cryp> {
//     let x = Cryp::new()
//         .named(&"hench".to_string())
//         .learn(Skill::Attack);

//     let y = Cryp::new()
//         .named(&"bench".to_string())
//         .learn(Skill::Attack);

//     return vec![x, y];
// }

// fn zone_2v2_caster(player_lvl: u8) -> Vec<Cryp> {
//     let x = Cryp::new()
//         .named(&"robe".to_string())
//         .learn(Skill::Blast);

//     let y = Cryp::new()
//         .named(&"wizard hat".to_string())
//         .learn(Skill::Blast);

//     return vec![x, y];
// }

// fn zone_3v3_melee_miniboss(player_lvl: u8) -> Vec<Cryp> {
//     let x = Cryp::new()
//         .named(&"jungle juice".to_string())
//         .learn(Skill::Attack);

//     let y = Cryp::new()
//         .named(&"bamboo basher".to_string())
//         .learn(Skill::Attack)
//         .learn(Skill::Stun);

//     let z = Cryp::new()
//         .named(&"lemongrass tea".to_string())
//         .learn(Skill::Attack);

//     return vec![x, y, z];
// }

// fn zone_3v3_healer_boss(player_lvl: u8) -> Vec<Cryp> {
//     let x = Cryp::new()
//         .named(&"coinage".to_string())
//         .learn(Skill::Attack)
//         .learn(Skill::Parry)
//         .learn(Skill::Block);

//     let y = Cryp::new()
//         .named(&"wololo".to_string())
//         // big strong
//         // .learn(Skill::Blast)
//         .learn(Skill::Heal)
//         .learn(Skill::Triage);

//     let z = Cryp::new()
//         .named(&"quarry".to_string())
//         .learn(Skill::Attack)
//         .learn(Skill::Parry)
//         .learn(Skill::Stun);

//     return vec![x, y, z];
// }


// pub fn generate_mob_team(mode: GameMode, cryps: &Vec<Cryp>) -> Team {
//     let mut mob_team = Team::new(Uuid::nil());

//     let cryp_lvl = cryps.iter().max_by_key(|c| c.lvl).unwrap().lvl;
//     let team_size = cryps.len();

//     let mobs = match mode {
//         GameMode::Normal => quick_game(cryp_lvl, team_size),
//         GameMode::Zone3v2Attack => zone_3v2_attack(cryp_lvl),
//         GameMode::Zone2v2Caster => zone_2v2_caster(cryp_lvl),
//         GameMode::Zone3v3MeleeMiniboss => zone_3v3_melee_miniboss(cryp_lvl),
//         GameMode::Zone3v3HealerBoss => zone_3v3_healer_boss(cryp_lvl),
//         _ => panic!("{:?} not handled for pve mobs", mode),
//     };

//     mob_team.set_cryps(mobs);

//     return mob_team;

// }
