use crate::utils::TransformRecord;

#[derive(Debug, Clone, PartialEq, Eq)]
pub struct TransformActionDeclaration {
    pub action_name: String,
    pub implementation_ref: String,
    pub implementation_version: String,
}

pub fn declare_transform_action(
    action_name: &str,
    implementation_ref: &str,
    implementation_version: &str,
) -> TransformActionDeclaration {
    TransformActionDeclaration {
        action_name: action_name.to_string(),
        implementation_ref: implementation_ref.to_string(),
        implementation_version: implementation_version.to_string(),
    }
}

pub fn log_transform(record: &TransformRecord) {
    log::debug!("logged {:?}", record);
}

#[cfg(test)]
mod tests {
    use super::*;
    use crate::utils::{DGGSCell, Hash, TransformRecord};

    #[test]
    fn declare_transform_action_records_external_implementation() {
        let action =
            declare_transform_action("nc_to_zarr", "container://pipeline/nc2zarr", "v1.2.0");
        assert_eq!(action.action_name, "nc_to_zarr");
        assert_eq!(action.implementation_ref, "container://pipeline/nc2zarr");
        assert_eq!(action.implementation_version, "v1.2.0");
    }

    #[test]
    fn log_transform_does_not_panic() {
        let record = TransformRecord {
            step: "decode".to_string(),
            params: serde_json::json!({"mode": "test"}),
            in_hash: Hash([1u8; 32]),
            out_hash: Hash([2u8; 32]),
            cell: DGGSCell { id: 42 },
        };
        log_transform(&record);
    }
}
