//! 应用配置管理

/// 默认 JWT 密钥（开发环境用，生产环境必须通过 JWT_SECRET 环境变量覆盖）
pub const JWT_SECRET_DEFAULT: &str = "pms-dev-secret-change-me-in-production";

/// 用户默认密码（创建用户或重置密码时使用）
pub const DEFAULT_PASSWORD: &str = "123456";

/// 应用配置
pub struct Config {
    pub database_url: String,
    pub redis_url: String,
    pub host: String,
    pub port: u16,
    /// TCP 设备通讯端口
    pub tcp_port: u16,
    /// JWT 签名密钥
    pub jwt_secret: String,
}

impl Config {
    /// 从环境变量加载配置，优先读取 `.env` 文件
    pub fn from_env() -> Self {
        // 忽略 dotenvy 加载失败（生产环境可能通过系统 env 注入）
        let _ = dotenvy::dotenv();

        Self {
            database_url: std::env::var("DATABASE_URL")
                .expect("DATABASE_URL must be set"),
            redis_url: std::env::var("REDIS_URL")
                .expect("REDIS_URL must be set"),
            host: std::env::var("HOST").unwrap_or_else(|_| "0.0.0.0".to_string()),
            port: std::env::var("PORT")
                .unwrap_or_else(|_| "3000".to_string())
                .parse()
                .expect("PORT must be a valid number"),
            tcp_port: std::env::var("TCP_PORT")
                .unwrap_or_else(|_| "3002".to_string())
                .parse()
                .expect("TCP_PORT must be a valid number"),
            jwt_secret: std::env::var("JWT_SECRET")
                .unwrap_or_else(|_| JWT_SECRET_DEFAULT.to_string()),
        }
    }

    /// 校验配置安全性，打印警告
    pub fn validate(&self) {
        if self.jwt_secret == JWT_SECRET_DEFAULT {
            tracing::warn!("使用默认JWT密钥，生产环境请设置JWT_SECRET环境变量");
        }
    }
}
