/**
 * REST API 전용 타입 정의
 * REST API 호출에 특화된 세부 타입들
 */

// HTTP 메서드 타입
export type HttpMethod = "GET" | "POST" | "PUT" | "DELETE" | "PATCH" | "HEAD" | "OPTIONS";

// Content-Type 타입
export type ContentType =
  | "application/json"
  | "application/xml"
  | "application/x-www-form-urlencoded"
  | "multipart/form-data"
  | "text/plain"
  | "text/html"
  | "text/xml";

// 인증 타입별 세부 설정
export interface BearerTokenAuth {
  type: "bearer";
  token: string;
  tokenPrefix?: string; // 기본값: "Bearer"
}

export interface BasicAuth {
  type: "basic";
  username: string;
  password: string;
}

export interface ApiKeyAuth {
  type: "api-key";
  apiKey: string;
  location: "header" | "query";
  keyName: string; // 헤더명 또는 쿼리 파라미터명
}

export interface OAuth2Auth {
  type: "oauth2";
  clientId: string;
  clientSecret: string;
  tokenUrl: string;
  scope?: string;
  grantType: "client_credentials" | "authorization_code" | "password";
}

export interface NoAuth {
  type: "none";
}

// 통합 인증 타입
export type AuthenticationType = BearerTokenAuth | BasicAuth | ApiKeyAuth | OAuth2Auth | NoAuth;

// HTTP 헤더 프리셋
export interface HeaderPreset {
  name: string;
  headers: Record<string, string>;
  description: string;
}

export const COMMON_HEADER_PRESETS: HeaderPreset[] = [
  {
    name: "JSON API",
    headers: {
      "Content-Type": "application/json",
      Accept: "application/json",
    },
    description: "JSON 데이터 송수신용 헤더",
  },
  {
    name: "Form Data",
    headers: {
      "Content-Type": "application/x-www-form-urlencoded",
    },
    description: "폼 데이터 전송용 헤더",
  },
  {
    name: "XML API",
    headers: {
      "Content-Type": "application/xml",
      Accept: "application/xml",
    },
    description: "XML 데이터 송수신용 헤더",
  },
  {
    name: "File Upload",
    headers: {
      "Content-Type": "multipart/form-data",
    },
    description: "파일 업로드용 헤더",
  },
];

// 요청 바디 템플릿 타입
export interface RequestBodyTemplate {
  type: "json" | "xml" | "form" | "text" | "raw";
  template: string;
  variables: string[]; // 템플릿에서 사용된 변수 목록
}

// JSON 바디 템플릿 예제
export const JSON_BODY_TEMPLATES = {
  simple: {
    name: "간단한 메시지",
    template: `{
  "message": "{{message}}",
  "timestamp": "{{timestamp}}"
}`,
  },
  webhook: {
    name: "웹훅 알림",
    template: `{
  "event": "data_updated",
  "data": {{sourceData}},
  "metadata": {
    "relationshipId": "{{relationshipId}}",
    "executedAt": "{{timestamp}}",
    "executedBy": "{{userId}}"
  }
}`,
  },
  slack: {
    name: "슬랙 메시지",
    template: `{
  "text": "데이터가 업데이트되었습니다",
  "blocks": [
    {
      "type": "section",
      "text": {
        "type": "mrkdwn",
        "text": "*데이터 변경 알림*\\n관계 ID: {{relationshipId}}\\n실행 시간: {{timestamp}}"
      }
    },
    {
      "type": "section",
      "fields": [
        {
          "type": "mrkdwn",
          "text": "*소스 데이터:*\\n\`\`\`{{sourceData}}\`\`\`"
        }
      ]
    }
  ]
}`,
  },
  discord: {
    name: "디스코드 웹훅",
    template: `{
  "username": "ERP 시스템",
  "content": "데이터가 업데이트되었습니다.",
  "embeds": [
    {
      "title": "데이터 변경 알림",
      "description": "관계 실행이 완료되었습니다.",
      "color": 5814783,
      "fields": [
        {
          "name": "관계 ID",
          "value": "{{relationshipId}}",
          "inline": true
        },
        {
          "name": "실행 시간",
          "value": "{{timestamp}}",
          "inline": true
        }
      ],
      "footer": {
        "text": "ERP 제어관리 시스템"
      }
    }
  ]
}`,
  },
};

// 응답 상태 코드 그룹
export interface StatusCodeGroup {
  name: string;
  codes: number[];
  description: string;
  isSuccess: boolean;
}

export const HTTP_STATUS_GROUPS: StatusCodeGroup[] = [
  {
    name: "성공 (2xx)",
    codes: [200, 201, 202, 204],
    description: "요청이 성공적으로 처리됨",
    isSuccess: true,
  },
  {
    name: "리다이렉션 (3xx)",
    codes: [301, 302, 304],
    description: "추가 작업이 필요함",
    isSuccess: false,
  },
  {
    name: "클라이언트 오류 (4xx)",
    codes: [400, 401, 403, 404, 422, 429],
    description: "클라이언트 요청에 오류가 있음",
    isSuccess: false,
  },
  {
    name: "서버 오류 (5xx)",
    codes: [500, 502, 503, 504],
    description: "서버에서 오류가 발생함",
    isSuccess: false,
  },
];

// 재시도 정책 타입
export interface RetryPolicy {
  enabled: boolean;
  maxRetries: number;
  retryDelay: number; // 밀리초
  backoffStrategy: "fixed" | "exponential" | "linear";
  retryOnStatusCodes: number[]; // 재시도할 상태 코드
  retryOnTimeout: boolean;
}

// 기본 재시도 정책
export const DEFAULT_RETRY_POLICY: RetryPolicy = {
  enabled: true,
  maxRetries: 3,
  retryDelay: 1000,
  backoffStrategy: "exponential",
  retryOnStatusCodes: [429, 500, 502, 503, 504],
  retryOnTimeout: true,
};

// 타임아웃 설정 타입
export interface TimeoutConfig {
  connection: number; // 연결 타임아웃 (밀리초)
  request: number; // 요청 타임아웃 (밀리초)
  response: number; // 응답 타임아웃 (밀리초)
}

// 기본 타임아웃 설정
export const DEFAULT_TIMEOUT_CONFIG: TimeoutConfig = {
  connection: 5000, // 5초
  request: 30000, // 30초
  response: 30000, // 30초
};

// API 엔드포인트 프리셋
export interface ApiEndpointPreset {
  id: string;
  name: string;
  category: "webhook" | "notification" | "integration" | "monitoring";
  baseUrl: string;
  defaultMethod: HttpMethod;
  defaultHeaders: Record<string, string>;
  authType: AuthenticationType["type"];
  description: string;
  documentation?: string;
  examples: RequestBodyTemplate[];
}

// 인기 있는 API 서비스 프리셋
export const POPULAR_API_PRESETS: ApiEndpointPreset[] = [
  {
    id: "slack-webhook",
    name: "Slack 웹훅",
    category: "notification",
    baseUrl: "https://hooks.slack.com/services/",
    defaultMethod: "POST",
    defaultHeaders: {
      "Content-Type": "application/json",
    },
    authType: "none",
    description: "Slack 채널로 메시지 전송",
    examples: [
      {
        type: "json",
        template: JSON_BODY_TEMPLATES.slack.template,
        variables: ["relationshipId", "timestamp", "sourceData"],
      },
    ],
  },
  {
    id: "discord-webhook",
    name: "Discord 웹훅",
    category: "notification",
    baseUrl: "https://discord.com/api/webhooks/",
    defaultMethod: "POST",
    defaultHeaders: {
      "Content-Type": "application/json",
    },
    authType: "none",
    description: "Discord 채널로 메시지 전송",
    examples: [
      {
        type: "json",
        template: JSON_BODY_TEMPLATES.discord.template,
        variables: ["relationshipId", "timestamp"],
      },
    ],
  },
  {
    id: "generic-webhook",
    name: "일반 웹훅",
    category: "webhook",
    baseUrl: "https://api.example.com/webhook",
    defaultMethod: "POST",
    defaultHeaders: {
      "Content-Type": "application/json",
    },
    authType: "bearer",
    description: "일반적인 웹훅 엔드포인트",
    examples: [
      {
        type: "json",
        template: JSON_BODY_TEMPLATES.webhook.template,
        variables: ["sourceData", "relationshipId", "timestamp", "userId"],
      },
    ],
  },
];

// URL 검증 결과 타입
export interface UrlValidationResult {
  valid: boolean;
  protocol?: string;
  hostname?: string;
  port?: number;
  pathname?: string;
  errors: string[];
}

// 헤더 검증 결과 타입
export interface HeaderValidationResult {
  valid: boolean;
  warnings: string[];
  errors: string[];
  suggestions: string[];
}

// JSON 템플릿 검증 결과 타입
export interface JsonTemplateValidationResult {
  valid: boolean;
  parseable: boolean;
  variables: string[];
  errors: string[];
  warnings: string[];
}

// REST API 설정 전체 검증 결과
export interface RestApiValidationResult {
  valid: boolean;
  url: UrlValidationResult;
  headers: HeaderValidationResult;
  body: JsonTemplateValidationResult;
  auth: {
    valid: boolean;
    errors: string[];
  };
  overall: {
    errors: string[];
    warnings: string[];
    suggestions: string[];
  };
}
