001// --------------------------------------------------------------------------------
002// Copyright 2002-2026 Echo Three, LLC
003//
004// Licensed under the Apache License, Version 2.0 (the "License");
005// you may not use this file except in compliance with the License.
006// You may obtain a copy of the License at
007//
008//     http://www.apache.org/licenses/LICENSE-2.0
009//
010// Unless required by applicable law or agreed to in writing, software
011// distributed under the License is distributed on an "AS IS" BASIS,
012// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
013// See the License for the specific language governing permissions and
014// limitations under the License.
015// --------------------------------------------------------------------------------
016
017package com.echothree.model.control.contact.server.logic;
018
019import com.echothree.control.user.contact.common.spec.PartyContactMechanismUniversalSpec;
020import com.echothree.model.control.contact.common.exception.UnknownPartyContactMechanismException;
021import com.echothree.model.control.contact.server.control.ContactControl;
022import com.echothree.model.control.core.common.ComponentVendors;
023import com.echothree.model.control.core.common.EntityTypes;
024import com.echothree.model.control.core.common.exception.InvalidParameterCountException;
025import com.echothree.model.control.core.server.logic.EntityInstanceLogic;
026import com.echothree.model.control.party.server.logic.PartyLogic;
027import com.echothree.model.data.contact.server.entity.ContactMechanism;
028import com.echothree.model.data.contact.server.entity.PartyContactMechanism;
029import com.echothree.model.data.party.server.entity.Party;
030import com.echothree.util.common.message.ExecutionErrors;
031import com.echothree.util.server.control.BaseLogic;
032import com.echothree.util.server.message.ExecutionErrorAccumulator;
033import com.echothree.util.server.persistence.EntityPermission;
034import javax.enterprise.context.ApplicationScoped;
035import javax.inject.Inject;
036
037@ApplicationScoped
038public class PartyContactMechanismLogic
039    extends BaseLogic {
040
041    protected PartyContactMechanismLogic() {
042        super();
043    }
044
045    @Inject
046    ContactControl contactControl;
047
048    @Inject
049    ContactMechanismLogic contactMechanismLogic;
050
051    @Inject
052    EntityInstanceLogic entityInstanceLogic;
053
054    @Inject
055    PartyLogic partyLogic;
056
057    public PartyContactMechanism getPartyContactMechanism(final ExecutionErrorAccumulator eea, final Party party,
058            final ContactMechanism contactMechanism, final EntityPermission entityPermission) {
059        var partyContactMechanism = contactControl.getPartyContactMechanism(party, contactMechanism, entityPermission);
060
061        if(partyContactMechanism == null) {
062            handleExecutionError(UnknownPartyContactMechanismException.class, eea, ExecutionErrors.UnknownPartyContactMechanism.name(),
063                    party.getLastDetail().getPartyName(), contactMechanism.getLastDetail().getContactMechanismName());
064        }
065
066        return partyContactMechanism;
067    }
068    
069    public PartyContactMechanism getPartyContactMechanism(final ExecutionErrorAccumulator eea, final Party party,
070            final ContactMechanism contactMechanism) {
071        return getPartyContactMechanism(eea, party, contactMechanism, EntityPermission.READ_ONLY);
072    }
073
074    public PartyContactMechanism getPartyContactMechanismForUpdate(final ExecutionErrorAccumulator eea, final Party party,
075            final ContactMechanism contactMechanism) {
076        return getPartyContactMechanism(eea, party, contactMechanism, EntityPermission.READ_WRITE);
077    }
078
079    public PartyContactMechanism getPartyContactMechanismByUniversalSpec(final ExecutionErrorAccumulator eea,
080            final PartyContactMechanismUniversalSpec universalSpec, final EntityPermission entityPermission) {
081        PartyContactMechanism partyContactMechanism = null;
082        var partyName = universalSpec.getPartyName();
083        var contactMechanismName = universalSpec.getContactMechanismName();
084        var possibleEntitySpecs = entityInstanceLogic.countPossibleEntitySpecs(universalSpec);
085        var parameterCount = (partyName == null ? 0 : 1) + (contactMechanismName == null ? 0 : 1) + possibleEntitySpecs;
086
087        switch(parameterCount) {
088            case 1 -> {
089                if(possibleEntitySpecs == 1) {
090                    var entityInstance = entityInstanceLogic.getEntityInstance(eea, universalSpec,
091                            ComponentVendors.ECHO_THREE.name(), EntityTypes.PartyContactMechanism.name());
092
093                    if(eea == null || !eea.hasExecutionErrors()) {
094                        partyContactMechanism = contactControl.getPartyContactMechanismByEntityInstance(entityInstance, entityPermission);
095                    }
096                } else {
097                    handleExecutionError(InvalidParameterCountException.class, eea, ExecutionErrors.InvalidParameterCount.name());
098                }
099            }
100            case 2 -> {
101                if(partyName != null && contactMechanismName != null) {
102                    var party = partyLogic.getPartyByName(eea, partyName);
103
104                    if(eea == null || !eea.hasExecutionErrors()) {
105                        var contactMechanism = contactMechanismLogic.getContactMechanismByName(eea, contactMechanismName);
106
107                        if(eea == null || !eea.hasExecutionErrors()) {
108                            partyContactMechanism = getPartyContactMechanism(eea, party, contactMechanism, entityPermission);
109                        }
110                    }
111                } else {
112                    handleExecutionError(InvalidParameterCountException.class, eea, ExecutionErrors.InvalidParameterCount.name());
113                }
114            }
115            default ->
116                    handleExecutionError(InvalidParameterCountException.class, eea, ExecutionErrors.InvalidParameterCount.name());
117        }
118
119        return partyContactMechanism;
120    }
121
122    public PartyContactMechanism getPartyContactMechanismByUniversalSpec(final ExecutionErrorAccumulator eea,
123            final PartyContactMechanismUniversalSpec universalSpec) {
124        return getPartyContactMechanismByUniversalSpec(eea, universalSpec, EntityPermission.READ_ONLY);
125    }
126
127    public PartyContactMechanism getPartyContactMechanismByUniversalSpecForUpdate(final ExecutionErrorAccumulator eea,
128            final PartyContactMechanismUniversalSpec universalSpec) {
129        return getPartyContactMechanismByUniversalSpec(eea, universalSpec, EntityPermission.READ_WRITE);
130    }
131
132}