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.picklist.server.logic;
018
019import com.echothree.model.control.picklist.server.control.PicklistControl;
020import com.echothree.model.data.picklist.server.entity.Picklist;
021import com.echothree.model.data.picklist.server.entity.PicklistDetail;
022import com.echothree.model.data.picklist.server.entity.PicklistTime;
023import com.echothree.model.data.picklist.server.entity.PicklistTimeType;
024import com.echothree.model.data.picklist.server.entity.PicklistType;
025import com.echothree.model.data.picklist.server.value.PicklistTimeValue;
026import com.echothree.util.common.message.ExecutionErrors;
027import com.echothree.util.common.persistence.BasePK;
028import com.echothree.util.server.message.ExecutionErrorAccumulator;
029import com.echothree.util.server.persistence.Session;
030
031public class PicklistTimeLogic {
032
033    private PicklistTimeLogic() {
034        super();
035    }
036
037    private static class PicklistTimeLogicHolder {
038        static PicklistTimeLogic instance = new PicklistTimeLogic();
039    }
040
041    public static PicklistTimeLogic getInstance() {
042        return PicklistTimeLogicHolder.instance;
043    }
044
045    private String getPicklistTypeName(PicklistType picklistType) {
046        return picklistType.getLastDetail().getPicklistTypeName();
047    }
048
049    public void createOrUpdatePicklistTimeIfNotNull(final ExecutionErrorAccumulator ema, final Picklist picklist, final String picklistTimeTypeName, final Long time,
050            final BasePK partyPK) {
051        if(time != null) {
052            createOrUpdatePicklistTime(ema, picklist, picklistTimeTypeName, time, partyPK);
053        }
054    }
055
056    public void createOrUpdatePicklistTime(final ExecutionErrorAccumulator ema, final Picklist picklist, final String picklistTimeTypeName, final Long time,
057            final BasePK partyPK) {
058        var picklistControl = Session.getModelController(PicklistControl.class);
059        PicklistDetail picklistDetail = picklist.getLastDetail();
060        PicklistType picklistType = picklistDetail.getPicklistType();
061        PicklistTimeType picklistTimeType = picklistControl.getPicklistTimeTypeByName(picklistType, picklistTimeTypeName);
062
063        if(picklistTimeType == null) {
064            if(ema != null) {
065                ema.addExecutionError(ExecutionErrors.UnknownPicklistTimeTypeName.name(), getPicklistTypeName(picklistType), picklistTimeTypeName);
066            }
067        } else {
068            PicklistTimeValue picklistTimeValue = picklistControl.getPicklistTimeValueForUpdate(picklist, picklistTimeType);
069
070            if(picklistTimeValue == null) {
071                picklistControl.createPicklistTime(picklist, picklistTimeType, time, partyPK);
072            } else {
073                picklistTimeValue.setTime(time);
074                picklistControl.updatePicklistTimeFromValue(picklistTimeValue, partyPK);
075            }
076        }
077    }
078
079    public Long getPicklistTime(final ExecutionErrorAccumulator ema, final Picklist picklist, final String picklistTimeTypeName) {
080        var picklistControl = Session.getModelController(PicklistControl.class);
081        PicklistDetail picklistDetail = picklist.getLastDetail();
082        PicklistType picklistType = picklistDetail.getPicklistType();
083        PicklistTimeType picklistTimeType = picklistControl.getPicklistTimeTypeByName(picklistType, picklistTimeTypeName);
084        Long result = null;
085
086        if(picklistTimeType == null) {
087            if(ema != null) {
088                ema.addExecutionError(ExecutionErrors.UnknownPicklistTimeTypeName.name(), getPicklistTypeName(picklistType), picklistTimeTypeName);
089            }
090        } else {
091            PicklistTime picklistTime = picklistControl.getPicklistTimeForUpdate(picklist, picklistTimeType);
092
093            if(picklistTime == null) {
094                if(ema != null) {
095                    ema.addExecutionError(ExecutionErrors.UnknownPicklistTime.name(), getPicklistTypeName(picklistType), picklistDetail.getPicklistName(), picklistTimeTypeName);
096                }
097            } else {
098                result = picklistTime.getTime();
099            }
100        }
101
102        return result;
103    }
104
105    public void deletePicklistTime(final ExecutionErrorAccumulator ema, final Picklist picklist, final String picklistTimeTypeName, final BasePK deletedBy) {
106        var picklistControl = Session.getModelController(PicklistControl.class);
107        PicklistDetail picklistDetail = picklist.getLastDetail();
108        PicklistType picklistType = picklistDetail.getPicklistType();
109        PicklistTimeType picklistTimeType = picklistControl.getPicklistTimeTypeByName(picklistType, picklistTimeTypeName);
110
111        if(picklistTimeType == null) {
112            if(ema != null) {
113                ema.addExecutionError(ExecutionErrors.UnknownPicklistTimeTypeName.name(), getPicklistTypeName(picklistType), picklistTimeTypeName);
114            }
115        } else {
116            PicklistTime picklistTime = picklistControl.getPicklistTimeForUpdate(picklist, picklistTimeType);
117
118            if(picklistTime == null) {
119                if(ema != null) {
120                    ema.addExecutionError(ExecutionErrors.UnknownPicklistTime.name(), getPicklistTypeName(picklistType), picklistDetail.getPicklistName(), picklistTimeTypeName);
121                }
122            } else {
123                picklistControl.deletePicklistTime(picklistTime, deletedBy);
124            }
125        }
126    }
127
128}