use rand::Rng;

/// Syllables that can make up a name.
/// WARNING: Later in this file, there is a list of offensive terms that should not be included in the name.
/// If you add more syllables, make sure they do not form any offensive terms.
const SYLLABLES: [&str; 295] = [
    "ba", "be", "bi", "bo", "bu", 
    "ca", "ce", "ci", "co", "cu", 
    "da", "de", "di", "do", "du", 
    "fa", "fe", "fi", "fo", "fu", 
    "ga", "ge", "gi", "go", "gu", 
    "ha", "he", "hi", "ho", "hu", 
    "ja", "je", "ji", "jo", "ju", 
    "ka", "ke", "ki", "ko", "ku", 
    "la", "le", "li", "lo", "lu", 
    "ma", "me", "mi", "mo", "mu", 
    "na", "ne", "ni", "no", "nu", 
    "pa", "pe", "pi", "po", "pu", 
    "qa", "qe", "qi", "qo", "qu", 
    "ra", "re", "ri", "ro", "ru", 
    "sa", "se", "si", "so", "su", 
    "ta", "te", "ti", "to", "tu", 
    "va", "ve", "vi", "vo", "vu", 
    "wa", "we", "wi", "wo", "wu", 
    "xa", "xe", "xi", "xo", "xu", 
    "ya", "ye", "yi", "yo", "yu", 
    "za", "ze", "zi", "zo", "zu",
    "bai", "bau", "bei", "beu", "boi", "bou", 
    "cai", "cau", "cei", "ceu", "coi", "cou", 
    "dai", "dau", "dei", "deu", "doi", "dou", 
    "fai", "fau", "fei", "feu", "foi", "fou", 
    "gai", "gau", "gei", "geu", "goi", "gou", 
    "hai", "hau", "hei", "heu", "hoi", "hou", 
    "jai", "jau", "jei", "jeu", "joi", "jou", 
    "kai", "kau", "kei", "keu", "koi", "kou", 
    "lai", "lau", "lei", "leu", "loi", "lou", 
    "mai", "mau", "mei", "meu", "moi", "mou", 
    "nai", "nau", "nei", "neu", "noi", "nou", 
    "pai", "pau", "pei", "peu", "poi", "pou", 
    "qai", "qau", "qei", "qeu", "qoi", "qou", 
    "rai", "rau", "rei", "reu", "roi", "rou", 
    "sai", "sau", "sei", "seu", "soi", "sou", 
    "tai", "tau", "tei", "teu", "toi", "tou", 
    "vai", "vau", "vei", "veu", "voi", "vou", 
    "wai", "wau", "wei", "weu", "woi", "wou", 
    "xai", "xau", "xei", "xeu", "xoi", "xou", 
    "yai", "yau", "yei", "yeu", "yoi", "you", 
    "zai", "zau", "zei", "zeu", "zoi", "zou", 
    "cha", "che", "chi", "cho", "chu", 
    "sha", "she", "shi", "sho", "shu", 
    "tha", "the", "thi", "tho", "thu",
    "wha", "whe", "whi", "who", "whu",
    "pha", "phe", "phi", "pho", "phu",
    "zha", "zhe", "zhi", "zho", "zhu",
    "tra", "tre", "tri", "tro", "tru",
    "kha", "khe", "khi", "kho", "khu",
    "gha", "ghe", "ghi", "gho", "ghu",
    "sha", "she", "shi", "sho", "shu",
    "twa", "twe", "twi", "two", "twu",
    "qua", "que", "qui", "quo",
    "sla", "sle", "sli", "slo", "slu",
];

const OFFENSIVE_TERMS: [&str; 20] = [
    "shit", "fat", "whore", "nig",
    "jig", "cum", "fag", "twat", 
    "jiz", "kum", "anal", "quere", 
    "phuk", "fuk", "arab", "dik", 
    "jew", "slut", "tit", "phag"
];

const affirmations: [&str; 8] = [
    "You're doing great!",
    "Keep up the good work!",
    "Fantastic effort!",
    "You're on the right track!",
    "Excellent job!",
    "You're making progress!",
    "Keep it up!",
    "Great work!",
];

pub fn random_affirmation() -> String {
    let mut rng = rand::rng();
    let index = rng.random_range(0..affirmations.len());
    affirmations[index].to_string()
}

pub fn generate_name() -> String {
    
    let mut rng = rand::rng();
    let name_length = rng.random_range(2..5); // Generate a name with 2 to 4 syllables
    let mut name = String::new();

    for _ in 0..name_length {
        let syllable = SYLLABLES[rng.random_range(0..SYLLABLES.len())];
        name.push_str(syllable);
    }

    if OFFENSIVE_TERMS.iter().any(|&term| name.contains(term)) {
        return generate_name(); // Regenerate the name if it contains offensive terms
    }

    if name.len() > 8 {
        return generate_name(); // Regenerate the name if it contains too many characters
    }

    name[..1].to_ascii_uppercase() + &name[1..]
}


pub fn random_unit_intro() -> String {
    let mut rng = rand::rng();
    let unit_intros: [&str; 5] = [
        "It's time to learn about",
        "Let's dive into",
        "Get ready to explore",
        "Prepare to discover",
        "Let's embark on a journey to learn about",
    ];
    let index = rng.random_range(0..unit_intros.len());
    unit_intros[index].to_string()
}