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