import { Router, Request, Response } from "express";
import { ExternalCallService } from "../services/externalCallService";
import {
  ExternalCallRequest,
  SupportedExternalCallSettings,
} from "../types/externalCallTypes";

const router = Router();
const externalCallService = new ExternalCallService();

/**
 * 외부 호출 테스트
 * POST /api/external-calls/test
 */
router.post("/test", async (req: Request, res: Response) => {
  try {
    const { settings, templateData } = req.body;

    if (!settings) {
      return res.status(400).json({
        success: false,
        error: "외부 호출 설정이 필요합니다.",
      });
    }

    // 설정 검증
    const validation = externalCallService.validateSettings(
      settings as SupportedExternalCallSettings
    );
    if (!validation.valid) {
      return res.status(400).json({
        success: false,
        error: "설정 검증 실패",
        details: validation.errors,
      });
    }

    // 테스트 요청 생성
    const testRequest: ExternalCallRequest = {
      diagramId: 0, // 테스트용
      relationshipId: "test",
      settings: settings as SupportedExternalCallSettings,
      templateData: templateData || {
        recordCount: 5,
        tableName: "test_table",
        timestamp: new Date().toISOString(),
      },
    };

    // 외부 호출 실행
    const result = await externalCallService.executeExternalCall(testRequest);

    return res.json({
      success: true,
      result,
    });
  } catch (error) {
    console.error("외부 호출 테스트 실패:", error);
    return res.status(500).json({
      success: false,
      error:
        error instanceof Error
          ? error.message
          : "알 수 없는 오류가 발생했습니다.",
    });
  }
});

/**
 * 외부 호출 실행
 * POST /api/external-calls/execute
 */
router.post("/execute", async (req: Request, res: Response) => {
  try {
    const { diagramId, relationshipId, settings, templateData } = req.body;

    if (!diagramId || !relationshipId || !settings) {
      return res.status(400).json({
        success: false,
        error:
          "필수 파라미터가 누락되었습니다. (diagramId, relationshipId, settings)",
      });
    }

    // 설정 검증
    const validation = externalCallService.validateSettings(
      settings as SupportedExternalCallSettings
    );
    if (!validation.valid) {
      return res.status(400).json({
        success: false,
        error: "설정 검증 실패",
        details: validation.errors,
      });
    }

    // 외부 호출 요청 생성
    const callRequest: ExternalCallRequest = {
      diagramId: parseInt(diagramId),
      relationshipId,
      settings: settings as SupportedExternalCallSettings,
      templateData,
    };

    // 외부 호출 실행
    const result = await externalCallService.executeExternalCall(callRequest);

    // TODO: 호출 결과를 데이터베이스에 로그로 저장 (향후 구현)

    return res.json({
      success: true,
      result,
    });
  } catch (error) {
    console.error("외부 호출 실행 실패:", error);
    return res.status(500).json({
      success: false,
      error:
        error instanceof Error
          ? error.message
          : "알 수 없는 오류가 발생했습니다.",
    });
  }
});

/**
 * 지원되는 외부 호출 타입 목록 조회
 * GET /api/external-calls/types
 */
router.get("/types", (req: Request, res: Response) => {
  res.json({
    success: true,
    supportedTypes: {
      "rest-api": {
        name: "REST API 호출",
        subtypes: {
          slack: "슬랙 웹훅",
          "kakao-talk": "카카오톡 알림",
          discord: "디스코드 웹훅",
          generic: "일반 REST API",
        },
      },
      email: {
        name: "이메일 전송",
        status: "구현 예정",
      },
      ftp: {
        name: "FTP 업로드",
        status: "구현 예정",
      },
      queue: {
        name: "메시지 큐",
        status: "구현 예정",
      },
    },
  });
});

/**
 * 외부 호출 설정 검증
 * POST /api/external-calls/validate
 */
router.post("/validate", (req: Request, res: Response) => {
  try {
    const { settings } = req.body;

    if (!settings) {
      return res.status(400).json({
        success: false,
        error: "검증할 설정이 필요합니다.",
      });
    }

    const validation = externalCallService.validateSettings(
      settings as SupportedExternalCallSettings
    );

    return res.json({
      success: true,
      validation,
    });
  } catch (error) {
    console.error("설정 검증 실패:", error);
    return res.status(500).json({
      success: false,
      error:
        error instanceof Error ? error.message : "검증 중 오류가 발생했습니다.",
    });
  }
});

export default router;
