import { Request, Response } from "express";
import { AuthenticatedRequest } from "../middleware/authMiddleware";
import { query } from "../database/db";
import logger from "../utils/logger";

/**
 * 화면 컴포넌트별 파일 정보 조회 및 복원
 */
export const getScreenComponentFiles = async (
  req: AuthenticatedRequest,
  res: Response
): Promise<void> => {
  try {
    const { screenId } = req.params;

    logger.info(`화면 컴포넌트 파일 조회 시작: screenId=${screenId}`);

    // screen_files: 접두사로 해당 화면의 모든 파일 조회
    const targetObjidPattern = `screen_files:${screenId}:%`;

    const files = await query<any>(
      `SELECT * FROM attach_file_info
       WHERE target_objid LIKE $1
       AND status = 'ACTIVE'
       ORDER BY regdate DESC`,
      [`screen_files:${screenId}:%`]
    );

    // 컴포넌트별로 파일 그룹화
    const componentFiles: { [componentId: string]: any[] } = {};

    files.forEach((file) => {
      // target_objid 형식: screen_files:screenId:componentId:fieldName
      const targetParts = file.target_objid?.split(":") || [];
      if (targetParts.length >= 3) {
        const componentId = targetParts[2];

        if (!componentFiles[componentId]) {
          componentFiles[componentId] = [];
        }

        componentFiles[componentId].push({
          objid: file.objid.toString(),
          savedFileName: file.saved_file_name,
          realFileName: file.real_file_name,
          fileSize: Number(file.file_size),
          fileExt: file.file_ext,
          filePath: file.file_path,
          docType: file.doc_type,
          docTypeName: file.doc_type_name,
          targetObjid: file.target_objid,
          parentTargetObjid: file.parent_target_objid,
          writer: file.writer,
          regdate: file.regdate?.toISOString(),
          status: file.status,
        });
      }
    });

    logger.info(
      `화면 컴포넌트 파일 조회 완료: ${Object.keys(componentFiles).length}개 컴포넌트, 총 ${files.length}개 파일`
    );

    res.json({
      success: true,
      componentFiles: componentFiles,
      totalFiles: files.length,
      componentCount: Object.keys(componentFiles).length,
    });
  } catch (error) {
    logger.error("화면 컴포넌트 파일 조회 오류:", error);
    res.status(500).json({
      success: false,
      message: "화면 컴포넌트 파일 조회 중 오류가 발생했습니다.",
      error: error instanceof Error ? error.message : "알 수 없는 오류",
    });
  }
};

/**
 * 특정 컴포넌트의 파일 목록 조회
 */
export const getComponentFiles = async (
  req: AuthenticatedRequest,
  res: Response
): Promise<void> => {
  try {
    const { screenId, componentId } = req.params;

    logger.info(
      `컴포넌트 파일 조회: screenId=${screenId}, componentId=${componentId}`
    );

    // target_objid 패턴: screen_files:screenId:componentId:*
    const targetObjidPattern = `screen_files:${screenId}:${componentId}:`;

    const files = await query<any>(
      `SELECT * FROM attach_file_info
       WHERE target_objid LIKE $1
       AND status = 'ACTIVE'
       ORDER BY regdate DESC`,
      [`${targetObjidPattern}%`]
    );

    const fileList = files.map((file) => ({
      objid: file.objid.toString(),
      savedFileName: file.saved_file_name,
      realFileName: file.real_file_name,
      fileSize: Number(file.file_size),
      fileExt: file.file_ext,
      filePath: file.file_path,
      docType: file.doc_type,
      docTypeName: file.doc_type_name,
      targetObjid: file.target_objid,
      parentTargetObjid: file.parent_target_objid,
      writer: file.writer,
      regdate: file.regdate?.toISOString(),
      status: file.status,
    }));

    logger.info(`컴포넌트 파일 조회 완료: ${fileList.length}개 파일`);

    res.json({
      success: true,
      files: fileList,
      componentId: componentId,
      screenId: screenId,
    });
  } catch (error) {
    logger.error("컴포넌트 파일 조회 오류:", error);
    res.status(500).json({
      success: false,
      message: "컴포넌트 파일 조회 중 오류가 발생했습니다.",
      error: error instanceof Error ? error.message : "알 수 없는 오류",
    });
  }
};
