/**
 * @file HTTP 客户端接口
 * @description 定义 HTTP 客户端的抽象接口
 * @author JunBin.Yang
 */

import { Unknown } from "@core/common";
import { NetworkConfig } from './NetworkConfig';
import { HttpInterceptor } from './HttpInterceptor';

/**
 * 请求选项
 */
export interface RequestOptions {
  /**
   * 请求头
   */
  headers?: Record<string, string>;

  /**
   * 超时时间(毫秒)
   */
  timeout?: number;

  /**
   * URL 参数
   */
  params?: Record<string, Unknown>;
}

/**
 * HTTP 客户端接口
 */
export interface HttpClient {
  /**
   * GET 请求
   * @param url 请求地址
   * @param options 请求选项
   * @returns 响应数据
   */
  get<T>(url: string, options?: RequestOptions): Promise<T>;

  /**
   * POST 请求
   * @param url 请求地址
   * @param data 请求体
   * @param options 请求选项
   * @returns 响应数据
   */
  post<T>(url: string, data?: Unknown, options?: RequestOptions): Promise<T>;

  /**
   * PUT 请求
   * @param url 请求地址
   * @param data 请求体
   * @param options 请求选项
   * @returns 响应数据
   */
  put<T>(url: string, data?: Unknown, options?: RequestOptions): Promise<T>;

  /**
   * DELETE 请求
   * @param url 请求地址
   * @param options 请求选项
   * @returns 响应数据
   */
  delete<T>(url: string, options?: RequestOptions): Promise<T>;

  /**
   * 添加拦截器
   * @param interceptor 拦截器实例
   */
  addInterceptor(interceptor: HttpInterceptor): void;

  /**
   * 移除拦截器
   * @param interceptor 拦截器实例
   */
  removeInterceptor(interceptor: HttpInterceptor): void;

  /**
   * 获取当前配置
   * @returns 网络配置
   */
  getConfig(): NetworkConfig;

  /**
   * 更新配置
   * @param config 新配置
   */
  updateConfig(config: Partial<NetworkConfig>): void;
}