import { CreateTransferRequest, CreateTransferResponse, Transfer } from './types/index.js';
import AxiosClient from './AxiosClient.js';
import NameApiError from './NameApiError.js';

export default class NameComTransfers extends AxiosClient {


    async listTransfers(perPage:number = 0, page:number = 0 ) {
        try {
            const params = `perPage=${perPage}&page=${page}`;
            const response = await this.axiosInstance.get(`/transfers?${params}`);
            return response.data;
        } catch (error:any) {
            //console.error('Error listing transfers:', error.response.data);
            throw error;
        }
    }

    async getTransfer(domainName:string, id:number ): Promise<Transfer> {
        try {
            const response = await this.axiosInstance.get(`/transfers/${domainName}`);
            return response.data as Transfer ;
        } catch (error:any) {
            //console.error('Error getting transfer:', error.response.data);
            throw error;
        }
    }

    async createTransfer(transfer: CreateTransferRequest): Promise<CreateTransferResponse>  {
        console.log("curl -u '"+this.username+":"+this.token+"' 'https://api.dev.name.com/v4/transfers' -X POST -H 'Content-Type: application/json' --data '{\"domainName\":"+transfer.domainName+",\"authCode\":\"Authc0de\",\"purchasePrice\":"+transfer.purchasePrice+"'");
        try {
            // console.log(`curl -X POST -H "Content-Type: application/json" -u "${this.username+':'+this.token}" -d '${JSON.stringify(domainData)}' ${this.baseUrl}/domains`);
            const response = await this.axiosInstance.post(`/transfers`, transfer);
            if (response.status >= 400 && response.status < 500) {
               const responseBody = response.data;
               throw new NameApiError("API Error 400", true, response.status, responseBody);
             }
             return response.data as CreateTransferResponse;
           } catch (error: any) {
             if (error.response) {
               const responseBody = error.response.data;
               throw new NameApiError("API Error", true, error.response.status, responseBody);
             }
             throw new NameApiError("API Error", true, 500, {message: error.message, details: "Generic Error"});
           }
    }

        // CancelTransfer cancels a pending transfer request and refunds the amount to account credit.
    async  cancelTransfer(transferRequest: Transfer) {
        const endpoint = `/transfers/${transferRequest.domainName}:cancel`;

        try {
            const response = await this.axiosInstance.post(endpoint, transferRequest);
            return response.data;
        } catch (error:any) {
            throw error;
        }
    }

    



}

