// src/services/init.service.js
// 초기 데이터 설정 서비스

const { User, LLMProvider } = require('../models');
const logger = require('../config/logger.config');

/**
 * 초기 관리자 계정 생성
 */
async function createDefaultAdmin() {
  try {
    const adminEmail = process.env.ADMIN_EMAIL || 'admin@admin.com';
    const adminPassword = process.env.ADMIN_PASSWORD || 'Admin123!';
    
    const existing = await User.findOne({ where: { email: adminEmail } });
    if (existing) {
      logger.info(`관리자 계정 이미 존재: ${adminEmail}`);
      return existing;
    }

    const admin = await User.create({
      email: adminEmail,
      password: adminPassword,
      name: '관리자',
      role: 'admin',
      status: 'active',
      plan: 'enterprise',
      monthlyTokenLimit: 10000000, // 1000만 토큰
    });

    logger.info(`✅ 기본 관리자 계정 생성: ${adminEmail}`);
    return admin;
  } catch (error) {
    logger.error('관리자 계정 생성 실패:', error);
    throw error;
  }
}

/**
 * 기본 LLM 프로바이더 생성
 */
async function createDefaultProviders() {
  try {
    const providers = [
      {
        name: 'gemini',
        displayName: 'Google Gemini',
        endpoint: null,
        apiKey: process.env.GEMINI_API_KEY || '',
        modelName: process.env.GEMINI_MODEL || 'gemini-2.0-flash',
        priority: 1,
        maxTokens: 8192,
        temperature: 0.7,
        timeoutMs: 60000,
        costPer1kInputTokens: 0.00025,
        costPer1kOutputTokens: 0.001,
      },
      {
        name: 'openai',
        displayName: 'OpenAI GPT',
        endpoint: 'https://api.openai.com/v1/chat/completions',
        apiKey: process.env.OPENAI_API_KEY || '',
        modelName: process.env.OPENAI_MODEL || 'gpt-4o-mini',
        priority: 2,
        maxTokens: 4096,
        temperature: 0.7,
        timeoutMs: 60000,
        costPer1kInputTokens: 0.00015,
        costPer1kOutputTokens: 0.0006,
      },
      {
        name: 'claude',
        displayName: 'Anthropic Claude',
        endpoint: 'https://api.anthropic.com/v1/messages',
        apiKey: process.env.CLAUDE_API_KEY || '',
        modelName: process.env.CLAUDE_MODEL || 'claude-3-haiku-20240307',
        priority: 3,
        maxTokens: 4096,
        temperature: 0.7,
        timeoutMs: 60000,
        costPer1kInputTokens: 0.00025,
        costPer1kOutputTokens: 0.00125,
      },
    ];

    for (const providerData of providers) {
      const existing = await LLMProvider.findOne({ where: { name: providerData.name } });
      if (existing) {
        // API 키가 환경변수에 설정되어 있고 DB에는 없으면 업데이트
        if (providerData.apiKey && !existing.apiKey) {
          existing.apiKey = providerData.apiKey;
          existing.modelName = providerData.modelName;
          await existing.save();
          logger.info(`LLM 프로바이더 API 키 업데이트: ${providerData.name}`);
        }
        continue;
      }

      await LLMProvider.create({
        ...providerData,
        isActive: true,
        isHealthy: !!providerData.apiKey, // API 키가 있으면 healthy
      });
      logger.info(`✅ LLM 프로바이더 생성: ${providerData.name} (${providerData.modelName})`);
    }
  } catch (error) {
    logger.error('LLM 프로바이더 생성 실패:', error);
    throw error;
  }
}

/**
 * 초기화 실행
 */
async function initialize() {
  logger.info('🔧 초기 데이터 설정 시작...');
  
  await createDefaultAdmin();
  await createDefaultProviders();
  
  logger.info('✅ 초기 데이터 설정 완료');
}

module.exports = {
  initialize,
  createDefaultAdmin,
  createDefaultProviders,
};
