/*
 * 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.entity.condition.EntityCondition
import org.ofbiz.party.contact.ContactHelper

partyId = parameters.partyId;
if (partyId) {
    party =  from("Party").where("partyId", partyId).queryOne();
    person = party.getRelatedOne("Person", false);
    contactDetailMap = [partyId : partyId, firstName : person.firstName, lastName : person.lastName, suffix : person.suffix];
    partyRelationship = from("PartyRelationship")
                            .where("partyIdTo", partyId, "roleTypeIdTo", "EMPLOYEE", "roleTypeIdFrom", "LEAD", "partyRelationshipTypeId", "EMPLOYMENT")
                            .orderBy("-fromDate")
                            .filterByDate()
                            .queryFirst();
    if (partyRelationship) {
        contactDetailMap.title = partyRelationship.positionTitle;
        partyGroup = from("PartyGroup").where("partyId", partyRelationship.partyIdFrom).queryOne();
        if (partyGroup) {
            if (partyGroup.groupName) {
                contactDetailMap.groupName = partyGroup.groupName;
            }
            if (partyGroup.officeSiteName) {
                contactDetailMap.officeSiteName = partyGroup.officeSiteName;
            }
            if (partyGroup.numEmployees) {
                contactDetailMap.numEmployees = partyGroup.numEmployees;
            }
        }
    }
    generalContactMech = EntityUtil.getFirst(ContactHelper.getContactMech(person, "GENERAL_LOCATION", "POSTAL_ADDRESS", false));
    if (generalContactMech) {
        contactDetailMap.addrContactMechId = generalContactMech.contactMechId;
        postalAddress = generalContactMech.getRelatedOne("PostalAddress", false);
        if (postalAddress) {
            contactDetailMap.address1 = postalAddress.address1;
            contactDetailMap.city = postalAddress.city;
            contactDetailMap.stateProvinceGeoId = postalAddress.stateProvinceGeoId;
            contactDetailMap.countryGeoId = postalAddress.countryGeoId;
            contactDetailMap.postalCode = postalAddress.postalCode;
            address2 = postalAddress.address2;
            if (address2) {
                contactDetailMap.address2 = address2;
            }
        }
    }
    emailContactMech = EntityUtil.getFirst(ContactHelper.getContactMech(person, "PRIMARY_EMAIL", "EMAIL_ADDRESS", false));
    if (emailContactMech) {
        contactDetailMap.emailAddress = emailContactMech.infoString;
        contactDetailMap.emailContactMechId = emailContactMech.contactMechId;
    }
    phoneContactMech = EntityUtil.getFirst(ContactHelper.getContactMech(person, "PRIMARY_PHONE", "TELECOM_NUMBER", false));
    if (phoneContactMech) {
        contactDetailMap.phoneContactMechId = phoneContactMech.contactMechId;
        telecomNumber = phoneContactMech.getRelatedOne("TelecomNumber", false);
        if (telecomNumber) {
            countryCode = telecomNumber.countryCode;
            if (countryCode) {
                contactDetailMap.countryCode = countryCode;
            }
            areaCode = telecomNumber.areaCode;
            if (areaCode) {
                contactDetailMap.areaCode = areaCode;
            }
            contactNumber = telecomNumber.contactNumber;
            if (contactNumber) {
                contactDetailMap.contactNumber = contactNumber;
            }
        }
    }
    partyDataSource = EntityUtil.getFirst(party.getRelated("PartyDataSource", null, null, false));
    if (partyDataSource) {
        dataSource = partyDataSource.getRelatedOne("DataSource", false);
        contactDetailMap.leadSource = dataSource.description;
    }
}
context.contactDetailMap = contactDetailMap;
