use crate::models::prelude::{ModelMetadata, V1AlphaReportDefinition};
use crate::models::HelpMetadata;
use std::collections::BTreeMap;
#[derive(Debug, PartialEq, Clone)]
pub struct ReportDefinition {
    pub full_name: String,
    pub metadata: ModelMetadata,
    pub additional_data: BTreeMap<String, String>,
    pub template: String,
}
impl HelpMetadata for ReportDefinition {
    fn metadata(&self) -> &ModelMetadata {
        &self.metadata
    }
    fn full_name(&self) -> String {
        self.full_name.to_string()
    }
}
impl TryFrom<V1AlphaReportDefinition> for ReportDefinition {
    type Error = anyhow::Error;
    fn try_from(value: V1AlphaReportDefinition) -> Result<Self, Self::Error> {
        Ok(ReportDefinition {
            full_name: value.full_name(),
            metadata: value.metadata,
            template: value.spec.template.trim().to_string(),
            additional_data: value.spec.additional_data,
        })
    }
}
#[cfg(test)]
mod tests {
    use crate::shared::models::parse_models_from_string;
    use std::collections::BTreeMap;
    use std::path::Path;
    #[test]
    fn test_parse_scope_report_def() {
        let text = "
---
apiVersion: scope.github.com/v1alpha
kind: ScopeReportDefinition
metadata:
  name: report
spec:
  additionalData:
    env: env
  template: |
    hello bob
 ";
        let path = Path::new("/foo/bar/file.yaml");
        let configs = parse_models_from_string(path, text).unwrap();
        assert_eq!(1, configs.len());
        let model = configs[0].get_report_def_spec().unwrap();
        assert_eq!("ScopeReportDefinition/report", model.full_name);
        assert_eq!("report", model.metadata.name());
        assert_eq!(
            "/foo/bar/file.yaml",
            model.metadata.annotations.file_path.unwrap()
        );
        assert_eq!("hello bob", model.template);
        let additional_data: BTreeMap<String, String> =
            [("env".to_string(), "env".to_string())].into();
        assert_eq!(additional_data, model.additional_data);
    }
}