/* SPDX-License-Identifier: Apache-2.0 */

// This is a generated file - do not edit - changes should be made to the templates amd/or generator to generate this file with changes.

package org.odpi.openmetadata.accessservices.subjectarea.generated.<$$package$$>;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import java.util.*;

import org.odpi.openmetadata.accessservices.subjectarea.properties.classifications.Task;

// omrs
import org.odpi.openmetadata.repositoryservices.connectors.stores.metadatacollectionstore.properties.instances.*;
import org.odpi.openmetadata.repositoryservices.connectors.stores.metadatacollectionstore.properties.typedefs.*;
import org.odpi.openmetadata.repositoryservices.archivemanager.OMRSArchiveAccessor;

// omrs bean
import org.odpi.openmetadata.accessservices.subjectarea.properties.enums.*;
import org.odpi.openmetadata.accessservices.subjectarea.server.properties.classifications.ClassificationFactory;
import org.odpi.openmetadata.repositoryservices.connectors.stores.metadatacollectionstore.properties.instances.Classification;
import org.odpi.openmetadata.accessservices.subjectarea.ffdc.exceptions.InvalidParameterException;
import org.odpi.openmetadata.accessservices.subjectarea.properties.enums.Status;
import org.odpi.openmetadata.accessservices.subjectarea.properties.objects.common.SystemAttributes;
import org.odpi.openmetadata.accessservices.subjectarea.utilities.SubjectAreaUtils;

/**
 * Static mapping methods to map between <$$uClassificationName$$> and the omrs equivalents.
 */
public class <$$uClassificationName$$>Mapper {
    private static final Logger log = LoggerFactory.getLogger( <$$uClassificationName$$>Mapper.class);
    private static final String className = <$$uClassificationName$$>Mapper.class.getName();
   /**
    * @param omrsClassification - the supplied omrs classification
    * @return equivalent <$$uClassificationName$$>
    */
   static public org.odpi.openmetadata.accessservices.subjectarea.properties.classifications.<$$uClassificationName$$> mapOmrsToOmas(Classification omrsClassification) throws InvalidParameterException{
        String classificationTypeName = omrsClassification.getName();
        if ("<$$uClassificationName$$>".equals(classificationTypeName)) {
                org.odpi.openmetadata.accessservices.subjectarea.properties.classifications.<$$uClassificationName$$> <$$ClassificationName$$> = new org.odpi.openmetadata.accessservices.subjectarea.properties.classifications.<$$uClassificationName$$>();
                //set core attributes
                SystemAttributes systemAttributes = new SystemAttributes();

                InstanceStatus instanceStatus =  omrsClassification.getStatus();
                Status omrsBeanStatus = SubjectAreaUtils.convertInstanceStatusToStatus(instanceStatus);
                systemAttributes.setStatus(omrsBeanStatus);

                systemAttributes.setCreatedBy(omrsClassification.getCreatedBy());
                systemAttributes.setUpdatedBy(omrsClassification.getUpdatedBy());
                systemAttributes.setCreateTime(omrsClassification.getCreateTime());
                systemAttributes.setUpdateTime(omrsClassification.getUpdateTime());
                systemAttributes.setVersion(omrsClassification.getVersion());
                <$$ClassificationName$$>.setSystemAttributes(systemAttributes);


                // Set properties
                InstanceProperties omrsClassificationProperties = omrsClassification.getProperties();
                Iterator omrsPropertyIterator = omrsClassificationProperties.getPropertyNames();
                while (omrsPropertyIterator.hasNext()) {
                    String name = (String) omrsPropertyIterator.next();
                    //TODO check if this is a property we expect or whether the type has been added to.
                    // this is a property we expect
                    InstancePropertyValue value = omrsClassificationProperties.getPropertyValue(name);

                    // supplied guid matches the expected type

                    Object actualValue;
                    switch (value.getInstancePropertyCategory()) {
                        case PRIMITIVE:
                            PrimitivePropertyValue primitivePropertyValue = (PrimitivePropertyValue) value;
                            actualValue = primitivePropertyValue.getPrimitiveValue();
                            if (<$$ClassificationName$$>.ATTRIBUTE_NAMES_SET.contains(name)) {
                               <$$Attr$$
                               if (name.equals("<$$AttrName$$>")) {
                                  <$$ClassificationName$$>.set<$$uAttrName$$>((<$$AttrType$$>)actualValue);
                               }
                               $$Attr$$>

                            } else {
                                // put out the omrs value object
                                if (null==<$$ClassificationName$$>.getExtraAttributes())  {
                                     <$$ClassificationName$$>.setExtraAttributes(new HashMap<String, Object>());
                                }
                               <$$ClassificationName$$>.getExtraAttributes().put(name, primitivePropertyValue);
                            }
                            break;
                        case ENUM:
                            EnumPropertyValue enumPropertyValue = (EnumPropertyValue) value;
                            String symbolicName = enumPropertyValue.getSymbolicName();
                            if (<$$ClassificationName$$>.ENUM_NAMES_SET.contains(name)) {
                                <$$Enum$$
                                 if (name.equals("<$$EnumName$$>")) {
                                       org.odpi.openmetadata.accessservices.subjectarea.properties.enums.<$$uEnumType$$> <$$EnumName$$> = org.odpi.openmetadata.accessservices.subjectarea.properties.enums.<$$uEnumType$$>.valueOf(symbolicName);
                                      <$$ClassificationName$$>.set<$$uEnumName$$>(<$$EnumName$$>);
                                 }
                                $$Enum$$>

                            } else {
                                // put out the omrs value object
                                if (null==<$$ClassificationName$$>.getExtraAttributes())  {
                                     <$$ClassificationName$$>.setExtraAttributes(new HashMap<String, Object>());
                                }
                                 <$$ClassificationName$$>.getExtraAttributes().put(name, enumPropertyValue);
                             }

                            break;
                        case MAP:
                            if (<$$ClassificationName$$>.MAP_NAMES_SET.contains(name)) {
                                 MapPropertyValue mapPropertyValue = (MapPropertyValue) value;
                                 InstanceProperties instancePropertyForMap = (InstanceProperties) mapPropertyValue.getMapValues();

                                 <$$Map$$
                                 if (name.equals("<$$MapName$$>")) {

                                       // Only support Map<String,String> as that is what is in the archive types at this time.
                                       Map<String, String> actualMap = new HashMap();
                                       Iterator iter = instancePropertyForMap.getPropertyNames();
                                       while (iter.hasNext()) {
                                           String mapkey = (String) iter.next();
                                           PrimitivePropertyValue primitivePropertyMapValue = (PrimitivePropertyValue) instancePropertyForMap.getPropertyValue(mapkey);
                                           String mapvalue = (String) primitivePropertyMapValue.getPrimitiveValue();
                                           actualMap.put(mapkey, mapvalue);
                                       }
                                       <$$ClassificationName$$>.set<$$uMapName$$>(actualMap);
                                 }
                                 $$Map$$>

                               }
                               break;
                        case ARRAY:
                        case STRUCT:
                        case UNKNOWN:
                            // error
                            break;
                    }

                }   // end while

                 return <$$ClassificationName$$>;
            } else {
                // TODO wrong type
            }
            return null;
    }
    /**
     * Map (convert) the supplied <$$uClassificationName$$> to an classificationDetail.
     * @param  <$$ClassificationName$$>  supplied <$$uClassificationName$$>
     * @return  classificationDetail equivalent to <$$ClassificationName$$>
     */
    static public Classification mapBeanToOmrs(org.odpi.openmetadata.accessservices.subjectarea.properties.classifications.<$$uClassificationName$$> <$$ClassificationName$$>) {
            Classification omrsClassification = new Classification();
            SystemAttributes systemAttributes = <$$ClassificationName$$>.getSystemAttributes();
            if (systemAttributes!=null) {
                   if (systemAttributes.getCreatedBy()!=null)
                        omrsClassification.setCreatedBy(systemAttributes.getCreatedBy());
                   if (systemAttributes.getUpdatedBy()!=null)
                        omrsClassification.setUpdatedBy(systemAttributes.getUpdatedBy());
                   if (systemAttributes.getCreateTime()!=null)
                        omrsClassification.setCreateTime(systemAttributes.getCreateTime());
                   if (systemAttributes.getUpdateTime()!=null)
                        omrsClassification.setUpdateTime(systemAttributes.getUpdateTime());
                   if (systemAttributes.getVersion()!=null)
                        omrsClassification.setVersion(systemAttributes.getVersion());
                   if (systemAttributes.getStatus()!=null) {
                        InstanceStatus instanceStatus = SubjectAreaUtils.convertStatusToStatusInstance(systemAttributes.getStatus());
                        omrsClassification.setStatus(instanceStatus);
                   }
            }

            InstanceProperties instanceProperties = new InstanceProperties();
            // primitives

            <$$Attr$$
            if (<$$ClassificationName$$>.get<$$uAttrName$$>()!=null) {
                PrimitivePropertyValue primitivePropertyValue = new PrimitivePropertyValue();
                primitivePropertyValue.setPrimitiveDefCategory(PrimitiveDefCategory.OM_PRIMITIVE_TYPE_<$$uAttrType$$>);
                primitivePropertyValue.setPrimitiveValue(<$$ClassificationName$$>.get<$$uAttrName$$>());
                instanceProperties.setProperty("<$$AttrName$$>", primitivePropertyValue);
            }
            $$Attr$$>

            <$$Enum$$
            if (<$$ClassificationName$$>.get<$$uEnumName$$>()!=null) {
                <$$uEnumType$$> enumType = <$$ClassificationName$$>.get<$$uEnumName$$>();
                EnumPropertyValue enumPropertyValue = new EnumPropertyValue();
                enumPropertyValue.setOrdinal(enumType.ordinal());
                enumPropertyValue.setSymbolicName(enumType.name());
                instanceProperties.setProperty("<$$EnumName$$>", enumPropertyValue);
            }
            $$Enum$$>

            <$$Map$$
            if (<$$ClassificationName$$>.get<$$uMapName$$>()!=null) {

                Map<String,String> map =<$$ClassificationName$$>.get<$$uMapName$$>();
                MapPropertyValue mapPropertyValue = new MapPropertyValue();

                for (String key:map.keySet()) {
                   PrimitivePropertyValue primitivePropertyValue = new PrimitivePropertyValue();
                   primitivePropertyValue.setPrimitiveDefCategory(PrimitiveDefCategory.OM_PRIMITIVE_TYPE_STRING);
                   primitivePropertyValue.setPrimitiveValue(map.get(key));
                   mapPropertyValue.setMapValue(key,primitivePropertyValue);
                }

                instanceProperties.setProperty("<$$MapName$$>", mapPropertyValue);
            }
            $$Map$$>

            omrsClassification.setProperties(instanceProperties);
            // set the type in the classification
            OMRSArchiveAccessor archiveAccessor = OMRSArchiveAccessor.getInstance();
            TypeDef typeDef = archiveAccessor.getEntityDefByName("<$$uClassificationName$$>");
            InstanceType template = SubjectAreaUtils.createTemplateFromTypeDef(typeDef);
            InstanceType instanceType = new InstanceType(template);
            omrsClassification.setType(instanceType);
            return omrsClassification;
    }

}
