/**
 * 도구 관리 서비스
 *
 * 도구(공구) 재고 및 위치 관리 관련 비즈니스 로직 처리
 *
 * @author TK-FB-Project
 * @since 2025-12-11
 */

const toolsModel = require('../models/toolsModel');
const { ValidationError, NotFoundError, DatabaseError } = require('../utils/errors');
const logger = require('../utils/logger');

/**
 * 전체 도구 조회
 */
const getAllToolsService = async () => {
  logger.info('도구 목록 조회 요청');

  try {
    const rows = await toolsModel.getAll();

    logger.info('도구 목록 조회 성공', { count: rows.length });

    return rows;
  } catch (error) {
    logger.error('도구 목록 조회 실패', { error: error.message });
    throw new DatabaseError('도구 목록 조회 중 오류가 발생했습니다');
  }
};

/**
 * 단일 도구 조회
 */
const getToolByIdService = async (id) => {
  // ID 검증
  if (!id || isNaN(id)) {
    throw new ValidationError('유효하지 않은 도구 ID입니다');
  }

  logger.info('도구 조회 요청', { tool_id: id });

  try {
    const row = await toolsModel.getById(id);

    if (!row) {
      logger.warn('도구를 찾을 수 없음', { tool_id: id });
      throw new NotFoundError('도구를 찾을 수 없습니다');
    }

    logger.info('도구 조회 성공', { tool_id: id });

    return row;
  } catch (error) {
    if (error instanceof NotFoundError) {
      throw error;
    }

    logger.error('도구 조회 실패', { tool_id: id, error: error.message });
    throw new DatabaseError('도구 조회 중 오류가 발생했습니다');
  }
};

/**
 * 도구 생성
 */
const createToolService = async (toolData) => {
  const { name, location, stock, status, factory_id } = toolData;

  // 필수 필드 검증
  if (!name) {
    throw new ValidationError('도구 이름이 필요합니다', {
      required: ['name'],
      received: { name }
    });
  }

  logger.info('도구 생성 요청', { name, location, stock, status });

  try {
    const insertId = await toolsModel.create(toolData);

    logger.info('도구 생성 성공', { tool_id: insertId, name });

    return { tool_id: insertId };
  } catch (error) {
    logger.error('도구 생성 실패', {
      name,
      error: error.message
    });
    throw new DatabaseError('도구 생성 중 오류가 발생했습니다');
  }
};

/**
 * 도구 수정
 */
const updateToolService = async (id, toolData) => {
  // ID 검증
  if (!id || isNaN(id)) {
    throw new ValidationError('유효하지 않은 도구 ID입니다');
  }

  logger.info('도구 수정 요청', { tool_id: id, updates: toolData });

  try {
    const affectedRows = await toolsModel.update(id, toolData);

    if (affectedRows === 0) {
      logger.warn('도구를 찾을 수 없거나 변경사항 없음', { tool_id: id });
      throw new NotFoundError('도구를 찾을 수 없습니다');
    }

    logger.info('도구 수정 성공', { tool_id: id, affectedRows });

    return { changes: affectedRows };
  } catch (error) {
    if (error instanceof NotFoundError) {
      throw error;
    }

    logger.error('도구 수정 실패', {
      tool_id: id,
      error: error.message
    });
    throw new DatabaseError('도구 수정 중 오류가 발생했습니다');
  }
};

/**
 * 도구 삭제
 */
const deleteToolService = async (id) => {
  // ID 검증
  if (!id || isNaN(id)) {
    throw new ValidationError('유효하지 않은 도구 ID입니다');
  }

  logger.info('도구 삭제 요청', { tool_id: id });

  try {
    const affectedRows = await toolsModel.remove(id);

    if (affectedRows === 0) {
      logger.warn('도구를 찾을 수 없음', { tool_id: id });
      throw new NotFoundError('도구를 찾을 수 없습니다');
    }

    logger.info('도구 삭제 성공', { tool_id: id, affectedRows });

    return { changes: affectedRows };
  } catch (error) {
    if (error instanceof NotFoundError) {
      throw error;
    }

    logger.error('도구 삭제 실패', {
      tool_id: id,
      error: error.message
    });
    throw new DatabaseError('도구 삭제 중 오류가 발생했습니다');
  }
};

module.exports = {
  getAllToolsService,
  getToolByIdService,
  createToolService,
  updateToolService,
  deleteToolService
};
