import express from "express";
import { authenticateToken } from "../middleware/authMiddleware";
import {
  getScreens,
  getScreen,
  getScreenMenu,
  createScreen,
  updateScreen,
  updateScreenInfo,
  updateScreenTableName,
  deleteScreen,
  bulkDeleteScreens,
  checkScreenDependencies,
  restoreScreen,
  permanentDeleteScreen,
  getDeletedScreens,
  bulkPermanentDeleteScreens,
  detectLinkedScreens,
  checkDuplicateScreenName,
  copyScreen,
  copyScreenWithModals,
  getTables,
  getTableInfo,
  getTableColumns,
  saveLayout,
  getLayout,
  getLayoutV1,
  getLayoutV2,
  saveLayoutV2,
  getLayoutPop,
  saveLayoutPop,
  deleteLayoutPop,
  getScreenIdsWithPopLayout,
  generateScreenCode,
  generateMultipleScreenCodes,
  assignScreenToMenu,
  getScreensByMenu,
  unassignScreenFromMenu,
  cleanupDeletedScreenMenuAssignments,
  updateTabScreenReferences,
  copyScreenMenuAssignments,
  copyCodeCategoryAndCodes,
  copyCategoryMapping,
  copyTableTypeColumns,
  copyCascadingRelation,
  getScreenLayers,
  getLayerLayout,
  deleteLayer,
  updateLayerCondition,
  getScreenZones,
  createZone,
  updateZone,
  deleteZone,
  addLayerToZone,
  analyzePopScreenLinks,
  deployPopScreens,
} from "../controllers/screenManagementController";

const router = express.Router();

// 모든 라우트에 인증 미들웨어 적용
router.use(authenticateToken);

// 화면 관리
router.get("/screens", getScreens);
router.get("/screens/:id", getScreen);
router.get("/screens/:id/menu", getScreenMenu); // 화면에 할당된 메뉴 조회
router.post("/screens", createScreen);
router.put("/screens/:id", updateScreen);
router.put("/screens/:id/info", updateScreenInfo); // 화면 정보만 수정
router.patch("/screens/:screenId/table-name", updateScreenTableName); // 화면 테이블명 변경
router.get("/screens/:id/dependencies", checkScreenDependencies); // 의존성 체크
router.delete("/screens/:id", deleteScreen); // 휴지통으로 이동
router.delete("/screens/bulk/delete", bulkDeleteScreens); // 활성 화면 일괄 삭제 (휴지통으로 이동)
router.get("/screens/:id/linked-modals", detectLinkedScreens); // 연결된 모달 화면 감지
router.post("/screens/check-duplicate-name", checkDuplicateScreenName); // 화면명 중복 체크
router.post("/screens/:id/copy", copyScreen); // 단일 화면 복사 (하위 호환용)
router.post("/screens/:id/copy-with-modals", copyScreenWithModals); // 메인 + 모달 일괄 복사

// 휴지통 관리
router.get("/screens/trash/list", getDeletedScreens); // 휴지통 화면 목록
router.post("/screens/:id/restore", restoreScreen); // 휴지통에서 복원
router.delete("/screens/:id/permanent", permanentDeleteScreen); // 영구 삭제
router.delete("/screens/trash/bulk", bulkPermanentDeleteScreens); // 일괄 영구 삭제

// 화면 코드 자동 생성
router.get("/generate-screen-code/:companyCode", generateScreenCode);

// 여러 개의 화면 코드 일괄 생성
router.post("/generate-screen-codes", generateMultipleScreenCodes);

// 테이블 관리
router.get("/tables", getTables);
router.get("/tables/:tableName", getTableInfo); // 특정 테이블 정보 조회 (최적화)
router.get("/tables/:tableName/columns", getTableColumns);

// 레이아웃 관리
router.post("/screens/:screenId/layout", saveLayout);
router.get("/screens/:screenId/layout", getLayout);
router.get("/screens/:screenId/layout-v1", getLayoutV1); // V1: component_url + custom_config 기반 (다중 레코드)
router.get("/screens/:screenId/layout-v2", getLayoutV2); // V2: 1 레코드 방식 (url + overrides)
router.post("/screens/:screenId/layout-v2", saveLayoutV2); // V2: 1 레코드 방식 저장

// 레이어 관리
router.get("/screens/:screenId/layers", getScreenLayers); // 레이어 목록
router.get("/screens/:screenId/layers/:layerId/layout", getLayerLayout); // 특정 레이어 레이아웃
router.delete("/screens/:screenId/layers/:layerId", deleteLayer); // 레이어 삭제
router.put("/screens/:screenId/layers/:layerId/condition", updateLayerCondition); // 레이어 조건 설정

// 조건부 영역(Zone) 관리
router.get("/screens/:screenId/zones", getScreenZones);           // Zone 목록
router.post("/screens/:screenId/zones", createZone);              // Zone 생성
router.put("/zones/:zoneId", updateZone);                         // Zone 업데이트
router.delete("/zones/:zoneId", deleteZone);                      // Zone 삭제
router.post("/screens/:screenId/zones/:zoneId/layers", addLayerToZone); // Zone에 레이어 추가

// POP 레이아웃 관리 (모바일/태블릿)
router.get("/screens/:screenId/layout-pop", getLayoutPop); // POP: 모바일/태블릿용 레이아웃 조회
router.post("/screens/:screenId/layout-pop", saveLayoutPop); // POP: 모바일/태블릿용 레이아웃 저장
router.delete("/screens/:screenId/layout-pop", deleteLayoutPop); // POP: 레이아웃 삭제
router.get("/pop-layout-screen-ids", getScreenIdsWithPopLayout); // POP: 레이아웃 존재하는 화면 ID 목록

// 메뉴-화면 할당 관리
router.post("/screens/:screenId/assign-menu", assignScreenToMenu);
router.get("/menus/:menuObjid/screens", getScreensByMenu);
router.delete("/screens/:screenId/menus/:menuObjid", unassignScreenFromMenu);

// 관리자용 정리 기능
router.post(
  "/admin/cleanup-deleted-screen-menu-assignments",
  cleanupDeletedScreenMenuAssignments
);

// 그룹 복제 완료 후 탭 컴포넌트의 screenId 참조 일괄 업데이트
router.post("/screens/update-tab-references", updateTabScreenReferences);

// 화면-메뉴 할당 복제 (다른 회사로 복제 시)
router.post("/copy-menu-assignments", copyScreenMenuAssignments);

// 코드 카테고리 + 코드 복제
router.post("/copy-code-category", copyCodeCategoryAndCodes);

// 카테고리 매핑 + 값 복제
router.post("/copy-category-mapping", copyCategoryMapping);

// 테이블 타입 컬럼 복제
router.post("/copy-table-type-columns", copyTableTypeColumns);

// 연쇄관계 설정 복제
router.post("/copy-cascading-relation", copyCascadingRelation);

// POP 화면 배포 (다른 회사로 복사)
router.get("/screens/:screenId/pop-links", analyzePopScreenLinks);
router.post("/deploy-pop-screens", deployPopScreens);

export default router;
