/**
 * 스케줄 자동 생성 컨트롤러
 *
 * 스케줄 미리보기, 적용, 조회 API를 제공합니다.
 */

import { Request, Response } from "express";
import { ScheduleService } from "../services/scheduleService";

export class ScheduleController {
  private scheduleService: ScheduleService;

  constructor() {
    this.scheduleService = new ScheduleService();
  }

  /**
   * 스케줄 미리보기
   * POST /api/schedule/preview
   *
   * 선택한 소스 데이터를 기반으로 생성될 스케줄을 미리보기합니다.
   * 실제 저장은 하지 않습니다.
   */
  preview = async (req: Request, res: Response): Promise<void> => {
    try {
      const { config, sourceData, period } = req.body;
      const userId = (req as any).user?.userId || "system";
      const companyCode = (req as any).user?.companyCode || "*";

      console.log("[ScheduleController] preview 호출:", {
        scheduleType: config?.scheduleType,
        sourceDataCount: sourceData?.length,
        period,
        userId,
        companyCode,
      });

      // 필수 파라미터 검증
      if (!config || !config.scheduleType) {
        res.status(400).json({
          success: false,
          message: "스케줄 설정(config)이 필요합니다.",
        });
        return;
      }

      if (!sourceData || sourceData.length === 0) {
        res.status(400).json({
          success: false,
          message: "소스 데이터가 필요합니다.",
        });
        return;
      }

      // 미리보기 생성
      const preview = await this.scheduleService.generatePreview(
        config,
        sourceData,
        period,
        companyCode
      );

      res.json({
        success: true,
        preview,
      });
    } catch (error: any) {
      console.error("[ScheduleController] preview 오류:", error);
      res.status(500).json({
        success: false,
        message: error.message || "스케줄 미리보기 중 오류가 발생했습니다.",
      });
    }
  };

  /**
   * 스케줄 적용
   * POST /api/schedule/apply
   *
   * 미리보기 결과를 실제로 저장합니다.
   */
  apply = async (req: Request, res: Response): Promise<void> => {
    try {
      const { config, preview, options } = req.body;
      const userId = (req as any).user?.userId || "system";
      const companyCode = (req as any).user?.companyCode || "*";

      console.log("[ScheduleController] apply 호출:", {
        scheduleType: config?.scheduleType,
        createCount: preview?.summary?.createCount,
        deleteCount: preview?.summary?.deleteCount,
        options,
        userId,
        companyCode,
      });

      // 필수 파라미터 검증
      if (!config || !preview) {
        res.status(400).json({
          success: false,
          message: "설정(config)과 미리보기(preview)가 필요합니다.",
        });
        return;
      }

      // 적용
      const applied = await this.scheduleService.applySchedules(
        config,
        preview,
        options || { deleteExisting: true, updateMode: "replace" },
        companyCode,
        userId
      );

      res.json({
        success: true,
        applied,
        message: `${applied.created}건 생성, ${applied.deleted}건 삭제, ${applied.updated}건 수정되었습니다.`,
      });
    } catch (error: any) {
      console.error("[ScheduleController] apply 오류:", error);
      res.status(500).json({
        success: false,
        message: error.message || "스케줄 적용 중 오류가 발생했습니다.",
      });
    }
  };

  /**
   * 스케줄 목록 조회
   * GET /api/schedule/list
   *
   * 타임라인 표시용 스케줄 목록을 조회합니다.
   */
  list = async (req: Request, res: Response): Promise<void> => {
    try {
      const {
        scheduleType,
        resourceType,
        resourceId,
        startDate,
        endDate,
        status,
      } = req.query;
      const companyCode = (req as any).user?.companyCode || "*";

      console.log("[ScheduleController] list 호출:", {
        scheduleType,
        resourceType,
        resourceId,
        startDate,
        endDate,
        status,
        companyCode,
      });

      const result = await this.scheduleService.getScheduleList({
        scheduleType: scheduleType as string,
        resourceType: resourceType as string,
        resourceId: resourceId as string,
        startDate: startDate as string,
        endDate: endDate as string,
        status: status as string,
        companyCode,
      });

      res.json({
        success: true,
        data: result.data,
        total: result.total,
      });
    } catch (error: any) {
      console.error("[ScheduleController] list 오류:", error);
      res.status(500).json({
        success: false,
        message: error.message || "스케줄 조회 중 오류가 발생했습니다.",
      });
    }
  };

  /**
   * 스케줄 삭제
   * DELETE /api/schedule/:scheduleId
   */
  delete = async (req: Request, res: Response): Promise<void> => {
    try {
      const { scheduleId } = req.params;
      const userId = (req as any).user?.userId || "system";
      const companyCode = (req as any).user?.companyCode || "*";

      console.log("[ScheduleController] delete 호출:", {
        scheduleId,
        userId,
        companyCode,
      });

      const result = await this.scheduleService.deleteSchedule(
        parseInt(scheduleId, 10),
        companyCode,
        userId
      );

      if (!result.success) {
        res.status(404).json({
          success: false,
          message: result.message || "스케줄을 찾을 수 없습니다.",
        });
        return;
      }

      res.json({
        success: true,
        message: "스케줄이 삭제되었습니다.",
      });
    } catch (error: any) {
      console.error("[ScheduleController] delete 오류:", error);
      res.status(500).json({
        success: false,
        message: error.message || "스케줄 삭제 중 오류가 발생했습니다.",
      });
    }
  };
}
