import express from "express";
import { authenticateToken } from "../middleware/authMiddleware";
import {
  getTableList,
  getColumnList,
  updateColumnSettings,
  updateAllColumnSettings,
  getTableLabels,
  getColumnLabels,
  updateColumnWebType,
  updateColumnInputType,
  updateTableLabel,
  getTableData,
  getTableRecord, // 🆕 단일 레코드 조회
  addTableData,
  editTableData,
  deleteTableData,
  getTableSchema,
  checkTableExists,
  getColumnWebTypes,
  checkDatabaseConnection,
  createLogTable,
  getLogConfig,
  getLogData,
  toggleLogTable,
  getCategoryColumnsByMenu, // 🆕 메뉴별 카테고리 컬럼 조회
  getCategoryColumnsByCompany, // 🆕 회사별 카테고리 컬럼 조회
  getNumberingColumnsByCompany, // 채번 타입 컬럼 조회
  multiTableSave, // 🆕 범용 다중 테이블 저장
  validateExcelData, // 엑셀 업로드 전 데이터 검증
  getTableEntityRelations, // 🆕 두 테이블 간 엔티티 관계 조회
  getReferencedByTables, // 🆕 현재 테이블을 참조하는 테이블 조회
  getTableConstraints, // 🆕 PK/인덱스 상태 조회
  setTablePrimaryKey, // 🆕 PK 설정
  toggleTableIndex, // 🆕 인덱스 토글
  toggleColumnNullable, // 🆕 NOT NULL 토글
  toggleColumnUnique, // 🆕 UNIQUE 토글
} from "../controllers/tableManagementController";

const router = express.Router();

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

/**
 * 테이블 목록 조회
 * GET /api/table-management/tables
 */
router.get("/tables", getTableList);

/**
 * 두 테이블 간 엔티티 관계 조회
 * GET /api/table-management/tables/entity-relations?leftTable=xxx&rightTable=yyy
 * 
 * table_type_columns에서 정의된 엔티티/카테고리 타입 설정을 기반으로
 * 두 테이블 간의 외래키 관계를 자동으로 감지합니다.
 */
router.get("/tables/entity-relations", getTableEntityRelations);

/**
 * 테이블 컬럼 정보 조회
 * GET /api/table-management/tables/:tableName/columns
 */
router.get("/tables/:tableName/columns", getColumnList);

/**
 * 현재 테이블을 참조하는 테이블 목록 조회
 * GET /api/table-management/columns/:tableName/referenced-by
 * 
 * 리피터 컴포넌트에서 저장 테이블 선택 시 FK 관계를 자동으로 가져오기 위해 사용
 */
router.get("/columns/:tableName/referenced-by", getReferencedByTables);

/**
 * 테이블 라벨 설정
 * PUT /api/table-management/tables/:tableName/label
 */
router.put("/tables/:tableName/label", updateTableLabel);

/**
 * 개별 컬럼 설정 업데이트
 * POST /api/table-management/tables/:tableName/columns/:columnName/settings
 */
router.post(
  "/tables/:tableName/columns/:columnName/settings",
  updateColumnSettings
);

/**
 * 전체 컬럼 설정 일괄 업데이트
 * POST /api/table-management/tables/:tableName/columns/settings
 */
router.post("/tables/:tableName/columns/settings", updateAllColumnSettings);

/**
 * 테이블 라벨 정보 조회
 * GET /api/table-management/tables/:tableName/labels
 */
router.get("/tables/:tableName/labels", getTableLabels);

/**
 * 컬럼 라벨 정보 조회
 * GET /api/table-management/tables/:tableName/columns/:columnName/labels
 */
router.get("/tables/:tableName/columns/:columnName/labels", getColumnLabels);

/**
 * 컬럼 웹 타입 설정 (레거시 지원)
 * PUT /api/table-management/tables/:tableName/columns/:columnName/web-type
 */
router.put(
  "/tables/:tableName/columns/:columnName/web-type",
  updateColumnWebType
);

/**
 * 컬럼 입력 타입 설정 (새로운 시스템)
 * PUT /api/table-management/tables/:tableName/columns/:columnName/input-type
 */
router.put(
  "/tables/:tableName/columns/:columnName/input-type",
  updateColumnInputType
);

/**
 * 개별 컬럼 설정 업데이트 (PUT 방식)
 * PUT /api/table-management/tables/:tableName/columns/:columnName
 */
router.put("/tables/:tableName/columns/:columnName", updateColumnSettings);

/**
 * 여러 컬럼 설정 일괄 업데이트
 * PUT /api/table-management/tables/:tableName/columns/batch
 */
router.put("/tables/:tableName/columns/batch", updateAllColumnSettings);

/**
 * 테이블 스키마 정보 조회 (컬럼 존재 여부 검증용)
 * GET /api/table-management/tables/:tableName/schema
 */
router.get("/tables/:tableName/schema", getTableSchema);

/**
 * PK/인덱스 제약조건 상태 조회
 * GET /api/table-management/tables/:tableName/constraints
 */
router.get("/tables/:tableName/constraints", getTableConstraints);

/**
 * PK 설정 (기존 PK DROP 후 재생성)
 * PUT /api/table-management/tables/:tableName/primary-key
 */
router.put("/tables/:tableName/primary-key", setTablePrimaryKey);

/**
 * 인덱스 토글 (생성/삭제)
 * POST /api/table-management/tables/:tableName/indexes
 */
router.post("/tables/:tableName/indexes", toggleTableIndex);

/**
 * NOT NULL 토글
 * PUT /api/table-management/tables/:tableName/columns/:columnName/nullable
 */
router.put("/tables/:tableName/columns/:columnName/nullable", toggleColumnNullable);

/**
 * UNIQUE 토글
 * PUT /api/table-management/tables/:tableName/columns/:columnName/unique
 */
router.put("/tables/:tableName/columns/:columnName/unique", toggleColumnUnique);

/**
 * 테이블 존재 여부 확인
 * GET /api/table-management/tables/:tableName/exists
 */
router.get("/tables/:tableName/exists", checkTableExists);

/**
 * 컬럼 웹타입 정보 조회 (화면관리 연동용)
 * GET /api/table-management/tables/:tableName/web-types
 */
router.get("/tables/:tableName/web-types", getColumnWebTypes);

/**
 * 데이터베이스 연결 상태 확인
 * GET /api/table-management/health
 */
router.get("/health", checkDatabaseConnection);

/**
 * 테이블 데이터 조회 (페이징 + 검색)
 * POST /api/table-management/tables/:tableName/data
 */
router.post("/tables/:tableName/data", getTableData);

/**
 * 단일 레코드 조회 (자동 입력용)
 * POST /api/table-management/tables/:tableName/record
 */
router.post("/tables/:tableName/record", getTableRecord);

/**
 * 테이블 데이터 추가
 * POST /api/table-management/tables/:tableName/add
 */
router.post("/tables/:tableName/add", addTableData);

/**
 * 테이블 데이터 수정
 * PUT /api/table-management/tables/:tableName/edit
 */
router.put("/tables/:tableName/edit", editTableData);

/**
 * 테이블 데이터 삭제
 * DELETE /api/table-management/tables/:tableName/delete
 */
router.delete("/tables/:tableName/delete", deleteTableData);

// ========================================
// 테이블 로그 시스템 API
// ========================================

/**
 * 로그 테이블 생성
 * POST /api/table-management/tables/:tableName/log
 */
router.post("/tables/:tableName/log", createLogTable);

/**
 * 로그 설정 조회
 * GET /api/table-management/tables/:tableName/log/config
 */
router.get("/tables/:tableName/log/config", getLogConfig);

/**
 * 로그 데이터 조회
 * GET /api/table-management/tables/:tableName/log
 */
router.get("/tables/:tableName/log", getLogData);

/**
 * 로그 테이블 활성화/비활성화
 * POST /api/table-management/tables/:tableName/log/toggle
 */
router.post("/tables/:tableName/log/toggle", toggleLogTable);

// ========================================
// 메뉴 기반 카테고리 관리 API
// ========================================

/**
 * 회사 기준 모든 카테고리 타입 컬럼 조회 (메뉴 종속 없음)
 * GET /api/table-management/category-columns
 */
router.get("/category-columns", getCategoryColumnsByCompany);

/**
 * 회사 기준 모든 채번 타입 컬럼 조회
 * GET /api/table-management/numbering-columns
 */
router.get("/numbering-columns", getNumberingColumnsByCompany);

/**
 * 메뉴의 형제 메뉴들이 사용하는 모든 테이블의 카테고리 타입 컬럼 조회
 * GET /api/table-management/menu/:menuObjid/category-columns
 */
router.get("/menu/:menuObjid/category-columns", getCategoryColumnsByMenu);

// ========================================
// 범용 다중 테이블 저장 API
// ========================================

/**
 * 다중 테이블 저장 (메인 + 서브 테이블)
 * POST /api/table-management/multi-table-save
 * 
 * 메인 테이블과 서브 테이블(들)에 트랜잭션으로 데이터를 저장합니다.
 * 사원+부서, 주문+주문상세 등 1:N 관계 데이터 저장에 사용됩니다.
 */
router.post("/multi-table-save", multiTableSave);

/**
 * 엑셀 업로드 전 데이터 검증
 */
router.post("/validate-excel", validateExcelData);

export default router;
