use std::path::Path;

use serde::{Deserialize, Serialize};

/// cvrf2cusa 自动化执行所需的配置
#[derive(Clone, Debug, Deserialize, Serialize)]
pub(crate) struct AutoConfig {
    // 对应cuavrs-db-cvrf
    source: String,

    // cuavrs-db-sa
    target: String,
}

impl AutoConfig {
    // 新建一个配置结构
    pub fn new(source: String, target: String) -> Self {
        Self { source, target }
    }

    // 从文件中读取配置
    pub fn from<P: AsRef<Path>>(path: P) -> crate::Result<Self> {
        let data = std::fs::read_to_string(path)?;

        Ok(serde_json::from_str::<Self>(&data)?)
    }

    // 获取 source 字段
    pub fn source(&self) -> &str {
        &self.source
    }

    // 获取 target 字段
    pub fn target(&self) -> &str {
        &self.target
    }
}

/// cuvars 中，关于源码追踪，自动修复相关的配置项，一般位于组件最底层的目录，`config.json`
#[derive(Clone, Debug, Deserialize, Serialize)]
pub(crate) struct RepairConfig {
    // 对应了 openEuelr 的上游版本, 例 22.03-LST，不可包含 openEuler 字段
    upstream: String,

    // 此组件是否支持自动修复
    autobuild: bool,

    // 当前已修复的最新版本号
    fixed_version: String,
}

#[allow(dead_code)]
impl RepairConfig {
    pub fn new(upstream: String, autobuild: bool, fixed_version: String) -> Self {
        RepairConfig {
            upstream,
            autobuild,
            fixed_version,
        }
    }

    /// 从指定的路径读取文件并将之转换为 `RepairConfig`
    pub fn from<P: AsRef<Path>>(path: P) -> crate::Result<Self> {
        let data = std::fs::read_to_string(path)?;

        Ok(serde_json::from_str::<Self>(&data)?)
    }

    /// 获取对应的上游代码分支
    pub fn upstream(&self) -> &str {
        &self.upstream
    }

    /// 此组件是否支持自动构建发布
    pub fn autobuild(&self) -> bool {
        self.autobuild
    }

    /// 已修复的最新代码版本
    pub fn fixed_version(&self) -> &str {
        &self.fixed_version
    }
}
