import { Router } from "express";
import { entityJoinController } from "../controllers/entityJoinController";
import { authenticateToken } from "../middleware/authMiddleware";

const router = Router();

// 모든 라우트에 인증 미들웨어 적용 (테스트 시에는 주석 처리)
// router.use(authenticateToken);

/**
 * Entity 조인 기능 라우트
 *
 * 🎯 핵심 기능:
 * - Entity 조인이 포함된 테이블 데이터 조회
 * - Entity 조인 설정 관리
 * - 참조 테이블 컬럼 정보 조회
 * - 캐시 상태 및 관리
 */

// ========================================
// 🎯 Entity 조인 데이터 조회
// ========================================

/**
 * Entity 조인이 포함된 테이블 데이터 조회
 * GET /api/table-management/tables/:tableName/data-with-joins
 *
 * Query Parameters:
 * - page: 페이지 번호 (default: 1)
 * - size: 페이지 크기 (default: 20)
 * - sortBy: 정렬 컬럼
 * - sortOrder: 정렬 순서 (asc/desc)
 * - enableEntityJoin: Entity 조인 활성화 (default: true)
 * - [기타]: 검색 조건 (컬럼명=값)
 *
 * Response:
 * {
 *   success: true,
 *   data: {
 *     data: [...], // 조인된 데이터
 *     total: 100,
 *     page: 1,
 *     size: 20,
 *     totalPages: 5,
 *     entityJoinInfo?: {
 *       joinConfigs: [...],
 *       strategy: "full_join" | "cache_lookup",
 *       performance: { queryTime: 50, cacheHitRate?: 0.95 }
 *     }
 *   }
 * }
 */
router.get(
  "/tables/:tableName/data-with-joins",
  entityJoinController.getTableDataWithJoins.bind(entityJoinController)
);

// ========================================
// 🎯 Entity 조인 설정 관리
// ========================================

/**
 * 테이블의 Entity 조인 설정 조회
 * GET /api/table-management/tables/:tableName/entity-joins
 *
 * Response:
 * {
 *   success: true,
 *   data: {
 *     tableName: "companies",
 *     joinConfigs: [
 *       {
 *         sourceTable: "companies",
 *         sourceColumn: "writer",
 *         referenceTable: "user_info",
 *         referenceColumn: "user_id",
 *         displayColumn: "user_name",
 *         aliasColumn: "writer_name"
 *       }
 *     ],
 *     count: 1
 *   }
 * }
 */
router.get(
  "/tables/:tableName/entity-joins",
  entityJoinController.getEntityJoinConfigs.bind(entityJoinController)
);

/**
 * 컬럼 Entity 설정 업데이트
 * PUT /api/table-management/tables/:tableName/columns/:columnName/entity-settings
 *
 * Body:
 * {
 *   webType: "entity",
 *   referenceTable: "user_info",
 *   referenceColumn: "user_id",
 *   displayColumn: "user_name", // 🎯 새로 추가된 필드
 *   columnLabel?: "작성자",
 *   description?: "작성자 정보"
 * }
 *
 * Response:
 * {
 *   success: true,
 *   data: {
 *     tableName: "companies",
 *     columnName: "writer",
 *     settings: { ... }
 *   }
 * }
 */
router.put(
  "/tables/:tableName/columns/:columnName/entity-settings",
  entityJoinController.updateEntitySettings.bind(entityJoinController)
);

// ========================================
// 🎯 참조 테이블 정보
// ========================================

/**
 * Entity 조인된 테이블의 추가 컬럼 목록 조회 (화면편집기용)
 * GET /api/table-management/tables/:tableName/entity-join-columns
 *
 * 특정 테이블에 설정된 모든 Entity 조인의 참조 테이블들에서
 * 추가로 표시할 수 있는 컬럼들의 목록을 반환합니다.
 *
 * Response:
 * {
 *   success: true,
 *   data: {
 *     tableName: "companies",
 *     joinTables: [
 *       {
 *         joinConfig: { sourceColumn: "writer", referenceTable: "user_info", ... },
 *         tableName: "user_info",
 *         currentDisplayColumn: "user_name",
 *         availableColumns: [
 *           {
 *             columnName: "email",
 *             columnLabel: "이메일",
 *             dataType: "character varying",
 *             isNullable: true,
 *             description: "사용자 이메일"
 *           },
 *           {
 *             columnName: "dept_code",
 *             columnLabel: "부서코드",
 *             dataType: "character varying",
 *             isNullable: false,
 *             description: "소속 부서"
 *           }
 *         ]
 *       }
 *     ],
 *     availableColumns: [
 *       {
 *         tableName: "user_info",
 *         columnName: "email",
 *         columnLabel: "이메일",
 *         dataType: "character varying",
 *         joinAlias: "writer_email",
 *         suggestedLabel: "writer (이메일)"
 *       },
 *       {
 *         tableName: "user_info",
 *         columnName: "dept_code",
 *         columnLabel: "부서코드",
 *         dataType: "character varying",
 *         joinAlias: "writer_dept_code",
 *         suggestedLabel: "writer (부서코드)"
 *       }
 *     ],
 *     summary: {
 *       totalJoinTables: 1,
 *       totalAvailableColumns: 2
 *     }
 *   }
 * }
 */
router.get(
  "/tables/:tableName/entity-join-columns",
  entityJoinController.getEntityJoinColumns.bind(entityJoinController)
);

/**
 * 참조 테이블의 표시 가능한 컬럼 목록 조회
 * GET /api/table-management/reference-tables/:tableName/columns
 *
 * Response:
 * {
 *   success: true,
 *   data: {
 *     tableName: "user_info",
 *     columns: [
 *       {
 *         columnName: "user_id",
 *         displayName: "user_id",
 *         dataType: "character varying"
 *       },
 *       {
 *         columnName: "user_name",
 *         displayName: "user_name",
 *         dataType: "character varying"
 *       }
 *     ],
 *     count: 2
 *   }
 * }
 */
router.get(
  "/reference-tables/:tableName/columns",
  entityJoinController.getReferenceTableColumns.bind(entityJoinController)
);

// ========================================
// 🎯 캐시 관리
// ========================================

/**
 * 캐시 상태 조회
 * GET /api/table-management/cache/status
 *
 * Response:
 * {
 *   success: true,
 *   data: {
 *     overallHitRate: 0.95,
 *     caches: [
 *       {
 *         cacheKey: "user_info.user_id.user_name",
 *         size: 150,
 *         hitRate: 0.98,
 *         lastUpdated: "2024-01-15T10:30:00Z"
 *       }
 *     ],
 *     summary: {
 *       totalCaches: 3,
 *       totalSize: 450,
 *       averageHitRate: 0.93
 *     }
 *   }
 * }
 */
router.get(
  "/cache/status",
  entityJoinController.getCacheStatus.bind(entityJoinController)
);

/**
 * 캐시 무효화
 * DELETE /api/table-management/cache
 *
 * Query Parameters (선택적):
 * - table: 특정 테이블 캐시만 무효화
 * - keyColumn: 키 컬럼
 * - displayColumn: 표시 컬럼
 *
 * 모든 파라미터가 없으면 전체 캐시 무효화
 *
 * Response:
 * {
 *   success: true,
 *   data: {
 *     target: "user_info.user_id.user_name" | "전체"
 *   }
 * }
 */
router.delete(
  "/cache",
  entityJoinController.invalidateCache.bind(entityJoinController)
);

/**
 * 공통 참조 테이블 자동 캐싱
 * POST /api/table-management/cache/preload
 *
 * 일반적으로 자주 사용되는 참조 테이블들을 자동으로 캐싱
 * - user_info (사용자 정보)
 * - comm_code (공통 코드)
 * - dept_info (부서 정보)
 * - companies (회사 정보)
 *
 * Response:
 * {
 *   success: true,
 *   data: {
 *     preloadedCaches: 4,
 *     caches: [...]
 *   }
 * }
 */
router.post(
  "/cache/preload",
  entityJoinController.preloadCommonCaches.bind(entityJoinController)
);

export default router;
