// src/models/llm-provider.model.js
// LLM 프로바이더 모델

const { DataTypes } = require('sequelize');

module.exports = (sequelize) => {
  const LLMProvider = sequelize.define('LLMProvider', {
    id: {
      type: DataTypes.UUID,
      defaultValue: DataTypes.UUIDV4,
      primaryKey: true,
    },
    name: {
      type: DataTypes.STRING(50),
      allowNull: false,
      unique: true,
      comment: '프로바이더 이름 (gemini, openai, claude 등)',
    },
    displayName: {
      type: DataTypes.STRING(100),
      allowNull: false,
      comment: '표시 이름',
    },
    endpoint: {
      type: DataTypes.STRING(500),
      allowNull: true,
      comment: 'API 엔드포인트 URL',
    },
    apiKey: {
      type: DataTypes.TEXT,
      allowNull: true,
      comment: 'API 키 (암호화 저장 권장)',
    },
    modelName: {
      type: DataTypes.STRING(100),
      allowNull: false,
      comment: '기본 모델 이름',
    },
    priority: {
      type: DataTypes.INTEGER,
      defaultValue: 100,
      comment: '우선순위 (낮을수록 우선)',
    },
    maxTokens: {
      type: DataTypes.INTEGER,
      defaultValue: 4096,
      comment: '최대 토큰 수',
    },
    temperature: {
      type: DataTypes.FLOAT,
      defaultValue: 0.7,
      comment: '기본 온도',
    },
    timeoutMs: {
      type: DataTypes.INTEGER,
      defaultValue: 60000,
      comment: '타임아웃 (밀리초)',
    },
    costPer1kInputTokens: {
      type: DataTypes.DECIMAL(10, 6),
      defaultValue: 0,
      comment: '입력 토큰 1K당 비용 (USD)',
    },
    costPer1kOutputTokens: {
      type: DataTypes.DECIMAL(10, 6),
      defaultValue: 0,
      comment: '출력 토큰 1K당 비용 (USD)',
    },
    isActive: {
      type: DataTypes.BOOLEAN,
      defaultValue: true,
      comment: '활성화 여부',
    },
    isHealthy: {
      type: DataTypes.BOOLEAN,
      defaultValue: true,
      comment: '건강 상태',
    },
    lastHealthCheck: {
      type: DataTypes.DATE,
      allowNull: true,
      comment: '마지막 헬스 체크 시간',
    },
    healthCheckUrl: {
      type: DataTypes.STRING(500),
      allowNull: true,
      comment: '헬스 체크 URL',
    },
    config: {
      type: DataTypes.JSONB,
      defaultValue: {},
      comment: '추가 설정',
    },
  }, {
    tableName: 'llm_providers',
    timestamps: true,
    underscored: true,
    indexes: [
      {
        fields: ['name'],
        unique: true,
      },
      {
        fields: ['priority'],
      },
      {
        fields: ['is_active', 'is_healthy'],
      },
    ],
  });

  // 클래스 메서드: 활성 프로바이더 목록 조회 (우선순위 순)
  LLMProvider.getActiveProviders = async function() {
    return this.findAll({
      where: { isActive: true },
      order: [['priority', 'ASC']],
    });
  };

  // 클래스 메서드: 건강한 프로바이더 목록 조회
  LLMProvider.getHealthyProviders = async function() {
    return this.findAll({
      where: { isActive: true, isHealthy: true },
      order: [['priority', 'ASC']],
    });
  };

  // 인스턴스 메서드: 헬스 상태 업데이트
  LLMProvider.prototype.updateHealth = async function(isHealthy) {
    this.isHealthy = isHealthy;
    this.lastHealthCheck = new Date();
    await this.save();
  };

  // 인스턴스 메서드: 비용 계산
  LLMProvider.prototype.calculateCost = function(promptTokens, completionTokens) {
    const inputCost = (promptTokens / 1000) * parseFloat(this.costPer1kInputTokens || 0);
    const outputCost = (completionTokens / 1000) * parseFloat(this.costPer1kOutputTokens || 0);
    return inputCost + outputCost;
  };

  return LLMProvider;
};
