const config = {
    api_url: 'https://api.prioritypassport.com',
}

class PassportCheckout  {

    constructor() {
    }

    //Get  token from the server 
    getToken = async (target, {secureform , bindToken }) => {
        const data = new FormData(target);
        const value = Object.fromEntries(data.entries());

        let request = {};
        let billingAddress = {
            addressLine1 :value.addressLine1,   
            city :value.city,   
            state :value.state,   
            zip :value.zip,   
            country: value.country
        };
        let avs = {
            addressLine1: value.avsAddressLine,
            firstName: value.avsFirstName,
            lastName: value.avsLastName,
            zip: value.avsZip,
            phone: value.avsPhone,
            email: value.avsEmail,
          
        };
        let cardHolder = {
            phone: value.phone,
            email: value.email,
            name: value.holderName  || (value.firstName + ' ' + value.lastName) 
        }

        for(let prop in avs){
            if (!avs[prop]) {
                delete avs[prop];
            }
        }

        for(let prop in billingAddress){
            if (!billingAddress[prop]) {
                delete billingAddress[prop];
            }
        }

        for(let prop in cardHolder){
            if (!cardHolder[prop]) {
                delete cardHolder[prop];
            }
        }
   
        if (value.addressLine2) {
            if (value.addressLine2 !== "") {
                billingAddress['addressLine2'] = value.addressLine2;
            }
        }
        value.holderName = value.holderName ||  (value.firstName + ' ' + value.lastName)

        delete value['addressLine2'];
        delete value['addressLine1'];
        delete value['state'];
        delete value['city'];
        delete value['zip'];
        delete value['token'];
        delete value['avsFirstName'];
        delete value['avsLastName'];
        delete value['avsAddressLine'];
        delete value['avsZip'];
        delete value['avsEmail'];
        delete value['avsPhone'];
        delete value['avsState'];
        delete value['avsCountry'];
        delete value['avsCity'];
        delete value['phone'];
        delete value['email'];
        delete value['firstName'];
        delete value['lastName'];
        delete value['country'];

        request = { ...value,
            ...Object.keys(billingAddress).length > 0 && {billingAddress},
            ...Object.keys(avs).length > 0 && { avs},
            ...Object.keys(cardHolder).length > 0 && {cardHolder},
        };

        try {
            const response = await fetch(`${config.api_url}/v1/card/tokenize`, {method: 'POST',headers: { 'Content-Type': "application/json"},body: JSON.stringify(request)});
            const token = await response.json(); //extract JSON from the http response

            if(token.token) {
                if(secureform)  {
                    target.reset();
                }  
                if(bindToken) {
                    let input = document.createElement("input")
                    input.setAttribute('value', token.token)
                    input.setAttribute('id', 'token')
                    input.setAttribute('type', 'hidden')
                    target.append(input);
                }
                return  { status: 1, token: token.token}
            } else {
                return { status: 0, errorMessage: token.errorMessage, errors: token.errors}
            }
        } catch (error) {
            return error
        }
    }
}


