/*
 * Licensed to the Apache Software Foundation (ASF) under one
 * or more contributor license agreements.  See the NOTICE file
 * distributed with this work for additional information
 * regarding copyright ownership.  The ASF licenses this file
 * to you under the Apache License, Version 2.0 (the
 * "License"); you may not use this file except in compliance
 * with the License.  You may obtain a copy of the License at
 *
 * http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing,
 * software distributed under the License is distributed on an
 * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
 * KIND, either express or implied.  See the License for the
 * specific language governing permissions and limitations
 * under the License.
 */

import org.ofbiz.entity.util.EntityUtil;
import org.ofbiz.party.contact.ContactHelper;
import org.ofbiz.entity.condition.EntityCondition;

if (userLogin) {
    party = userLogin.getRelatedOne("Party", false);
    contactMech = EntityUtil.getFirst(ContactHelper.getContactMech(party, "BILLING_LOCATION", "POSTAL_ADDRESS", false));
    if (contactMech) {
        postalAddress = contactMech.getRelatedOne("PostalAddress", false);
        billToContactMechId = postalAddress.contactMechId;
        context.billToContactMechId = billToContactMechId;
        context.billToName = postalAddress.toName;
        context.billToAttnName = postalAddress.attnName; 
        context.billToAddress1 = postalAddress.address1;
        context.billToAddress2 = postalAddress.address2;
        context.billToCity = postalAddress.city;
        context.billToPostalCode = postalAddress.postalCode;
        context.billToStateProvinceGeoId = postalAddress.stateProvinceGeoId;
        context.billToCountryGeoId = postalAddress.countryGeoId;
        billToStateProvinceGeo = delegator.findOne("Geo", [geoId : postalAddress.stateProvinceGeoId], false);
        if (billToStateProvinceGeo) {
            context.billToStateProvinceGeo = billToStateProvinceGeo.geoName;
        }
        billToCountryProvinceGeo = delegator.findOne("Geo", [geoId : postalAddress.countryGeoId], false);
        if (billToCountryProvinceGeo) {
            context.billToCountryProvinceGeo = billToCountryProvinceGeo.geoName;
        }

        creditCards = [];
        paymentMethod = EntityUtil.getFirst(EntityUtil.filterByDate(delegator.findList("PaymentMethod", EntityCondition.makeCondition([partyId : party.partyId, paymentMethodTypeId : "CREDIT_CARD"]), null, ["fromDate"], null, false)));
        if (paymentMethod) {
            creditCard = paymentMethod.getRelatedOne("CreditCard", false);
            context.paymentMethodTypeId = "CREDIT_CARD";
            context.cardNumber = creditCard.cardNumber;
            context.cardType = creditCard.cardType;
            context.paymentMethodId = creditCard.paymentMethodId;
            context.firstNameOnCard = creditCard.firstNameOnCard;
            context.lastNameOnCard = creditCard.lastNameOnCard;
            context.expMonth = (creditCard.expireDate).substring(0, 2);
            context.expYear = (creditCard.expireDate).substring(3);
        }
        if (shipToContactMechId) {
            if (billToContactMechId && billToContactMechId.equals(shipToContactMechId)) {
                context.useShippingAddressForBilling = "Y";
            }
        }
    }

    billToContactMechList = ContactHelper.getContactMech(party, "PHONE_BILLING", "TELECOM_NUMBER", false)
    if (billToContactMechList) {
        billToTelecomNumber = (EntityUtil.getFirst(billToContactMechList)).getRelatedOne("TelecomNumber", false);
        pcm = EntityUtil.getFirst(billToTelecomNumber.getRelated("PartyContactMech", null, null, false));
        context.billToTelecomNumber = billToTelecomNumber;
        context.billToExtension = pcm.extension;
    }

    billToFaxNumberList = ContactHelper.getContactMech(party, "FAX_BILLING", "TELECOM_NUMBER", false)
    if (billToFaxNumberList) {
        billToFaxNumber = (EntityUtil.getFirst(billToFaxNumberList)).getRelatedOne("TelecomNumber", false);
        faxPartyContactMech = EntityUtil.getFirst(billToFaxNumber.getRelated("PartyContactMech", null, null, false));
        context.billToFaxNumber = billToFaxNumber;
        context.billToFaxExtension = faxPartyContactMech.extension;
    }
}
