/**
 * 프로젝트 관리 컨트롤러
 *
 * 프로젝트 CRUD API 엔드포인트 핸들러
 *
 * @author TK-FB-Project
 * @since 2025-12-11
 */

const projectModel = require('../models/projectModel');
const { ValidationError, NotFoundError, DatabaseError } = require('../utils/errors');
const { asyncHandler } = require('../middlewares/errorHandler');
const logger = require('../utils/logger');
const cache = require('../utils/cache');

/**
 * 프로젝트 생성
 */
exports.createProject = asyncHandler(async (req, res) => {
  const projectData = req.body;

  logger.info('프로젝트 생성 요청', { name: projectData.name });

  const id = await projectModel.create(projectData);

  // 프로젝트 캐시 무효화
  await cache.invalidateCache.project();

  logger.info('프로젝트 생성 성공', { project_id: id });

  res.status(201).json({
    success: true,
    data: { project_id: id },
    message: '프로젝트가 성공적으로 생성되었습니다'
  });
});

/**
 * 전체 프로젝트 조회
 */
exports.getAllProjects = asyncHandler(async (req, res) => {
  const rows = await projectModel.getAll();

  res.json({
    success: true,
    data: rows,
    message: '프로젝트 목록 조회 성공'
  });
});

/**
 * 활성 프로젝트만 조회 (작업보고서용)
 */
exports.getActiveProjects = asyncHandler(async (req, res) => {
  const rows = await projectModel.getActiveProjects();

  res.json({
    success: true,
    data: rows,
    message: '활성 프로젝트 목록 조회 성공'
  });
});

/**
 * 단일 프로젝트 조회
 */
exports.getProjectById = asyncHandler(async (req, res) => {
  const id = parseInt(req.params.project_id, 10);

  if (isNaN(id)) {
    throw new ValidationError('유효하지 않은 프로젝트 ID입니다');
  }

  const row = await projectModel.getById(id);

  if (!row) {
    throw new NotFoundError('프로젝트를 찾을 수 없습니다');
  }

  res.json({
    success: true,
    data: row,
    message: '프로젝트 조회 성공'
  });
});

/**
 * 프로젝트 수정
 */
exports.updateProject = asyncHandler(async (req, res) => {
  const id = parseInt(req.params.project_id, 10);

  if (isNaN(id)) {
    throw new ValidationError('유효하지 않은 프로젝트 ID입니다');
  }

  const data = { ...req.body, project_id: id };

  const changes = await projectModel.update(data);

  if (changes === 0) {
    throw new NotFoundError('프로젝트를 찾을 수 없습니다');
  }

  // 프로젝트 캐시 무효화
  await cache.invalidateCache.project();

  logger.info('프로젝트 수정 성공', { project_id: id });

  res.json({
    success: true,
    data: { changes },
    message: '프로젝트 정보가 성공적으로 수정되었습니다'
  });
});

/**
 * 프로젝트 삭제
 */
exports.removeProject = asyncHandler(async (req, res) => {
  const id = parseInt(req.params.project_id, 10);

  if (isNaN(id)) {
    throw new ValidationError('유효하지 않은 프로젝트 ID입니다');
  }

  const changes = await projectModel.remove(id);

  if (changes === 0) {
    throw new NotFoundError('프로젝트를 찾을 수 없습니다');
  }

  // 프로젝트 캐시 무효화
  await cache.invalidateCache.project();

  logger.info('프로젝트 삭제 성공', { project_id: id });

  res.json({
    success: true,
    message: '프로젝트가 성공적으로 삭제되었습니다'
  });
});
