use proto::*;

use std::collections::HashMap;

#[derive(Debug, Default, Clone)]
pub struct GachaProgress {
    /// The pity (counting how many pulls) of this pull (in previous record) or the next pull (in status).
    pub pity: u32,
    /// The failure times of this category.
    pub categories_progress_map: HashMap<String, u32>,
    /// The selected priority (category) for a Chooseable category.
    pub categories_chosen_guarantee_category_map: HashMap<String, String>,
    /// The selectedpriority (a specified item) for a Chooseable category.
    pub categories_chosen_guarantee_item_map: HashMap<String, u32>,
    /// The failure times for selected priority (a specified item).
    pub categories_chosen_guarantee_progress_map: HashMap<String, u32>,
}

impl GachaProgress {
    pub fn from_bin(bin: GachaProgressBin) -> Self {
        Self {
            pity: bin.pity,
            categories_progress_map: bin.categories_progress_map,
            categories_chosen_guarantee_category_map: bin.categories_chosen_guarantee_category_map,
            categories_chosen_guarantee_item_map: bin.categories_chosen_guarantee_item_map,
            categories_chosen_guarantee_progress_map: bin.categories_chosen_guarantee_progress_map,
        }
    }

    pub fn to_bin(&self) -> GachaProgressBin {
        GachaProgressBin {
            pity: self.pity,
            categories_progress_map: self.categories_progress_map.clone(),
            categories_chosen_guarantee_category_map: self
                .categories_chosen_guarantee_category_map
                .clone(),
            categories_chosen_guarantee_item_map: self.categories_chosen_guarantee_item_map.clone(),
            categories_chosen_guarantee_progress_map: self
                .categories_chosen_guarantee_progress_map
                .clone(),
        }
    }
}

#[derive(Debug, Default, Clone)]
pub struct GachaStatus {
    pub rarity_status_map: HashMap<u32, GachaProgress>,
    pub discount_usage_map: HashMap<String, u32>,
}

impl GachaStatus {
    pub fn from_bin(bin: GachaStatusBin) -> Self {
        Self {
            rarity_status_map: bin
                .rarity_status_map
                .into_iter()
                .map(|(k, v)| (k, GachaProgress::from_bin(v)))
                .collect(),
            discount_usage_map: bin.discount_usage_map,
        }
    }

    pub fn to_bin(&self) -> GachaStatusBin {
        GachaStatusBin {
            rarity_status_map: self
                .rarity_status_map
                .iter()
                .map(|(k, v)| (k.clone(), v.to_bin()))
                .collect(),
            discount_usage_map: self.discount_usage_map.clone(),
        }
    }
}
