import axios, { AxiosResponse, AxiosError } from 'axios';
import { AddressResponse } from '../types/addressResponse';
import { Address, CustomError } from '../types/custom';
import getConfig from './config';
import logger from './logger';

const config = getConfig();

export const checkPostCode = async (postcode: string): Promise<AddressResponse> => {
    const response = {} as AddressResponse;
    try {
        const result: AxiosResponse<Address[]> = await axios.get(`${config.postCodeCheckUrl}${postcode.trim().toUpperCase()}`, {
            auth: {
                username: config.webapi_username,
                password: config.webapi_password,
            }
        });
        response.addresses = result.data.length > 0 ? result.data : [] as Address[];
        return response;
    } catch (error) {
        setError(error, response)
        logger.error("checkPostCode catch error" + error);
        return response;
    }
};

// eslint-disable-next-line @typescript-eslint/no-explicit-any
export const setError = (error: any, res: AddressResponse) => {
    res.error = {} as CustomError;
    
    if (axios.isAxiosError(error)) {
        const axiosError: AxiosError = error;
        if (axiosError.response) {
            res.error.status = axiosError.response.status as number;
            res.error.message = axiosError.message;
        } else {
            res.error.status = 500;
        }
    } else {
        res.error.status = 500;
        res.error.message = error.message;
    }
}
