/**
 * 플로우 전용 외부 DB 연결 API
 */

import {
  FlowExternalDbConnection,
  CreateFlowExternalDbConnectionRequest,
  UpdateFlowExternalDbConnectionRequest,
  FlowExternalDbConnectionListResponse,
  FlowExternalDbConnectionResponse,
  FlowExternalDbConnectionTestResponse,
} from "@/types/flowExternalDb";

const API_BASE = "/api/flow-external-db";

/**
 * 외부 DB 연결 API
 */
export const flowExternalDbApi = {
  /**
   * 모든 외부 DB 연결 조회
   */
  async getAll(activeOnly: boolean = false): Promise<FlowExternalDbConnectionListResponse> {
    const query = activeOnly ? "?activeOnly=true" : "";

    try {
      const response = await fetch(`${API_BASE}${query}`, {
        credentials: "include",
      });

      if (!response.ok) {
        // 오류 발생 시 빈 목록 반환 (조용히 실패)
        console.warn(`외부 DB 연결 목록 조회 실패: ${response.status} ${response.statusText}`);
        return { success: false, data: [] };
      }

      return response.json();
    } catch (error) {
      // 네트워크 오류 등 예외 발생 시에도 빈 목록 반환
      console.error("외부 DB 연결 목록 조회 오류:", error);
      return { success: false, data: [] };
    }
  },

  /**
   * 특정 외부 DB 연결 조회
   */
  async getById(id: number): Promise<FlowExternalDbConnectionResponse> {
    const response = await fetch(`${API_BASE}/${id}`, {
      credentials: "include",
    });

    if (!response.ok) {
      throw new Error(`외부 DB 연결 조회 실패: ${response.statusText}`);
    }

    return response.json();
  },

  /**
   * 새 외부 DB 연결 생성
   */
  async create(request: CreateFlowExternalDbConnectionRequest): Promise<FlowExternalDbConnectionResponse> {
    const response = await fetch(API_BASE, {
      method: "POST",
      headers: {
        "Content-Type": "application/json",
      },
      credentials: "include",
      body: JSON.stringify(request),
    });

    if (!response.ok) {
      const error = await response.json();
      throw new Error(error.message || "외부 DB 연결 생성 실패");
    }

    return response.json();
  },

  /**
   * 외부 DB 연결 수정
   */
  async update(id: number, request: UpdateFlowExternalDbConnectionRequest): Promise<FlowExternalDbConnectionResponse> {
    const response = await fetch(`${API_BASE}/${id}`, {
      method: "PUT",
      headers: {
        "Content-Type": "application/json",
      },
      credentials: "include",
      body: JSON.stringify(request),
    });

    if (!response.ok) {
      const error = await response.json();
      throw new Error(error.message || "외부 DB 연결 수정 실패");
    }

    return response.json();
  },

  /**
   * 외부 DB 연결 삭제
   */
  async delete(id: number): Promise<{ success: boolean; message: string }> {
    const response = await fetch(`${API_BASE}/${id}`, {
      method: "DELETE",
      credentials: "include",
    });

    if (!response.ok) {
      const error = await response.json();
      throw new Error(error.message || "외부 DB 연결 삭제 실패");
    }

    return response.json();
  },

  /**
   * 외부 DB 연결 테스트
   */
  async testConnection(id: number): Promise<FlowExternalDbConnectionTestResponse> {
    const response = await fetch(`${API_BASE}/${id}/test`, {
      method: "POST",
      credentials: "include",
    });

    const result = await response.json();

    if (!response.ok) {
      return {
        success: false,
        message: result.message || "연결 테스트 실패",
      };
    }

    return result;
  },
};
