001// --------------------------------------------------------------------------------
002// Copyright 2002-2025 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.chain.server.logic;
018
019import com.echothree.model.control.chain.common.ChainConstants;
020import com.echothree.model.control.chain.server.control.ChainControl;
021import com.echothree.model.control.contactlist.server.control.ContactListControl;
022import com.echothree.model.control.core.common.ComponentVendors;
023import com.echothree.model.control.core.common.EntityTypes;
024import com.echothree.model.control.core.server.control.ComponentControl;
025import com.echothree.model.control.core.server.control.EntityTypeControl;
026import com.echothree.model.control.letter.server.control.LetterControl;
027import com.echothree.model.control.party.server.logic.PartyLogic;
028import com.echothree.model.data.chain.server.entity.ChainAction;
029import com.echothree.model.data.chain.server.entity.ChainInstance;
030import com.echothree.model.data.chain.server.entity.ChainInstanceStatus;
031import com.echothree.util.common.persistence.BasePK;
032import com.echothree.util.server.persistence.Session;
033import javax.enterprise.context.ApplicationScoped;
034import javax.enterprise.inject.spi.CDI;
035
036@ApplicationScoped
037public class ChainInstanceStatusLogic {
038
039    protected ChainInstanceStatusLogic() {
040        super();
041    }
042
043    public static ChainInstanceStatusLogic getInstance() {
044        return CDI.current().select(ChainInstanceStatusLogic.class).get();
045    }
046    
047    private void processChainActionLetter(final ChainControl chainControl, final ChainInstance chainInstance, final ChainAction chainAction, final BasePK processedBy) {
048        var chainActionLetter = chainControl.getChainActionLetter(chainAction);
049        var letter = chainActionLetter.getLetter();
050        var contactList = letter.getLastDetail().getContactList();
051        
052        if(contactList != null) {
053            var entityTypeControl = Session.getModelController(EntityTypeControl.class);
054            var componentControl = Session.getModelController(ComponentControl.class);
055            var chainType = chainInstance.getLastDetail().getChain().getLastDetail().getChainType();
056            var partyEntityType = entityTypeControl.getEntityTypeByName(componentControl.getComponentVendorByName(ComponentVendors.ECHO_THREE.name()), EntityTypes.Party.name());
057            
058            for(var chainEntityRoleType: chainControl.getChainEntityRoleTypes(chainType)) {
059                if(chainEntityRoleType.getLastDetail().getEntityType().equals(partyEntityType)) {
060                    var chainInstanceEntityRole = chainControl.getChainInstanceEntityRole(chainInstance, chainEntityRoleType);
061                    
062                    if(chainInstanceEntityRole != null) {
063                        var contactListControl = Session.getModelController(ContactListControl.class);
064                        var entityInstance = chainInstanceEntityRole.getEntityInstance();
065                        var party = PartyLogic.getInstance().getPartyFromEntityInstance(entityInstance);
066                        var partyContactList = contactListControl.getPartyContactList(party, contactList);
067                        
068                        if(partyContactList == null) {
069                            letter = null; // Don't send.
070                        }
071                    }
072                }
073            }
074        }
075        
076        if(letter != null) {
077            var letterControl = Session.getModelController(LetterControl.class);
078            
079            letterControl.createQueuedLetter(chainInstance, letter);
080        }
081    }    
082    
083    private void processChainActionSurvey(final ChainControl chainControl, final ChainInstance chainInstance, final ChainAction chainAction, final BasePK processedBy) {
084        var chainActionSurvey = chainControl.getChainActionSurvey(chainAction);
085        
086        // TODO
087    }    
088    
089    private void processChainActionChainActionSet(final Session session, final ChainControl chainControl, final ChainInstanceStatus chainInstanceStatus, final ChainAction chainAction, final BasePK processedBy) {
090        var chainActionChainActionSet = chainControl.getChainActionChainActionSet(chainAction);
091        var nextChainActionSet = chainActionChainActionSet.getNextChainActionSet();
092        Long nextChainActionSetTime = session.START_TIME + chainActionChainActionSet.getDelayTime();
093
094        chainInstanceStatus.setNextChainActionSet(nextChainActionSet);
095        chainInstanceStatus.setNextChainActionSetTime(nextChainActionSetTime);
096    }    
097    
098    public void processChainInstanceStatus(final Session session, final ChainControl chainControl, final ChainInstanceStatus chainInstanceStatus, final BasePK processedBy) {
099        var chainInstance = chainInstanceStatus.getChainInstance();
100        var chainActionSet = chainInstanceStatus.getNextChainActionSet();
101        var hasNextChainActionSet = false;
102
103        for(var chainAction: chainControl.getChainActionsByChainActionSet(chainActionSet)) {
104            var chainActionTypeName = chainAction.getLastDetail().getChainActionType().getLastDetail().getChainActionTypeName();
105            
106            if(chainActionTypeName.equals(ChainConstants.ChainActionType_LETTER)) {
107                processChainActionLetter(chainControl, chainInstance, chainAction, processedBy);
108            } else if(chainActionTypeName.equals(ChainConstants.ChainActionType_SURVEY)) {
109                processChainActionSurvey(chainControl, chainInstance, chainAction, processedBy);
110            } else if(chainActionTypeName.equals(ChainConstants.ChainActionType_CHAIN_ACTION_SET)) {
111                processChainActionChainActionSet(session, chainControl, chainInstanceStatus, chainAction, processedBy);
112                hasNextChainActionSet = true;
113            }
114        }
115
116        if(!hasNextChainActionSet) {
117            chainControl.removeChainInstanceStatusByChainInstance(chainInstance);
118        }
119    }
120    
121}