/**
 * vacationTypeController.js
 * 휴가 유형 관련 컨트롤러
 */

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

const vacationTypeController = {
  /**
   * 모든 활성 휴가 유형 조회
   * GET /api/vacation-types
   */
  async getAllTypes(req, res) {
    try {
      const results = await vacationTypeModel.getAll();
      res.json({ success: true, data: results });
    } catch (error) {
      logger.error('휴가 유형 조회 오류:', error);
      res.status(500).json({ success: false, message: '휴가 유형을 조회하는 중 오류가 발생했습니다' });
    }
  },

  /**
   * 시스템 기본 휴가 유형 조회
   * GET /api/vacation-types/system
   */
  async getSystemTypes(req, res) {
    try {
      const results = await vacationTypeModel.getSystemTypes();
      res.json({ success: true, data: results });
    } catch (error) {
      logger.error('시스템 휴가 유형 조회 오류:', error);
      res.status(500).json({ success: false, message: '시스템 휴가 유형을 조회하는 중 오류가 발생했습니다' });
    }
  },

  /**
   * 특별 휴가 유형 조회
   * GET /api/vacation-types/special
   */
  async getSpecialTypes(req, res) {
    try {
      const results = await vacationTypeModel.getSpecialTypes();
      res.json({ success: true, data: results });
    } catch (error) {
      logger.error('특별 휴가 유형 조회 오류:', error);
      res.status(500).json({ success: false, message: '특별 휴가 유형을 조회하는 중 오류가 발생했습니다' });
    }
  },

  /**
   * 특별 휴가 유형 생성 (관리자만)
   * POST /api/vacation-types
   */
  async createType(req, res) {
    try {
      const { type_code, type_name, deduct_days, priority, description } = req.body;

      if (!type_code || !type_name || !deduct_days) {
        return res.status(400).json({
          success: false,
          message: '필수 필드가 누락되었습니다 (type_code, type_name, deduct_days)'
        });
      }

      // type_code 중복 체크
      const existingTypes = await vacationTypeModel.getByCode(type_code);
      if (existingTypes && existingTypes.length > 0) {
        return res.status(400).json({ success: false, message: '이미 존재하는 type_code입니다' });
      }

      const typeData = {
        type_code,
        type_name,
        deduct_days,
        priority: priority || 50,
        description: description || null,
        is_special: true,
        is_system: false,
        is_active: true
      };

      const result = await vacationTypeModel.create(typeData);
      res.status(201).json({
        success: true,
        message: '특별 휴가 유형이 생성되었습니다',
        data: { id: result.insertId }
      });
    } catch (error) {
      logger.error('휴가 유형 생성 오류:', error);
      res.status(500).json({ success: false, message: '서버 오류가 발생했습니다' });
    }
  },

  /**
   * 휴가 유형 수정 (관리자만)
   * PUT /api/vacation-types/:id
   */
  async updateType(req, res) {
    try {
      const { id } = req.params;
      const { type_name, deduct_days, priority, description, is_active } = req.body;

      const types = await vacationTypeModel.getById(id);
      if (!types || types.length === 0) {
        return res.status(404).json({ success: false, message: '휴가 유형을 찾을 수 없습니다' });
      }

      const type = types[0];
      const updateData = {};

      if (type.is_system) {
        if (priority !== undefined) updateData.priority = priority;
        if (description !== undefined) updateData.description = description;
      } else {
        if (type_name) updateData.type_name = type_name;
        if (deduct_days !== undefined) updateData.deduct_days = deduct_days;
        if (priority !== undefined) updateData.priority = priority;
        if (description !== undefined) updateData.description = description;
        if (is_active !== undefined) updateData.is_active = is_active;
      }

      if (Object.keys(updateData).length === 0) {
        return res.status(400).json({ success: false, message: '수정할 데이터가 없습니다' });
      }

      updateData.updated_at = new Date();
      await vacationTypeModel.update(id, updateData);
      res.json({ success: true, message: '휴가 유형이 수정되었습니다' });
    } catch (error) {
      logger.error('휴가 유형 수정 오류:', error);
      res.status(500).json({ success: false, message: '서버 오류가 발생했습니다' });
    }
  },

  /**
   * 특별 휴가 유형 삭제 (관리자만, 시스템 기본 휴가는 삭제 불가)
   * DELETE /api/vacation-types/:id
   */
  async deleteType(req, res) {
    try {
      const { id } = req.params;
      const result = await vacationTypeModel.delete(id);

      if (result.affectedRows === 0) {
        return res.status(400).json({
          success: false,
          message: '삭제할 수 없습니다. 시스템 기본 휴가이거나 존재하지 않는 휴가 유형입니다'
        });
      }

      res.json({ success: true, message: '휴가 유형이 삭제되었습니다' });
    } catch (error) {
      logger.error('휴가 유형 삭제 오류:', error);
      res.status(500).json({ success: false, message: '서버 오류가 발생했습니다' });
    }
  },

  /**
   * 휴가 유형 우선순위 일괄 업데이트 (관리자만)
   * PUT /api/vacation-types/priorities
   */
  async updatePriorities(req, res) {
    try {
      const { priorities } = req.body;

      if (!priorities || !Array.isArray(priorities)) {
        return res.status(400).json({ success: false, message: 'priorities 배열이 필요합니다' });
      }

      for (const { id, priority } of priorities) {
        await vacationTypeModel.updatePriority(id, priority);
      }

      res.json({
        success: true,
        message: '우선순위가 업데이트되었습니다',
        data: { updated: priorities.length }
      });
    } catch (error) {
      logger.error('우선순위 업데이트 오류:', error);
      res.status(500).json({ success: false, message: '서버 오류가 발생했습니다' });
    }
  }
};

module.exports = vacationTypeController;
