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

import { DataMappingConfig } from "./DataMappingTypes";

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

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

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

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

  // 인증 설정
  authentication?: AuthenticationConfig;

  // 고급 설정
  timeout?: number; // 초 단위
  retryCount?: number;
  retryDelay?: number; // 밀리초 단위

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

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

  // Bearer Token 인증
  token?: string;

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

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

  // OAuth2 (향후 확장)
  clientId?: string;
  clientSecret?: string;
  tokenUrl?: string;
}

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

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

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

  // 오류 처리 설정
  errorHandling?: {
    continueOnError: boolean;
    logErrors: boolean;
    notifyOnError: 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;
  statusCode?: number;
  responseTime: number; // 밀리초
  response?: string; // 백엔드에서 response 필드로 응답 텍스트 전송
  error?: string;
  timestamp: string;
}

// API 실행 결과 타입
export interface ApiExecutionResult extends ApiTestResult {
  executionId: string;
  relationshipId: string;
  diagramId: string;
  retryCount?: number;
  finalAttempt: boolean;
}

// 외부호출 실행 컨텍스트
export interface ExternalCallContext {
  relationshipId: string;
  diagramId: string;
  userId: string;
  executionId: string;
  sourceData: Record<string, any>;
  targetData?: Record<string, any>;
  timestamp: string;
  metadata?: Record<string, any>;
}

// 외부호출 로그 타입
export interface ExternalCallLog {
  id: string;
  relationshipId: string;
  diagramId: string;
  executionId: string;
  callType: string;
  apiUrl: string;
  httpMethod: string;
  requestHeaders: Record<string, string>;
  requestBody?: string;
  responseStatusCode?: number;
  responseHeaders?: Record<string, string>;
  responseBody?: string;
  responseTime: number;
  success: boolean;
  error?: string;
  retryCount: number;
  createdAt: string;
}

// 외부호출 통계 타입
export interface ExternalCallStats {
  totalCalls: number;
  successfulCalls: number;
  failedCalls: number;
  averageResponseTime: number;
  lastExecuted?: string;
  mostUsedEndpoint?: string;
  errorRate: number;
}

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

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

// 외부호출 패널 Props 타입
export interface ExternalCallPanelProps {
  relationshipId: string;
  onSettingsChange: (settings: ExternalCallConfig) => void;
  initialSettings?: 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;
}
