import { Response } from "express";
import { AuthenticatedRequest } from "../middleware/authMiddleware";
import excelMappingService from "../services/excelMappingService";
import { logger } from "../utils/logger";

/**
 * 엑셀 컬럼 구조로 매핑 템플릿 조회
 * POST /api/excel-mapping/find
 */
export async function findMappingByColumns(
  req: AuthenticatedRequest,
  res: Response
): Promise<void> {
  try {
    const { tableName, excelColumns } = req.body;
    const companyCode = req.user?.companyCode || "*";

    if (!tableName || !excelColumns || !Array.isArray(excelColumns)) {
      res.status(400).json({
        success: false,
        message: "tableName과 excelColumns(배열)가 필요합니다.",
      });
      return;
    }

    logger.info("엑셀 매핑 템플릿 조회 요청", {
      tableName,
      excelColumns,
      companyCode,
      userId: req.user?.userId,
    });

    const template = await excelMappingService.findMappingByColumns(
      tableName,
      excelColumns,
      companyCode
    );

    if (template) {
      res.json({
        success: true,
        data: template,
        message: "기존 매핑 템플릿을 찾았습니다.",
      });
    } else {
      res.json({
        success: true,
        data: null,
        message: "일치하는 매핑 템플릿이 없습니다.",
      });
    }
  } catch (error: any) {
    logger.error("매핑 템플릿 조회 실패", { error: error.message });
    res.status(500).json({
      success: false,
      message: "매핑 템플릿 조회 중 오류가 발생했습니다.",
      error: error.message,
    });
  }
}

/**
 * 매핑 템플릿 저장 (UPSERT)
 * POST /api/excel-mapping/save
 */
export async function saveMappingTemplate(
  req: AuthenticatedRequest,
  res: Response
): Promise<void> {
  try {
    const { tableName, excelColumns, columnMappings } = req.body;
    const companyCode = req.user?.companyCode || "*";
    const userId = req.user?.userId;

    if (!tableName || !excelColumns || !columnMappings) {
      res.status(400).json({
        success: false,
        message: "tableName, excelColumns, columnMappings가 필요합니다.",
      });
      return;
    }

    logger.info("엑셀 매핑 템플릿 저장 요청", {
      tableName,
      excelColumns,
      columnMappings,
      companyCode,
      userId,
    });

    const template = await excelMappingService.saveMappingTemplate(
      tableName,
      excelColumns,
      columnMappings,
      companyCode,
      userId
    );

    res.json({
      success: true,
      data: template,
      message: "매핑 템플릿이 저장되었습니다.",
    });
  } catch (error: any) {
    logger.error("매핑 템플릿 저장 실패", { error: error.message });
    res.status(500).json({
      success: false,
      message: "매핑 템플릿 저장 중 오류가 발생했습니다.",
      error: error.message,
    });
  }
}

/**
 * 테이블의 매핑 템플릿 목록 조회
 * GET /api/excel-mapping/list/:tableName
 */
export async function getMappingTemplates(
  req: AuthenticatedRequest,
  res: Response
): Promise<void> {
  try {
    const { tableName } = req.params;
    const companyCode = req.user?.companyCode || "*";

    if (!tableName) {
      res.status(400).json({
        success: false,
        message: "tableName이 필요합니다.",
      });
      return;
    }

    logger.info("매핑 템플릿 목록 조회 요청", {
      tableName,
      companyCode,
    });

    const templates = await excelMappingService.getMappingTemplates(
      tableName,
      companyCode
    );

    res.json({
      success: true,
      data: templates,
    });
  } catch (error: any) {
    logger.error("매핑 템플릿 목록 조회 실패", { error: error.message });
    res.status(500).json({
      success: false,
      message: "매핑 템플릿 목록 조회 중 오류가 발생했습니다.",
      error: error.message,
    });
  }
}

/**
 * 매핑 템플릿 삭제
 * DELETE /api/excel-mapping/:id
 */
export async function deleteMappingTemplate(
  req: AuthenticatedRequest,
  res: Response
): Promise<void> {
  try {
    const { id } = req.params;
    const companyCode = req.user?.companyCode || "*";

    if (!id) {
      res.status(400).json({
        success: false,
        message: "id가 필요합니다.",
      });
      return;
    }

    logger.info("매핑 템플릿 삭제 요청", {
      id,
      companyCode,
    });

    const deleted = await excelMappingService.deleteMappingTemplate(
      parseInt(id),
      companyCode
    );

    if (deleted) {
      res.json({
        success: true,
        message: "매핑 템플릿이 삭제되었습니다.",
      });
    } else {
      res.status(404).json({
        success: false,
        message: "삭제할 매핑 템플릿을 찾을 수 없습니다.",
      });
    }
  } catch (error: any) {
    logger.error("매핑 템플릿 삭제 실패", { error: error.message });
    res.status(500).json({
      success: false,
      message: "매핑 템플릿 삭제 중 오류가 발생했습니다.",
      error: error.message,
    });
  }
}

