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.core.server.logic;
018
019import com.echothree.control.user.core.common.spec.EntityAttributeGroupUniversalSpec;
020import com.echothree.model.control.core.common.ComponentVendors;
021import com.echothree.model.control.core.common.EntityTypes;
022import com.echothree.model.control.core.common.exception.DuplicateEntityAttributeGroupNameException;
023import com.echothree.model.control.core.common.exception.InvalidParameterCountException;
024import com.echothree.model.control.core.common.exception.UnknownEntityAttributeGroupNameException;
025import com.echothree.model.control.core.server.control.EntityAttributeGroupControl;
026import com.echothree.model.control.sequence.common.SequenceTypes;
027import com.echothree.model.control.sequence.server.control.SequenceControl;
028import com.echothree.model.control.sequence.server.logic.SequenceGeneratorLogic;
029import com.echothree.model.data.core.server.entity.EntityAttributeGroup;
030import com.echothree.model.data.core.server.entity.EntityType;
031import com.echothree.model.data.party.server.entity.Language;
032import com.echothree.util.common.message.ExecutionErrors;
033import com.echothree.util.common.persistence.BasePK;
034import com.echothree.util.server.control.BaseLogic;
035import com.echothree.util.server.message.ExecutionErrorAccumulator;
036import com.echothree.util.server.persistence.EntityPermission;
037import javax.enterprise.context.ApplicationScoped;
038import javax.inject.Inject;
039
040@ApplicationScoped
041public class EntityAttributeGroupLogic
042        extends BaseLogic {
043
044    @Inject
045    protected EntityAttributeGroupControl entityAttributeGroupControl;
046
047    @Inject
048    protected SequenceControl sequenceControl;
049
050    @Inject
051    protected EntityInstanceLogic entityInstanceLogic;
052
053    @Inject
054    protected EntityTypeLogic entityTypeLogic;
055
056    @Inject
057    protected SequenceGeneratorLogic sequenceGeneratorLogic;
058
059    protected EntityAttributeGroupLogic() {
060        super();
061    }
062    
063    public EntityAttributeGroup createEntityAttributeGroup(final ExecutionErrorAccumulator eea, final EntityType entityType, String entityAttributeGroupName,
064            final Boolean isDefault, final Integer sortOrder, final String description, final Language language, final BasePK createdBy) {
065        if(entityAttributeGroupName == null) {
066            var sequence = sequenceControl.getDefaultSequenceUsingNames(SequenceTypes.ENTITY_ATTRIBUTE_GROUP.name());
067            
068            entityAttributeGroupName = sequenceGeneratorLogic.getNextSequenceValue(sequence);
069        }
070
071        var entityAttributeGroup = entityAttributeGroupControl.getEntityAttributeGroupByName(entityType, entityAttributeGroupName);
072        
073        if(entityAttributeGroup == null) {
074            entityAttributeGroup = entityAttributeGroupControl.createEntityAttributeGroup(entityType, entityAttributeGroupName, isDefault, sortOrder, createdBy);
075
076            if(description != null) {
077                entityAttributeGroupControl.createEntityAttributeGroupDescription(entityAttributeGroup, language, description, createdBy);
078            }
079        } else {
080            handleExecutionError(DuplicateEntityAttributeGroupNameException.class, eea, ExecutionErrors.DuplicateEntityAttributeGroupName.name(),
081                    entityType.getLastDetail().getComponentVendor().getLastDetail().getComponentVendorName(),
082                    entityType.getLastDetail().getEntityTypeName(), entityAttributeGroupName);
083        }
084
085        return entityAttributeGroup;
086    }
087
088    public EntityAttributeGroup getEntityAttributeGroupByName(final ExecutionErrorAccumulator eea, final EntityType entityType, final String entityAttributeGroupName,
089            final EntityPermission entityPermission) {
090        var entityAttributeGroup = entityAttributeGroupControl.getEntityAttributeGroupByName(entityType, entityAttributeGroupName, entityPermission);
091
092        if(entityAttributeGroup == null) {
093            handleExecutionError(UnknownEntityAttributeGroupNameException.class, eea, ExecutionErrors.UnknownEntityAttributeGroupName.name(),
094                    entityType.getLastDetail().getComponentVendor().getLastDetail().getComponentVendorName(),
095                    entityType.getLastDetail().getEntityTypeName(), entityAttributeGroupName);
096        }
097
098        return entityAttributeGroup;
099    }
100
101    public EntityAttributeGroup getEntityAttributeGroupByName(final ExecutionErrorAccumulator eea, final EntityType entityType, final String entityAttributeGroupName) {
102        return getEntityAttributeGroupByName(eea, entityType, entityAttributeGroupName, EntityPermission.READ_ONLY);
103    }
104
105    public EntityAttributeGroup getEntityAttributeGroupByNameForUpdate(final ExecutionErrorAccumulator eea, final EntityType entityType, final String entityAttributeGroupName) {
106        return getEntityAttributeGroupByName(eea, entityType, entityAttributeGroupName, EntityPermission.READ_WRITE);
107    }
108
109    public EntityAttributeGroup getEntityAttributeGroupByName(final ExecutionErrorAccumulator eea,
110            final String componentVendorName, final String entityTypeName, final String entityAttributeGroupName,
111            final EntityPermission entityPermission) {
112        var entityType = entityTypeLogic.getEntityTypeByName(eea, componentVendorName, entityTypeName);
113
114        return hasExecutionErrors(eea) ? null : getEntityAttributeGroupByName(eea, entityType, entityAttributeGroupName, entityPermission);
115    }
116
117    public EntityAttributeGroup getEntityAttributeGroupByName(final ExecutionErrorAccumulator eea,
118            final String componentVendorName, final String entityTypeName, final String entityAttributeGroupName) {
119        return getEntityAttributeGroupByName(eea, componentVendorName, entityTypeName, entityAttributeGroupName, EntityPermission.READ_ONLY);
120    }
121
122    public EntityAttributeGroup getEntityAttributeGroupByUniversalSpec(final ExecutionErrorAccumulator eea,
123            final EntityAttributeGroupUniversalSpec universalSpec, final EntityPermission entityPermission) {
124        EntityAttributeGroup entityAttributeGroup = null;
125        var entityAttributeGroupName = universalSpec.getEntityAttributeGroupName();
126        var componentVendorName = universalSpec.getComponentVendorName();
127        var entityTypeName = universalSpec.getEntityTypeName();
128        var nameCount = (componentVendorName == null ? 0 : 1) + (entityTypeName == null ? 0 : 1)
129                + (entityAttributeGroupName == null ? 0 : 1);
130        if(nameCount != 0 && nameCount != 3) {
131            handleExecutionError(InvalidParameterCountException.class, eea, ExecutionErrors.InvalidParameterCount.name());
132            return null;
133        }
134        var parameterCount = (nameCount == 3 ? 1 : 0) + entityInstanceLogic.countPossibleEntitySpecs(universalSpec);
135
136        switch(parameterCount) {
137            case 1 -> {
138                if(entityAttributeGroupName == null) {
139                    var entityInstance = entityInstanceLogic.getEntityInstance(eea, universalSpec,
140                            ComponentVendors.ECHO_THREE.name(), EntityTypes.EntityAttributeGroup.name());
141
142                    if(eea == null || !eea.hasExecutionErrors()) {
143                        entityAttributeGroup = entityAttributeGroupControl.getEntityAttributeGroupByEntityInstance(entityInstance, entityPermission);
144                    }
145                } else {
146                    entityAttributeGroup = getEntityAttributeGroupByName(eea, componentVendorName, entityTypeName, entityAttributeGroupName, entityPermission);
147                }
148            }
149            default ->
150                    handleExecutionError(InvalidParameterCountException.class, eea, ExecutionErrors.InvalidParameterCount.name());
151        }
152
153        return entityAttributeGroup;
154    }
155
156    public EntityAttributeGroup getEntityAttributeGroupByUniversalSpec(final ExecutionErrorAccumulator eea,
157            final EntityAttributeGroupUniversalSpec universalSpec) {
158        return getEntityAttributeGroupByUniversalSpec(eea, universalSpec, EntityPermission.READ_ONLY);
159    }
160
161    public EntityAttributeGroup getEntityAttributeGroupByUniversalSpecForUpdate(final ExecutionErrorAccumulator eea,
162            final EntityAttributeGroupUniversalSpec universalSpec) {
163        return getEntityAttributeGroupByUniversalSpec(eea, universalSpec, EntityPermission.READ_WRITE);
164    }
165
166}