/**
 * Cocos Network 子模块 - 公共类型定义
 *
 * 不依赖 @tencent/pmd-network / pmd-network-v2，完全自持，
 * 便于 pmd-api-cocos 独立发布、独立编译。
 */
/** 底层请求参数（传给 doRequest 的入参，经过请求拦截器链处理后） */
export interface IRawRequest {
    /** 最终请求 URL（已含 query） */
    url: string;
    /** HTTP method，默认 POST */
    method?: 'GET' | 'POST' | 'PUT' | 'DELETE' | 'HEAD' | 'OPTIONS';
    /** 请求头 */
    header?: Record<string, string>;
    /** 请求体（通常是业务 reqData） */
    reqData?: any;
    /** 业务层传入的附加参数（会在拦截器链之间透传） */
    extra?: {
        withCredentials?: boolean;
        headers?: Record<string, string>;
        /** decorator 内部用，标记重试次数防死循环 */
        __cocosRetried?: boolean;
        [k: string]: any;
    };
    /** 记录原始 url（拦截器可能多次改写，需要这个做幂等重试） */
    __cocosOriginUrl?: string;
    [k: string]: any;
}
/** 底层响应（doRequest 的返回） */
export interface IRawResponse {
    /** HTTP 状态码 */
    status: number;
    /** 2xx => true */
    ok: boolean;
    /** 响应 body（已做 JSON parse 尝试） */
    data: any;
    /** 原始状态文本或 errMsg */
    statusText: string;
    /** 大小写不敏感取 header */
    getHeader: (name: string) => string | null | undefined;
}
/**
 * 请求拦截器
 * 返回 [shouldAbort, param]
 *   - shouldAbort=true：中止链路，由上层处理
 *   - shouldAbort=false：继续下一个拦截器
 */
export interface IRequestInterceptor {
    interceptor(param: IRawRequest): [
        boolean,
        IRawRequest
    ] | Promise<[boolean, IRawRequest]>;
}
/**
 * 响应拦截器
 * 入参包含 request + response，方便拦截器做路由判断
 */
export interface IResponseInterceptorParam {
    /** 原始请求 */
    request: IRawRequest;
    /** 底层响应（含 getHeader） */
    response: IRawResponse;
    /** 业务数据（= response.data，由 GetDataInterceptor 提取出来） */
    data?: any;
}
export interface IResponseInterceptor {
    interceptor(param: IResponseInterceptorParam): [
        boolean,
        IResponseInterceptorParam
    ] | Promise<[boolean, IResponseInterceptorParam]>;
}
/**
 * 装饰器：包装整个 request Promise，用于做重试、限流、调度等横切逻辑
 * 需要自己决定调用 request() 的时机和次数
 */
export type IDecorator = (request: () => Promise<any>, param: IRawRequest) => Promise<any>;
/** 登录态存储接口（业务方注入，用 wx.getStorageSync 封装即可） */
export interface ICocosLoginInfoStorage {
    get: (key: string) => any;
    set: (key: string, value: any) => void;
    /** 删除指定 key（可选，业务方自定义 storage 未实现时回退到 set(key, null)） */
    removeItem?: (key: string) => void;
}
/** 登录态（后台下发的 logininfo 字段，本模块不解释具体字段含义，原样透传） */
export type LoginInfo = Record<string, any>;
