"use strict";
var __importDefault = (this && this.__importDefault) || function (mod) {
    return (mod && mod.__esModule) ? mod : { "default": mod };
};
Object.defineProperty(exports, "__esModule", { value: true });
exports.config = void 0;
const dotenv_1 = __importDefault(require("dotenv"));
const path_1 = __importDefault(require("path"));
const fs_1 = __importDefault(require("fs"));
// 使用 process.cwd() 获取项目根目录（server目录）
const projectRoot = process.cwd();
dotenv_1.default.config({ path: path_1.default.resolve(projectRoot, '.env') });
// 加载模型配置
const modelsConfig = JSON.parse(fs_1.default.readFileSync(path_1.default.join(__dirname, 'models.json'), 'utf-8'));
// 获取所有模型（扁平化）
function getAllModels() {
    const models = [];
    for (const [vendorKey, vendor] of Object.entries(modelsConfig.vendors)) {
        for (const model of vendor.models) {
            models.push({
                ...model,
                vendor: vendorKey,
                vendorName: vendor.name,
                baseUrl: vendor.baseUrl,
                apiKey: vendor.apiKey,
                apiType: vendor.apiType,
            });
        }
    }
    return models;
}
// 获取启用的模型
function getEnabledModels() {
    return getAllModels().filter((m) => m.enabled);
}
// 根据 ID 获取模型配置
function getModel(id) {
    return getAllModels().find((m) => m.id === id);
}
// 根据类型获取模型列表 (text, tts, image, video)
function getModelsByType(type) {
    return getAllModels().filter((m) => m.input?.includes(type) && m.enabled);
}
// 检查模型是否可切换（根据错误类型判断是否需要切换）
function shouldSwitchModel(error) {
    if (!error)
        return false;
    const message = error?.message || error?.error?.message || '';
    // 限流、余额不足、服务不可用、模型不支持等错误需要切换
    const switchableErrors = [
        'rate limit', 'quota', 'token', 'balance', 'insufficient',
        'invalid model', 'model not found', 'model not support',
        '429', '403', '502', '503', '504',
        'too many requests', '请求过于频繁'
    ];
    return switchableErrors.some(e => message.toLowerCase().includes(e));
}
// 获取下一个可用模型（用于自动切换）
function getNextModel(currentModelId, type) {
    const models = getModelsByType(type);
    const currentIndex = models.findIndex((m) => m.id === currentModelId);
    if (currentIndex === -1 || currentIndex >= models.length - 1) {
        return null; // 没有下一个模型
    }
    return models[currentIndex + 1].id;
}
exports.config = {
    port: parseInt(process.env.PORT || '3000', 10),
    nodeEnv: process.env.NODE_ENV || 'development',
    mongodb: {
        uri: process.env.MONGODB_URI || 'mongodb://localhost:27017/audio-book',
    },
    jwt: {
        // 临时硬编码，确保登录和验证一致
        secret: 'my-jwt-secret-key-2024',
        expiresIn: process.env.JWT_EXPIRES_IN || '7d',
    },
    // 阿里云百炼 DashScope TTS
    dashscope: {
        apiKey: process.env.DASHSCOPE_API_KEY || '',
        model: process.env.DASHSCOPE_MODEL || 'qwen3-tts-instruct-flash',
        voice: process.env.DASHSCOPE_VOICE || 'Cherry',
        // 可用 TTS 模型列表（随机选用）
        ttsModels: (process.env.DASHSCOPE_TTS_MODELS || 'qwen3-tts-instruct-flash').split(',').filter(Boolean),
        // 长文本模式使用 WebSocket 实时合成
        useRealtime: process.env.DASHSCOPE_USE_REALTIME === 'true',
        realtimeModel: process.env.DASHSCOPE_REALTIME_MODEL || 'qwen3-tts-instruct-flash-realtime',
    },
    // 模型配置（统一管理）
    models: {
        vendors: modelsConfig.vendors,
        list: getAllModels(),
        enabled: getEnabledModels(),
        getModel,
        getModelsByType,
        shouldSwitchModel,
        getNextModel,
        textGeneration: {
            defaultModel: modelsConfig.textGeneration.defaultModel,
        },
        tts: {
            defaultModel: modelsConfig.tts.defaultModel,
            defaultVoice: modelsConfig.tts.defaultVoice,
        },
    },
    upload: {
        dir: path_1.default.join(process.cwd(), 'uploads'),
        maxSize: 50 * 1024 * 1024, // 50MB
    },
};
