/**
 * CORS 설정
 *
 * Cross-Origin Resource Sharing 설정
 *
 * @author TK-FB-Project
 * @since 2025-12-11
 */

const logger = require('../utils/logger');

/**
 * 허용된 Origin 목록
 */
const allowedOrigins = [
  'https://tkfb.technicalkorea.net',      // System 1 (공장관리)
  'https://tkds.technicalkorea.net',      // Gateway/Dashboard
  'https://tkreport.technicalkorea.net',   // System 2
  'https://tkqc.technicalkorea.net',       // System 3
  'https://tkuser.technicalkorea.net',     // User Management
  'https://tkpurchase.technicalkorea.net', // Purchase Management
  'https://tksafety.technicalkorea.net',   // Safety Management
  'https://tksupport.technicalkorea.net',  // Support Management
  'http://localhost:20000',   // 웹 UI (로컬)
  'http://localhost:30080',   // 웹 UI (Docker)
  'http://localhost:3005',    // API 서버
  'http://localhost:3000',    // 개발 포트
  'http://127.0.0.1:20000',
  'http://127.0.0.1:3005',
  'http://127.0.0.1:3000'
];

/**
 * CORS 설정 옵션
 */
const corsOptions = {
  /**
   * Origin 검증 함수
   */
  origin: function (origin, callback) {
    // Origin이 없는 경우 (직접 접근, Postman 등)
    if (!origin) {
      logger.debug('CORS: Origin 없음 - 허용');
      return callback(null, true);
    }

    // 허용된 Origin 확인
    if (allowedOrigins.includes(origin)) {
      logger.debug('CORS: 허용된 Origin', { origin });
      return callback(null, true);
    }

    // 개발 환경에서는 모든 localhost 허용
    if (process.env.NODE_ENV === 'development') {
      if (origin.includes('localhost') || origin.includes('127.0.0.1')) {
        logger.debug('CORS: 로컬호스트 허용 (개발 모드)', { origin });
        return callback(null, true);
      }
    }

    // 로컬 네트워크 IP 자동 허용 (192.168.x.x)
    if (origin.match(/^http:\/\/192\.168\.\d+\.\d+(:\d+)?$/)) {
      logger.debug('CORS: 로컬 네트워크 IP 허용', { origin });
      return callback(null, true);
    }

    // 차단
    logger.warn('CORS: 차단된 Origin', { origin });
    callback(new Error(`CORS 정책에 의해 차단됨: ${origin}`));
  },

  /**
   * 인증 정보 포함 허용
   */
  credentials: true,

  /**
   * 허용된 HTTP 메소드
   */
  methods: ['GET', 'POST', 'PUT', 'DELETE', 'PATCH', 'OPTIONS'],

  /**
   * 허용된 헤더
   */
  allowedHeaders: ['Content-Type', 'Authorization', 'X-Requested-With', 'X-Internal-Service-Key'],

  /**
   * 노출할 헤더
   */
  exposedHeaders: ['Content-Range', 'X-Content-Range'],

  /**
   * Preflight 요청 캐시 시간 (초)
   */
  maxAge: 86400 // 24시간
};

module.exports = corsOptions;
