import { AxiosInterceptorOptions, InternalAxiosRequestConfig, AxiosResponse } from 'axios';
import { ILogger } from '../logging/logger.js';

type Interceptor = {
    options?: AxiosInterceptorOptions;
    request?: RequestInterceptor;
    response?: ResponseInterceptor;
    error?: ErrorInterceptor;
};
type ErrorContext<T = any> = {
    /**
     * The error
     */
    readonly error: T;
    /**
     * The clients logger instance
     */
    readonly log: ILogger;
};
/**
 * A method called to intercept a request that failed
 */
type ErrorInterceptor<T = any> = (ctx: ErrorContext<T>) => any;
type RequestContext<D = any> = {
    /**
     * The outgoing request config
     */
    readonly config: InternalAxiosRequestConfig<D>;
    /**
     * The clients logger instance
     */
    readonly log: ILogger;
};
/**
 * A method called to intercept a successful request
 */
type RequestInterceptor<D = any> = (ctx: RequestContext<D>) => InternalAxiosRequestConfig | Promise<InternalAxiosRequestConfig>;
type ResponseContext<T = any, D = any> = {
    /**
     * The response
     */
    readonly res: AxiosResponse<T, D>;
    /**
     * The clients logger instance
     */
    readonly log: ILogger;
};
/**
 * A method called to intercept a successful response
 */
type ResponseInterceptor<T = any, D = any> = (ctx: ResponseContext<T, D>) => AxiosResponse | Promise<AxiosResponse>;

export type { ErrorContext, ErrorInterceptor, Interceptor, RequestContext, RequestInterceptor, ResponseContext, ResponseInterceptor };
