import { Router, Request, Response } from "express";
import {
  authenticateToken,
  AuthenticatedRequest,
} from "../middleware/authMiddleware";
import { ExternalRestApiConnectionService } from "../services/externalRestApiConnectionService";
import {
  ExternalRestApiConnection,
  ExternalRestApiConnectionFilter,
  RestApiTestRequest,
} from "../types/externalRestApiTypes";
import logger from "../utils/logger";

const router = Router();

/**
 * GET /api/external-rest-api-connections
 * REST API 연결 목록 조회
 */
router.get(
  "/",
  authenticateToken,
  async (req: AuthenticatedRequest, res: Response) => {
    try {
      const filter: ExternalRestApiConnectionFilter = {
        search: req.query.search as string,
        auth_type: req.query.auth_type as string,
        is_active: req.query.is_active as string,
        company_code: req.query.company_code as string,
      };

      const userCompanyCode = req.user?.companyCode;

      const result = await ExternalRestApiConnectionService.getConnections(
        filter,
        userCompanyCode
      );

      return res.status(result.success ? 200 : 400).json(result);
    } catch (error) {
      logger.error("REST API 연결 목록 조회 오류:", error);
      return res.status(500).json({
        success: false,
        message: "서버 내부 오류가 발생했습니다.",
        error: error instanceof Error ? error.message : "알 수 없는 오류",
      });
    }
  }
);

/**
 * GET /api/external-rest-api-connections/:id
 * REST API 연결 상세 조회
 */
router.get(
  "/:id",
  authenticateToken,
  async (req: AuthenticatedRequest, res: Response) => {
    try {
      const id = parseInt(req.params.id);

      if (isNaN(id)) {
        return res.status(400).json({
          success: false,
          message: "유효하지 않은 ID입니다.",
        });
      }

      const userCompanyCode = req.user?.companyCode;

      const result = await ExternalRestApiConnectionService.getConnectionById(
        id,
        userCompanyCode
      );

      return res.status(result.success ? 200 : 404).json(result);
    } catch (error) {
      logger.error("REST API 연결 상세 조회 오류:", error);
      return res.status(500).json({
        success: false,
        message: "서버 내부 오류가 발생했습니다.",
        error: error instanceof Error ? error.message : "알 수 없는 오류",
      });
    }
  }
);

/**
 * POST /api/external-rest-api-connections
 * REST API 연결 생성
 */
router.post(
  "/",
  authenticateToken,
  async (req: AuthenticatedRequest, res: Response) => {
    try {
      const data: ExternalRestApiConnection = {
        ...req.body,
        created_by: req.user?.userId || "system",
        // 로그인 사용자의 company_code 사용 (프론트에서 안 보내도 자동 설정)
        company_code: req.body.company_code || req.user?.companyCode || "*",
      };

      const result =
        await ExternalRestApiConnectionService.createConnection(data);

      return res.status(result.success ? 201 : 400).json(result);
    } catch (error) {
      logger.error("REST API 연결 생성 오류:", error);
      return res.status(500).json({
        success: false,
        message: "서버 내부 오류가 발생했습니다.",
        error: error instanceof Error ? error.message : "알 수 없는 오류",
      });
    }
  }
);

/**
 * PUT /api/external-rest-api-connections/:id
 * REST API 연결 수정
 */
router.put(
  "/:id",
  authenticateToken,
  async (req: AuthenticatedRequest, res: Response) => {
    try {
      const id = parseInt(req.params.id);

      if (isNaN(id)) {
        return res.status(400).json({
          success: false,
          message: "유효하지 않은 ID입니다.",
        });
      }

      const data: Partial<ExternalRestApiConnection> = {
        ...req.body,
        updated_by: req.user?.userId || "system",
      };

      const userCompanyCode = req.user?.companyCode;

      const result = await ExternalRestApiConnectionService.updateConnection(
        id,
        data,
        userCompanyCode
      );

      return res.status(result.success ? 200 : 400).json(result);
    } catch (error) {
      logger.error("REST API 연결 수정 오류:", error);
      return res.status(500).json({
        success: false,
        message: "서버 내부 오류가 발생했습니다.",
        error: error instanceof Error ? error.message : "알 수 없는 오류",
      });
    }
  }
);

/**
 * DELETE /api/external-rest-api-connections/:id
 * REST API 연결 삭제
 */
router.delete(
  "/:id",
  authenticateToken,
  async (req: AuthenticatedRequest, res: Response) => {
    try {
      const id = parseInt(req.params.id);

      if (isNaN(id)) {
        return res.status(400).json({
          success: false,
          message: "유효하지 않은 ID입니다.",
        });
      }

      const userCompanyCode = req.user?.companyCode;

      const result = await ExternalRestApiConnectionService.deleteConnection(
        id,
        userCompanyCode
      );

      return res.status(result.success ? 200 : 404).json(result);
    } catch (error) {
      logger.error("REST API 연결 삭제 오류:", error);
      return res.status(500).json({
        success: false,
        message: "서버 내부 오류가 발생했습니다.",
        error: error instanceof Error ? error.message : "알 수 없는 오류",
      });
    }
  }
);

/**
 * POST /api/external-rest-api-connections/test
 * REST API 연결 테스트 (테스트 데이터 기반)
 */
router.post(
  "/test",
  authenticateToken,
  async (req: AuthenticatedRequest, res: Response) => {
    try {
      const testRequest: RestApiTestRequest = req.body;

      if (!testRequest.base_url) {
        return res.status(400).json({
          success: false,
          message: "기본 URL은 필수입니다.",
        });
      }

      const result =
        await ExternalRestApiConnectionService.testConnection(
          testRequest,
          req.user?.companyCode
        );

      return res.status(200).json(result);
    } catch (error) {
      logger.error("REST API 연결 테스트 오류:", error);
      return res.status(500).json({
        success: false,
        message: "서버 내부 오류가 발생했습니다.",
        error: error instanceof Error ? error.message : "알 수 없는 오류",
      });
    }
  }
);

/**
 * POST /api/external-rest-api-connections/:id/test
 * REST API 연결 테스트 (ID 기반)
 */
router.post(
  "/:id/test",
  authenticateToken,
  async (req: AuthenticatedRequest, res: Response) => {
    try {
      const id = parseInt(req.params.id);

      if (isNaN(id)) {
        return res.status(400).json({
          success: false,
          message: "유효하지 않은 ID입니다.",
        });
      }

      const endpoint = req.body.endpoint as string | undefined;

      const result = await ExternalRestApiConnectionService.testConnectionById(
        id,
        endpoint
      );

      return res.status(200).json(result);
    } catch (error) {
      logger.error("REST API 연결 테스트 (ID) 오류:", error);
      return res.status(500).json({
        success: false,
        message: "서버 내부 오류가 발생했습니다.",
        error: error instanceof Error ? error.message : "알 수 없는 오류",
      });
    }
  }
);

/**
 * POST /api/external-rest-api-connections/:id/fetch
 * REST API 데이터 조회 (화면관리용 프록시)
 */
router.post(
  "/:id/fetch",
  authenticateToken,
  async (req: AuthenticatedRequest, res: Response) => {
    try {
      const id = parseInt(req.params.id);

      if (isNaN(id)) {
        return res.status(400).json({
          success: false,
          message: "유효하지 않은 ID입니다.",
        });
      }

      const { endpoint, jsonPath } = req.body;
      const userCompanyCode = req.user?.companyCode;

      logger.info(`REST API 데이터 조회 요청: 연결 ID=${id}, endpoint=${endpoint}, jsonPath=${jsonPath}`);

      const result = await ExternalRestApiConnectionService.fetchData(
        id,
        endpoint,
        jsonPath,
        userCompanyCode
      );

      return res.status(result.success ? 200 : 400).json(result);
    } catch (error) {
      logger.error("REST API 데이터 조회 오류:", error);
      return res.status(500).json({
        success: false,
        message: "서버 내부 오류가 발생했습니다.",
        error: error instanceof Error ? error.message : "알 수 없는 오류",
      });
    }
  }
);

export default router;
