/**
 * DDL 실행 관련 라우터
 * 테이블/컬럼 생성 API 라우팅
 */

import express from "express";
import { DDLController } from "../controllers/ddlController";
import {
  requireSuperAdmin,
  validateDDLPermission,
} from "../middleware/superAdminMiddleware";
import { authenticateToken } from "../middleware/authMiddleware";
import { query } from "../database/db";

const router = express.Router();

// ============================================
// DDL 실행 라우터 (최고 관리자 전용)
// ============================================

/**
 * 테이블 생성
 * POST /api/ddl/tables
 */
router.post(
  "/tables",
  authenticateToken, // 기본 인증
  requireSuperAdmin, // 슈퍼관리자 권한 확인
  validateDDLPermission, // DDL 실행 추가 검증
  DDLController.createTable
);

/**
 * 컬럼 추가
 * POST /api/ddl/tables/:tableName/columns
 */
router.post(
  "/tables/:tableName/columns",
  authenticateToken,
  requireSuperAdmin,
  validateDDLPermission,
  DDLController.addColumn
);

/**
 * 테이블 삭제
 * DELETE /api/ddl/tables/:tableName
 */
router.delete(
  "/tables/:tableName",
  authenticateToken,
  requireSuperAdmin,
  validateDDLPermission,
  DDLController.dropTable
);

/**
 * 테이블 생성 사전 검증 (실제 생성하지 않고 검증만)
 * POST /api/ddl/validate/table
 */
router.post(
  "/validate/table",
  authenticateToken,
  requireSuperAdmin,
  DDLController.validateTableCreation
);

// ============================================
// DDL 로그 및 모니터링 라우터
// ============================================

/**
 * DDL 실행 로그 조회
 * GET /api/ddl/logs
 */
router.get(
  "/logs",
  authenticateToken,
  requireSuperAdmin,
  DDLController.getDDLLogs
);

/**
 * DDL 실행 통계 조회
 * GET /api/ddl/statistics
 */
router.get(
  "/statistics",
  authenticateToken,
  requireSuperAdmin,
  DDLController.getDDLStatistics
);

/**
 * 특정 테이블의 DDL 히스토리 조회
 * GET /api/ddl/tables/:tableName/history
 */
router.get(
  "/tables/:tableName/history",
  authenticateToken,
  requireSuperAdmin,
  DDLController.getTableDDLHistory
);

/**
 * 생성된 테이블 정보 조회
 * GET /api/ddl/tables/:tableName/info
 */
router.get(
  "/tables/:tableName/info",
  authenticateToken,
  requireSuperAdmin,
  DDLController.getTableInfo
);

// ============================================
// DDL 시스템 관리 라우터
// ============================================

/**
 * 오래된 DDL 로그 정리
 * DELETE /api/ddl/logs/cleanup
 */
router.delete(
  "/logs/cleanup",
  authenticateToken,
  requireSuperAdmin,
  DDLController.cleanupOldLogs
);

// ============================================
// 라우터 정보 및 헬스체크
// ============================================

/**
 * DDL 라우터 정보 조회
 * GET /api/ddl/info
 */
router.get("/info", authenticateToken, requireSuperAdmin, (req, res) => {
  res.json({
    success: true,
    data: {
      service: "DDL Execution Service",
      version: "1.0.0",
      description: "PostgreSQL 테이블 및 컬럼 동적 생성 서비스",
      endpoints: {
        tables: {
          create: "POST /api/ddl/tables",
          addColumn: "POST /api/ddl/tables/:tableName/columns",
          drop: "DELETE /api/ddl/tables/:tableName",
          getInfo: "GET /api/ddl/tables/:tableName/info",
          getHistory: "GET /api/ddl/tables/:tableName/history",
        },
        validation: {
          validateTable: "POST /api/ddl/validate/table",
        },
        monitoring: {
          logs: "GET /api/ddl/logs",
          statistics: "GET /api/ddl/statistics",
          cleanup: "DELETE /api/ddl/logs/cleanup",
        },
      },
      requirements: {
        authentication: "Bearer Token 필요",
        authorization: "회사코드 '*'인 plm_admin 사용자만 접근 가능",
        safety: "모든 DDL 실행은 안전성 검증 후 수행",
        logging: "모든 DDL 실행은 감사 로그에 기록",
      },
      supportedWebTypes: [
        "text",
        "number",
        "decimal",
        "date",
        "datetime",
        "boolean",
        "code",
        "entity",
        "textarea",
        "select",
        "checkbox",
        "radio",
        "file",
        "email",
        "tel",
      ],
    },
  });
});

/**
 * DDL 서비스 헬스체크
 * GET /api/ddl/health
 */
router.get("/health", authenticateToken, async (req, res) => {
  try {
    // 기본적인 데이터베이스 연결 테스트
    await query("SELECT 1");

    res.json({
      success: true,
      status: "healthy",
      timestamp: new Date().toISOString(),
      checks: {
        database: "connected",
        service: "operational",
      },
    });
  } catch (error) {
    res.status(503).json({
      success: false,
      status: "unhealthy",
      timestamp: new Date().toISOString(),
      error: {
        code: "HEALTH_CHECK_FAILED",
        details: "DDL 서비스 상태 확인 실패",
      },
      checks: {
        database: "disconnected",
        service: "error",
      },
    });
  }
});

export default router;
