import { Request, Response } from "express";
import { MapDataService } from "../services/mapDataService";
import { logger } from "../utils/logger";

/**
 * 지도 데이터 조회 컨트롤러
 * 외부 DB 연결에서 위도/경도 데이터를 가져와 지도에 표시할 수 있도록 변환
 */
export class MapDataController {
  private mapDataService: MapDataService;

  constructor() {
    this.mapDataService = new MapDataService();
  }

  /**
   * 외부 DB에서 지도 데이터 조회
   */
  getMapData = async (req: Request, res: Response): Promise<void> => {
    try {
      const { connectionId } = req.params;
      const {
        tableName,
        latColumn,
        lngColumn,
        labelColumn,
        statusColumn,
        additionalColumns,
        whereClause,
      } = req.query;

      logger.info("🗺️ 지도 데이터 조회 요청:", {
        connectionId,
        tableName,
        latColumn,
        lngColumn,
      });

      // 필수 파라미터 검증
      if (!tableName || !latColumn || !lngColumn) {
        res.status(400).json({
          success: false,
          message: "tableName, latColumn, lngColumn은 필수입니다.",
        });
        return;
      }

      const markers = await this.mapDataService.getMapData({
        connectionId: parseInt(connectionId as string),
        tableName: tableName as string,
        latColumn: latColumn as string,
        lngColumn: lngColumn as string,
        labelColumn: labelColumn as string,
        statusColumn: statusColumn as string,
        additionalColumns: additionalColumns
          ? (additionalColumns as string).split(",")
          : [],
        whereClause: whereClause as string,
      });

      res.json({
        success: true,
        data: {
          markers,
          count: markers.length,
        },
      });
    } catch (error: any) {
      logger.error("❌ 지도 데이터 조회 오류:", error);
      res.status(500).json({
        success: false,
        message: "지도 데이터 조회 중 오류가 발생했습니다.",
        error: error.message,
      });
    }
  };

  /**
   * 내부 DB에서 지도 데이터 조회
   */
  getInternalMapData = async (req: Request, res: Response): Promise<void> => {
    try {
      const {
        tableName,
        latColumn,
        lngColumn,
        labelColumn,
        statusColumn,
        additionalColumns,
        whereClause,
      } = req.query;

      logger.info("🗺️ 내부 DB 지도 데이터 조회 요청:", {
        tableName,
        latColumn,
        lngColumn,
      });

      // 필수 파라미터 검증
      if (!tableName || !latColumn || !lngColumn) {
        res.status(400).json({
          success: false,
          message: "tableName, latColumn, lngColumn은 필수입니다.",
        });
        return;
      }

      const markers = await this.mapDataService.getInternalMapData({
        tableName: tableName as string,
        latColumn: latColumn as string,
        lngColumn: lngColumn as string,
        labelColumn: labelColumn as string,
        statusColumn: statusColumn as string,
        additionalColumns: additionalColumns
          ? (additionalColumns as string).split(",")
          : [],
        whereClause: whereClause as string,
      });

      res.json({
        success: true,
        data: {
          markers,
          count: markers.length,
        },
      });
    } catch (error: any) {
      logger.error("❌ 내부 DB 지도 데이터 조회 오류:", error);
      res.status(500).json({
        success: false,
        message: "지도 데이터 조회 중 오류가 발생했습니다.",
        error: error.message,
      });
    }
  };
}

