/**
 * 외부호출 전용 타입 정의
 * 데이터 저장 기능과 완전히 분리된 독립적인 타입 구조
 */

import { DataMappingConfig } from "./DataMappingTypes";

// 외부호출 메인 설정 타입
export interface ExternalCallConfig {
  call_type: "rest-api"; // 향후 "webhook", "email", "ftp" 등 확장 가능
  rest_api_settings: RestApiSettings;
  data_mapping_config?: DataMappingConfig; // 데이터 매핑 설정 추가
  metadata?: {
    created_at: string;
    updated_at: string;
    version: string;
  };
}

// REST API 설정 타입
export interface RestApiSettings {
  // 기본 설정
  api_url: string;
  http_method: "GET" | "POST" | "PUT" | "DELETE" | "PATCH";

  // 헤더 설정
  headers: Record<string, string>;

  // 요청 바디 (POST/PUT/PATCH 시 사용)
  body_template: string;

  // 인증 설정
  authentication?: AuthenticationConfig;

  // 고급 설정
  timeout?: number; // 초 단위
  retry_count?: number;
  retry_delay?: number; // 밀리초 단위

  // 응답 처리 설정
  response_handling?: ResponseHandlingConfig;
}

// 인증 설정 타입
export interface AuthenticationConfig {
  type: "none" | "bearer" | "basic" | "api-key" | "oauth2";

  // Bearer Token 인증
  token?: string;

  // Basic 인증
  username?: string;
  password?: string;

  // API Key 인증
  api_key?: string;
  api_key_header?: string; // 기본값: "X-API-Key"
  api_key_location?: "header" | "query"; // API Key 위치
  api_key_query_param?: string; // 쿼리 파라미터명 (location이 query일 때)

  // OAuth2 (향후 확장)
  client_id?: string;
  client_secret?: string;
  token_url?: string;
}

// 응답 처리 설정 타입
export interface ResponseHandlingConfig {
  // 성공 상태 코드 범위
  success_status_codes?: number[];

  // 응답 데이터 저장 여부
  save_response?: boolean;

  // 응답 데이터 파싱 설정
  response_parser?: {
    type: "json" | "xml" | "text";
    extract_path?: string; // JSONPath 또는 XPath
  };

  // 오류 처리 설정
  error_handling?: {
    continue_on_error: boolean;
    log_errors: boolean;
    notify_on_error: boolean;
  };
}

// 템플릿 변수 타입
export interface TemplateVariable {
  key: string;
  description: string;
  example: string;
  type: "string" | "number" | "object" | "array";
}

// 사용 가능한 템플릿 변수 목록
export const AVAILABLE_TEMPLATE_VARIABLES: TemplateVariable[] = [
  {
    key: "sourceData",
    description: "소스 노드의 전체 데이터",
    example: "{{sourceData}}",
    type: "object",
  },
  {
    key: "targetData",
    description: "타겟 노드의 데이터 (있는 경우)",
    example: "{{targetData}}",
    type: "object",
  },
  {
    key: "timestamp",
    description: "현재 타임스탬프 (ISO 8601 형식)",
    example: "{{timestamp}}",
    type: "string",
  },
  {
    key: "relationshipId",
    description: "현재 관계의 고유 ID",
    example: "{{relationshipId}}",
    type: "string",
  },
  {
    key: "diagramId",
    description: "현재 다이어그램의 고유 ID",
    example: "{{diagramId}}",
    type: "string",
  },
  {
    key: "userId",
    description: "현재 사용자의 ID",
    example: "{{userId}}",
    type: "string",
  },
  {
    key: "executionId",
    description: "현재 실행의 고유 ID",
    example: "{{executionId}}",
    type: "string",
  },
];

// API 테스트 결과 타입
export interface ApiTestResult {
  success: boolean;
  status_code?: number;
  response_time: number; // 밀리초
  response?: string; // 백엔드에서 response 필드로 응답 텍스트 전송
  error?: string;
  timestamp: string;
}

// API 실행 결과 타입
export interface ApiExecutionResult extends ApiTestResult {
  execution_id: string;
  relationship_id: string;
  diagram_id: string;
  retry_count?: number;
  final_attempt: boolean;
}

// 외부호출 실행 컨텍스트
export interface ExternalCallContext {
  relationship_id: string;
  diagram_id: string;
  user_id: string;
  execution_id: string;
  source_data: Record<string, any>;
  target_data?: Record<string, any>;
  timestamp: string;
  metadata?: Record<string, any>;
}

// 외부호출 로그 타입
export interface ExternalCallLog {
  id: string;
  relationship_id: string;
  diagram_id: string;
  execution_id: string;
  call_type: string;
  api_url: string;
  http_method: string;
  request_headers: Record<string, string>;
  request_body?: string;
  response_status_code?: number;
  response_headers?: Record<string, string>;
  response_body?: string;
  response_time: number;
  success: boolean;
  error?: string;
  retry_count: number;
  created_at: string;
}

// 외부호출 통계 타입
export interface ExternalCallStats {
  total_calls: number;
  successful_calls: number;
  failed_calls: number;
  average_response_time: number;
  last_executed?: string;
  most_used_endpoint?: string;
  error_rate: number;
}

// 프리셋 API 설정 타입 (자주 사용되는 API 설정 저장용)
export interface ApiPreset {
  id: string;
  name: string;
  description: string;
  category: "webhook" | "notification" | "integration" | "custom";
  settings: RestApiSettings;
  isPublic: boolean;
  created_by: string;
  created_at: string;
  updated_at: string;
  usage_count: number;
}

// 외부호출 검증 결과 타입
export interface ExternalCallValidationResult {
  valid: boolean;
  errors: string[];
  warnings: string[];
  suggestions?: string[];
}

// 외부호출 패널 Props 타입
export interface ExternalCallPanelProps {
  relationship_id: string;
  onSettingsChange: (settings: ExternalCallConfig) => void;
  initial_settings?: ExternalCallConfig;
  readonly?: boolean;
}

// REST API 설정 컴포넌트 Props 타입
export interface RestApiSettingsProps {
  settings: RestApiSettings;
  onSettingsChange: (settings: RestApiSettings) => void;
  readonly?: boolean;
}

// API 테스트 패널 Props 타입
export interface ExternalCallTestPanelProps {
  settings: RestApiSettings;
  context?: Partial<ExternalCallContext>;
  onTestResult: (result: ApiTestResult) => void;
  disabled?: boolean;
}
