/**
 * API 客户端统一入口
 *
 * 导出 Orval 生成的 API 客户端实例和类型工具
 * 提供统一的类型定义和响应处理
 */

// 导入 Orval 生成的 API 客户端工厂函数
import { getReadingPlatformAPI } from './generated/index';

// 导出所有生成的类型
export * from './generated/model';

/**
 * API 客户端实例
 *
 * 使用方式：
 * ```ts
 * import { api } from '@/api/client';
 *
 * // 调用接口
 * const result = await api.teacherCourseControllerFindAll({ page: 1 });
 * ```
 */
export const api = getReadingPlatformAPI();

// 同时导出 getReadingPlatformAPI 以便需要时创建新实例
export { getReadingPlatformAPI };

// ============== 类型工具 ==============

/**
 * 统一响应格式
 *
 * 注意：后端返回的数据可能不遵循此格式，实际类型取决于具体的 API
 */
export interface ApiResult<T> {
  code: number;
  message: string;
  data: T;
}

/**
 * 分页数据格式
 */
export interface PageData<T> {
  items: T[];
  total: number;
  page: number;
  pageSize: number;
  totalPages?: number;
}

/**
 * 解包 Result<T> 类型，获取 data 字段的类型
 */
export type UnwrapResult<T> = T extends ApiResult<infer U> ? U : T;

/**
 * 提取分页响应的数据类型
 */
export type PageResultOf<T> = ApiResult<PageData<T>>;

// ============== 错误处理 ==============

/**
 * API 错误类
 */
export class ApiError extends Error {
  constructor(
    public code: number,
    message: string,
    public data?: any,
  ) {
    super(message);
    this.name = 'ApiError';
  }
}

/**
 * 检查响应是否成功
 *
 * @param result - API 响应结果
 * @returns 是否成功
 */
export function isSuccess<T>(result: ApiResult<T>): boolean {
  return result.code === 200;
}

/**
 * 抛出 API 错误（如果响应不成功）
 *
 * @param result - API 响应结果
 * @throws ApiError - 如果响应不成功
 */
export function throwErrorIfFailed<T>(result: ApiResult<T>): asserts result is ApiResult<T> & { data: T } {
  if (!isSuccess(result)) {
    throw new ApiError(result.code, result.message, result.data);
  }
}

/**
 * 从响应中提取 data 字段
 *
 * @param result - API 响应结果
 * @returns 解包后的数据
 *
 * @example
 * ```ts
 * const result = await api.teacherCourseControllerFindAll();
 * const data = unwrapData(result); // 类型推断为实际返回的数据类型
 * ```
 */
export function unwrapData<T>(result: any): T {
  // 尝试直接返回（如果响应已经是数据）
  if (result && typeof result === 'object') {
    // 如果有 code 字段，说明是包装的响应
    if ('code' in result && typeof result.code === 'number') {
      if (result.code === 200 || result.code === 0) {
        return result.data as T;
      }
      throw new ApiError(result.code, (result.message as string) || 'Request failed', result.data);
    }
    // 否则直接返回
    return result as T;
  }
  return result as T;
}

/**
 * 从分页响应中提取分页数据
 *
 * @param result - API 分页响应结果
 * @returns 分页数据
 *
 * @example
 * ```ts
 * const result = await api.teacherCourseControllerFindAll();
 * const pageData = unwrapPageData(result); // 类型为 PageData<T>
 * ```
 */
export function unwrapPageData<T>(result: any): PageData<T> {
  const data = unwrapData<any>(result);
  // 如果已经是分页格式
  if (data && typeof data === 'object' && 'items' in data && 'total' in data) {
    return data as PageData<T>;
  }
  // 否则包装为分页格式
  return {
    items: Array.isArray(data) ? data : [],
    total: Array.isArray(data) ? data.length : 0,
    page: 1,
    pageSize: Array.isArray(data) ? data.length : 0,
  };
}
