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

// 레이아웃 관리
import {
  getLayouts,
  getLayoutById,
  createLayout,
  updateLayout,
  deleteLayout,
} from "../controllers/digitalTwinLayoutController";
import {
  listMappingTemplates,
  getMappingTemplateById,
  createMappingTemplate,
} from "../controllers/digitalTwinTemplateController";

// 외부 DB 데이터 조회
import {
  getHierarchyData,
  getChildrenData,
  getWarehouses,
  getAreas,
  getLocations,
  getMaterials,
  getMaterialCounts,
} from "../controllers/digitalTwinDataController";

const router = express.Router();

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

// ========== 레이아웃 관리 API ==========
router.get("/layouts", getLayouts); // 레이아웃 목록
router.get("/layouts/:id", getLayoutById); // 레이아웃 상세
router.post("/layouts", createLayout); // 레이아웃 생성
router.put("/layouts/:id", updateLayout); // 레이아웃 수정
router.delete("/layouts/:id", deleteLayout); // 레이아웃 삭제

// ========== 매핑 템플릿 API ==========
router.get("/mapping-templates", listMappingTemplates);
router.get("/mapping-templates/:id", getMappingTemplateById);
router.post("/mapping-templates", createMappingTemplate);

// ========== 외부 DB 데이터 조회 API ==========

// 동적 계층 구조 API
router.post("/data/hierarchy", getHierarchyData);      // 전체 계층 데이터 조회
router.post("/data/children", getChildrenData);        // 특정 부모의 하위 데이터 조회

// 테이블 메타데이터 API
router.get("/data/tables/:connectionId", async (req, res) => {
  // 테이블 목록 조회
  try {
    const { ExternalDbConnectionService } = await import("../services/externalDbConnectionService");
    const result = await ExternalDbConnectionService.getTablesFromConnection(Number(req.params.connectionId));
    return res.json(result);
  } catch (error: any) {
    return res.status(500).json({ success: false, error: error.message });
  }
});

router.get("/data/table-preview/:connectionId/:tableName", async (req, res) => {
  // 테이블 미리보기 (10개 레코드)
  try {
    const { connectionId, tableName } = req.params;
    const { getExternalDbConnector } = await import("../controllers/digitalTwinDataController");
    const connector = await getExternalDbConnector(Number(connectionId));
    const result = await connector.executeQuery(`SELECT * FROM ${tableName} LIMIT 10`);
    return res.json({ success: true, data: result.rows });
  } catch (error: any) {
    return res.status(500).json({ success: false, error: error.message });
  }
});

// 레거시 API (호환성 유지)
router.get("/data/warehouses", getWarehouses);         // 창고 목록
router.get("/data/areas", getAreas);                   // Area 목록
router.get("/data/locations", getLocations);           // Location 목록
router.get("/data/materials", getMaterials);           // 자재 목록 (특정 Location)
router.post("/data/material-counts", getMaterialCounts); // 자재 개수 (여러 Location) - POST로 변경

export default router;

