import express from "express";
import { authenticateToken } from "../middleware/authMiddleware";
import {
  createTableRelationship,
  getTableRelationships,
  getTableRelationship,
  updateTableRelationship,
  deleteTableRelationship,
  createDataLink,
  getLinkedDataByRelationship,
  deleteDataLink,
  getTableData,
  getDataFlowDiagrams,
  getDiagramRelationships,
  getDiagramRelationshipsByDiagramId,
  getDiagramRelationshipsByRelationshipId,
  copyDiagram,
  deleteDiagram,
} from "../controllers/dataflowController";
import {
  testConditionalConnection,
  executeConditionalActions,
} from "../controllers/conditionalConnectionController";
import nodeFlowsRouter from "./dataflow/node-flows";
import nodeExternalConnectionsRouter from "./dataflow/node-external-connections";

const router = express.Router();

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

/**
 * 테이블 관계 생성
 * POST /api/dataflow/table-relationships
 */
router.post("/table-relationships", createTableRelationship);

/**
 * 테이블 관계 목록 조회 (회사별)
 * GET /api/dataflow/table-relationships
 */
router.get("/table-relationships", getTableRelationships);

/**
 * 특정 테이블 관계 조회
 * GET /api/dataflow/table-relationships/:relationshipId
 */
router.get("/table-relationships/:relationshipId", getTableRelationship);

/**
 * 테이블 관계 수정
 * PUT /api/dataflow/table-relationships/:relationshipId
 */
router.put("/table-relationships/:relationshipId", updateTableRelationship);

/**
 * 테이블 관계 삭제
 * DELETE /api/dataflow/table-relationships/:relationshipId
 */
router.delete("/table-relationships/:relationshipId", deleteTableRelationship);

// ==================== 데이터 연결 관리 라우트 ====================

/**
 * 데이터 연결 생성
 * POST /api/dataflow/data-links
 */
router.post("/data-links", createDataLink);

/**
 * 관계별 연결된 데이터 조회
 * GET /api/dataflow/data-links/relationship/:relationshipId
 */
router.get(
  "/data-links/relationship/:relationshipId",
  getLinkedDataByRelationship
);

/**
 * 데이터 연결 삭제
 * DELETE /api/dataflow/data-links/:bridgeId
 */
router.delete("/data-links/:bridgeId", deleteDataLink);

// ==================== 테이블 데이터 조회 라우트 ====================

/**
 * 테이블 실제 데이터 조회
 * GET /api/dataflow/table-data/:tableName
 */
router.get("/table-data/:tableName", getTableData);

// ==================== 관계도 관리 라우트 ====================

/**
 * 관계도 목록 조회 (관계도 이름별로 그룹화)
 * GET /api/dataflow/diagrams
 */
router.get("/diagrams", getDataFlowDiagrams);

/**
 * 특정 관계도의 모든 관계 조회 (diagram_id로)
 * GET /api/dataflow/diagrams/:diagramId/relationships
 */
router.get(
  "/diagrams/:diagramId/relationships",
  getDiagramRelationshipsByDiagramId
);

/**
 * 특정 관계도의 모든 관계 조회 (diagramName으로 - 하위 호환성)
 * GET /api/dataflow/diagrams/name/:diagramName/relationships
 */
router.get(
  "/diagrams/name/:diagramName/relationships",
  getDiagramRelationships
);

/**
 * 관계도 복사
 * POST /api/dataflow/diagrams/:diagramName/copy
 */
router.post("/diagrams/:diagramName/copy", copyDiagram);

/**
 * 관계도 삭제
 * DELETE /api/dataflow/diagrams/:diagramName
 */
router.delete("/diagrams/:diagramName", deleteDiagram);

// relationship_id로 관계도 관계 조회 (하위 호환성)
router.get(
  "/relationships/:relationshipId/diagram",
  getDiagramRelationshipsByRelationshipId
);

// ==================== 조건부 연결 관리 라우트 ====================

/**
 * 조건부 연결 조건 테스트
 * POST /api/dataflow/diagrams/:diagramId/test-conditions
 */
router.post("/diagrams/:diagramId/test-conditions", testConditionalConnection);

/**
 * 조건부 연결 액션 수동 실행
 * POST /api/dataflow/diagrams/:diagramId/execute-actions
 */
router.post("/diagrams/:diagramId/execute-actions", executeConditionalActions);

/**
 * 노드 기반 플로우 관리
 * /api/dataflow/node-flows/*
 */
router.use("/node-flows", nodeFlowsRouter);

/**
 * 노드 플로우용 외부 DB 커넥션 관리
 * /api/dataflow/node-external-connections/*
 */
router.use("/node-external-connections", nodeExternalConnectionsRouter);

export default router;
