import { Request, Response } from "express";
import { layoutService } from "../services/layoutService";
import {
  CreateLayoutRequest,
  UpdateLayoutRequest,
  GetLayoutsRequest,
  DuplicateLayoutRequest,
} from "../types/layout";

export class LayoutController {
  /**
   * 레이아웃 목록 조회
   */
  async getLayouts(req: Request, res: Response): Promise<void> {
    try {
      const { user } = req as any;
      const {
        page = 1,
        size = 20,
        category,
        layoutType,
        searchTerm,
        includePublic = true,
      } = req.query as any;

      const params = {
        page: parseInt(page, 10),
        size: parseInt(size, 10),
        category,
        layoutType,
        searchTerm,
        companyCode: user.companyCode,
        includePublic: includePublic === "true",
      };

      const result = await layoutService.getLayouts(params);

      const response = {
        ...result,
        page: params.page,
        size: params.size,
        totalPages: Math.ceil(result.total / params.size),
      };

      res.json({
        success: true,
        data: response,
      });
    } catch (error) {
      console.error("레이아웃 목록 조회 오류:", error);
      res.status(500).json({
        success: false,
        message: "레이아웃 목록 조회에 실패했습니다.",
        error: error instanceof Error ? error.message : "Unknown error",
      });
    }
  }

  /**
   * 레이아웃 상세 조회
   */
  async getLayoutById(req: Request, res: Response): Promise<void> {
    try {
      const { user } = req as any;
      const { id: layoutCode } = req.params;

      const layout = await layoutService.getLayoutById(
        layoutCode,
        user.companyCode
      );

      if (!layout) {
        res.status(404).json({
          success: false,
          message: "레이아웃을 찾을 수 없습니다.",
        });
        return;
      }

      res.json({
        success: true,
        data: layout,
      });
    } catch (error) {
      console.error("레이아웃 상세 조회 오류:", error);
      res.status(500).json({
        success: false,
        message: "레이아웃 상세 조회에 실패했습니다.",
        error: error instanceof Error ? error.message : "Unknown error",
      });
    }
  }

  /**
   * 레이아웃 생성
   */
  async createLayout(req: Request, res: Response): Promise<void> {
    try {
      const { user } = req as any;
      const layoutRequest: CreateLayoutRequest = req.body;

      // 요청 데이터 검증
      if (
        !layoutRequest.layoutName ||
        !layoutRequest.layoutType ||
        !layoutRequest.category
      ) {
        res.status(400).json({
          success: false,
          message:
            "필수 필드가 누락되었습니다. (layoutName, layoutType, category)",
        });
        return;
      }

      if (!layoutRequest.layoutConfig || !layoutRequest.zonesConfig) {
        res.status(400).json({
          success: false,
          message: "레이아웃 설정과 존 설정은 필수입니다.",
        });
        return;
      }

      const layout = await layoutService.createLayout(
        layoutRequest,
        user.companyCode,
        user.userId
      );

      res.status(201).json({
        success: true,
        data: layout,
        message: "레이아웃이 성공적으로 생성되었습니다.",
      });
    } catch (error) {
      console.error("레이아웃 생성 오류:", error);
      res.status(500).json({
        success: false,
        message: "레이아웃 생성에 실패했습니다.",
        error: error instanceof Error ? error.message : "Unknown error",
      });
    }
  }

  /**
   * 레이아웃 수정
   */
  async updateLayout(req: Request, res: Response): Promise<void> {
    try {
      const { user } = req as any;
      const { id: layoutCode } = req.params;
      const updateRequest: Partial<CreateLayoutRequest> = req.body;

      const updatedLayout = await layoutService.updateLayout(
        { ...updateRequest, layoutCode },
        user.companyCode,
        user.userId
      );

      if (!updatedLayout) {
        res.status(404).json({
          success: false,
          message: "레이아웃을 찾을 수 없거나 수정 권한이 없습니다.",
        });
        return;
      }

      res.json({
        success: true,
        data: updatedLayout,
        message: "레이아웃이 성공적으로 수정되었습니다.",
      });
    } catch (error) {
      console.error("레이아웃 수정 오류:", error);
      res.status(500).json({
        success: false,
        message: "레이아웃 수정에 실패했습니다.",
        error: error instanceof Error ? error.message : "Unknown error",
      });
    }
  }

  /**
   * 레이아웃 삭제
   */
  async deleteLayout(req: Request, res: Response): Promise<void> {
    try {
      const { user } = req as any;
      const { id: layoutCode } = req.params;

      await layoutService.deleteLayout(
        layoutCode,
        user.companyCode,
        user.userId
      );

      res.json({
        success: true,
        message: "레이아웃이 성공적으로 삭제되었습니다.",
      });
    } catch (error) {
      console.error("레이아웃 삭제 오류:", error);
      res.status(500).json({
        success: false,
        message: "레이아웃 삭제에 실패했습니다.",
        error: error instanceof Error ? error.message : "Unknown error",
      });
    }
  }

  /**
   * 레이아웃 복제
   */
  async duplicateLayout(req: Request, res: Response): Promise<void> {
    try {
      const { user } = req as any;
      const { id: layoutCode } = req.params;
      const { newName }: DuplicateLayoutRequest = req.body;

      if (!newName) {
        res.status(400).json({
          success: false,
          message: "새 레이아웃 이름이 필요합니다.",
        });
        return;
      }

      const duplicatedLayout = await layoutService.duplicateLayout(
        layoutCode,
        newName,
        user.companyCode,
        user.userId
      );

      res.status(201).json({
        success: true,
        data: duplicatedLayout,
        message: "레이아웃이 성공적으로 복제되었습니다.",
      });
    } catch (error) {
      console.error("레이아웃 복제 오류:", error);
      res.status(500).json({
        success: false,
        message: "레이아웃 복제에 실패했습니다.",
        error: error instanceof Error ? error.message : "Unknown error",
      });
    }
  }

  /**
   * 카테고리별 레이아웃 개수 조회
   */
  async getLayoutCountsByCategory(req: Request, res: Response): Promise<void> {
    try {
      const { user } = req as any;

      const counts = await layoutService.getLayoutCountsByCategory(
        user.companyCode
      );

      res.json({
        success: true,
        data: counts,
      });
    } catch (error) {
      console.error("카테고리별 레이아웃 개수 조회 오류:", error);
      res.status(500).json({
        success: false,
        message: "카테고리별 레이아웃 개수 조회에 실패했습니다.",
        error: error instanceof Error ? error.message : "Unknown error",
      });
    }
  }
}

export const layoutController = new LayoutController();
