/*
 * Copyright (c), Huawei Technologies Co., Ltd. 2025-2025. All rights reserved.
 */
use std::collections::HashMap;
use std::path::Path;
use serde::Deserialize;
use anyhow::Result;

pub mod loader;
pub mod validator;
pub mod generator;

// 公共类型定义(供所有模块使用)
#[derive(Debug, Deserialize)]
pub struct ModuleMeta {
    #[serde(rename = "source_type")]
    pub source_enum: String,
    #[serde(rename = "target_variant")]
    pub target_variant: String,
    pub start: u32,
    pub end: u32,
}

#[derive(Debug, Clone, Deserialize)]
pub struct ErrorItem {
    pub code: u32,
    pub en: String,
    pub zh: String,
    pub fields: Vec<String>,
}

#[derive(Debug, Deserialize)]
pub struct ErrorModule {
    pub meta: ModuleMeta,
    pub errors: HashMap<String, ErrorItem>,
}

pub type ModuleMap = HashMap<String, ErrorModule>;

static ERROR_FILE: &str = "/generated_errors/";

pub fn generate_error_modules(input_dir: &Path) -> Result<()> {
    // 1. 加载所有错误配置
    let config = loader::load_all_errors(input_dir)?;
    // 2. 校验错误码范围
    validator::validate(&config)?;
    // 3. 生成 Rust 代码
    generator::generate(&config)?;
    Ok(())
}

// 通用宏:引入单个模块
#[macro_export]
macro_rules! include_error_module {
    ($name:ident) => {
        pub mod $name {
            include!(concat!(env!("OUT_DIR"), "/generated_errors/", stringify!($name), ".rs"));
        }
    };
}