/*
 * 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.base.util.*;
import org.ofbiz.entity.util.EntityUtil;

partyId = null;

if (userLogin) {
    partyId = userLogin.partyId;
}

if (!partyId && parameters.partyId) {
    partyId = parameters.partyId;
}

if (partyId) {
    parameters.partyId = partyId;

    // NOTE: if there was an error, then don't look up and fill in all of this data, just use the values from the previous request (which will be in the parameters Map automagically)
    if (!request.getAttribute("_ERROR_MESSAGE_") && !request.getAttribute("_ERROR_MESSAGE_LIST_")) {
        person = delegator.findOne("Person", [partyId : partyId], false);
        if (person) {
            context.callSubmitForm = true;
            // should never be null for the anonymous checkout, but just in case
            parameters.personalTitle = person.personalTitle;
            parameters.firstName = person.firstName;
            parameters.middleName = person.middleName;
            parameters.lastName = person.lastName;
            parameters.suffix = person.suffix;

            //Parameters not in use, Do we really need these here or should be removed.
            parameters.residenceStatusEnumId = person.residenceStatusEnumId;
            parameters.maritalStatus = person.maritalStatus;
            parameters.employmentStatusEnumId = person.employmentStatusEnumId;
            parameters.occupation = person.occupation;
            parameters.yearsWithEmployer = person.yearsWithEmployer;
            parameters.monthsWithEmployer = person.monthsWithEmployer;
            parameters.existingCustomer = person.existingCustomer;

            // birthDate -> birthDateDay, birthDateMonth, birthDateYear
            birthDate = person.birthDate;
            if (birthDate) {
                // will be in the format "yyyy-mm-dd", like "2006-10-21"
                birthDateString = birthDate.toString();
                parameters.birthDateDay = birthDateString.substring(8);
                parameters.birthDateMonth = birthDateString.substring(5, 7);
                parameters.birthDateYear = birthDateString.substring(0, 4);
                // and finally, the whole thing, just in case we want it that way
                parameters.birthDate = birthDateString;
            }
        }

        // get the Email Address
        emailPartyContactDetail = EntityUtil.getFirst(EntityUtil.filterByDate(delegator.findByAnd("PartyContactDetailByPurpose",
                [partyId : partyId, contactMechPurposeTypeId : "PRIMARY_EMAIL"], null, false)));
        if (emailPartyContactDetail) {
            parameters.emailContactMechId = emailPartyContactDetail.contactMechId;
            parameters.emailAddress = emailPartyContactDetail.infoString;
            parameters.emailSol = emailPartyContactDetail.allowSolicitation;
        }

        // get the Phone Numbers
        homePhonePartyContactDetail = EntityUtil.getFirst(EntityUtil.filterByDate(delegator.findByAnd("PartyContactDetailByPurpose",
                [partyId : partyId, contactMechPurposeTypeId : "PHONE_HOME"], null, false)));
        if (homePhonePartyContactDetail) {
            parameters.homePhoneContactMechId = homePhonePartyContactDetail.contactMechId;
            parameters.homeCountryCode = homePhonePartyContactDetail.countryCode;
            parameters.homeAreaCode = homePhonePartyContactDetail.areaCode;
            parameters.homeContactNumber = homePhonePartyContactDetail.contactNumber;
            parameters.homeExt = homePhonePartyContactDetail.extension;
            parameters.homeSol = homePhonePartyContactDetail.allowSolicitation;
        }

        workPhonePartyContactDetail = EntityUtil.getFirst(EntityUtil.filterByDate(delegator.findByAnd("PartyContactDetailByPurpose",
                [partyId : partyId, contactMechPurposeTypeId : "PHONE_WORK"], null, false)));
        if (workPhonePartyContactDetail) {
            parameters.workPhoneContactMechId = workPhonePartyContactDetail.contactMechId;
            parameters.workCountryCode = workPhonePartyContactDetail.countryCode;
            parameters.workAreaCode = workPhonePartyContactDetail.areaCode;
            parameters.workContactNumber = workPhonePartyContactDetail.contactNumber;
            parameters.workExt = workPhonePartyContactDetail.extension;
            parameters.workSol = workPhonePartyContactDetail.allowSolicitation;
        }
    }
}
