use std::collections::BTreeMap;

use super::dynamic_state::{vato007::ingey::types::HostCsvRow, DynamicState};

pub struct CsvRow {
    pub values: BTreeMap<String, String>,
}

impl HostCsvRow for DynamicState {
    fn columns(&mut self, self_: wasmtime::component::Resource<CsvRow>) -> Vec<String> {
        let resource = self
            .resources
            .get(&self_)
            .expect("Failed to find the required resource");
        resource.values.keys().cloned().collect()
    }

    fn values(&mut self, self_: wasmtime::component::Resource<CsvRow>) -> Vec<String> {
        let resource = self
            .resources
            .get(&self_)
            .expect("Failed to find the required resource");
        resource.values.values().cloned().collect()
    }

    fn entries(&mut self, self_: wasmtime::component::Resource<CsvRow>) -> Vec<(String, String)> {
        let resource = self
            .resources
            .get(&self_)
            .expect("Failed to find the required resource");
        resource
            .values
            .keys()
            .map(|key| (key.clone(), resource.values.get(key).unwrap().clone()))
            .collect()
    }

    fn value(
        &mut self,
        self_: wasmtime::component::Resource<CsvRow>,
        name: String,
    ) -> Option<String> {
        let resource = self
            .resources
            .get(&self_)
            .expect("Failed to find the required resource");
        resource.values.get(&name).cloned()
    }

    fn drop(&mut self, rep: wasmtime::component::Resource<CsvRow>) -> wasmtime::Result<()> {
        self.resources.delete(rep)?;
        Ok(())
    }
}
