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.chain.server.logic;
018
019import com.echothree.model.control.chain.common.ChainActionTypes;
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.control.BaseLogic;
033import com.echothree.util.server.persistence.Session;
034import javax.enterprise.context.ApplicationScoped;
035import javax.inject.Inject;
036
037@ApplicationScoped
038public class ChainInstanceStatusLogic
039        extends BaseLogic {
040
041    @Inject
042    ChainControl chainControl;
043
044    @Inject
045    ComponentControl componentControl;
046
047    @Inject
048    ContactListControl contactListControl;
049
050    @Inject
051    EntityTypeControl entityTypeControl;
052
053    @Inject
054    LetterControl letterControl;
055
056    @Inject
057    PartyLogic partyLogic;
058
059    protected ChainInstanceStatusLogic() {
060        super();
061    }
062    
063    private void processChainActionLetter(final ChainInstance chainInstance, final ChainAction chainAction, final BasePK processedBy) {
064        var chainActionLetter = chainControl.getChainActionLetter(chainAction);
065        var letter = chainActionLetter.getLetter();
066        var contactList = letter.getLastDetail().getContactList();
067        
068        if(contactList != null) {
069            var chainType = chainInstance.getLastDetail().getChain().getLastDetail().getChainType();
070            var partyEntityType = entityTypeControl.getEntityTypeByName(componentControl.getComponentVendorByName(ComponentVendors.ECHO_THREE.name()), EntityTypes.Party.name());
071            
072            for(var chainEntityRoleType: chainControl.getChainEntityRoleTypes(chainType)) {
073                if(chainEntityRoleType.getLastDetail().getEntityType().equals(partyEntityType)) {
074                    var chainInstanceEntityRole = chainControl.getChainInstanceEntityRole(chainInstance, chainEntityRoleType);
075                    
076                    if(chainInstanceEntityRole != null) {
077                        var entityInstance = chainInstanceEntityRole.getEntityInstance();
078                        var party = partyLogic.getPartyFromEntityInstance(entityInstance);
079                        var partyContactList = contactListControl.getPartyContactList(party, contactList);
080                        
081                        if(partyContactList == null) {
082                            letter = null; // Don't send.
083                        }
084                    }
085                }
086            }
087        }
088        
089        if(letter != null) {
090            letterControl.createQueuedLetter(chainInstance, letter);
091        }
092    }    
093    
094    private void processChainActionSurvey(final ChainInstance chainInstance, final ChainAction chainAction, final BasePK processedBy) {
095        var chainActionSurvey = chainControl.getChainActionSurvey(chainAction);
096        
097        // TODO
098    }    
099    
100    private void processChainActionChainActionSet(final Session session, final ChainInstanceStatus chainInstanceStatus, final ChainAction chainAction, final BasePK processedBy) {
101        var chainActionChainActionSet = chainControl.getChainActionChainActionSet(chainAction);
102        var nextChainActionSet = chainActionChainActionSet.getNextChainActionSet();
103        Long nextChainActionSetTime = session.getStartTime() + chainActionChainActionSet.getDelayTime();
104
105        chainInstanceStatus.setNextChainActionSet(nextChainActionSet);
106        chainInstanceStatus.setNextChainActionSetTime(nextChainActionSetTime);
107    }    
108    
109    public void processChainInstanceStatus(final Session session, final ChainInstanceStatus chainInstanceStatus, final BasePK processedBy) {
110        var chainInstance = chainInstanceStatus.getChainInstance();
111        var chainActionSet = chainInstanceStatus.getNextChainActionSet();
112        var hasNextChainActionSet = false;
113
114        for(var chainAction: chainControl.getChainActionsByChainActionSet(chainActionSet)) {
115            var chainActionTypeName = chainAction.getLastDetail().getChainActionType().getLastDetail().getChainActionTypeName();
116            
117            if(chainActionTypeName.equals(ChainActionTypes.LETTER.name())) {
118                processChainActionLetter(chainInstance, chainAction, processedBy);
119            } else if(chainActionTypeName.equals(ChainActionTypes.SURVEY.name())) {
120                processChainActionSurvey(chainInstance, chainAction, processedBy);
121            } else if(chainActionTypeName.equals(ChainActionTypes.CHAIN_ACTION_SET.name())) {
122                processChainActionChainActionSet(session, chainInstanceStatus, chainAction, processedBy);
123                hasNextChainActionSet = true;
124            }
125        }
126
127        if(!hasNextChainActionSet) {
128            chainControl.removeChainInstanceStatusByChainInstance(chainInstance);
129        }
130    }
131    
132}