/*
 * Copyright (c) 2011, 2021 Oracle and/or its affiliates. All rights reserved.
 *
 * This program and the accompanying materials are made available under the
 * terms of the Eclipse Public License v. 2.0 which is available at
 * http://www.eclipse.org/legal/epl-2.0,
 * or the Eclipse Distribution License v. 1.0 which is available at
 * http://www.eclipse.org/org/documents/edl-v10.php.
 *
 * SPDX-License-Identifier: EPL-2.0 OR BSD-3-Clause
 */

// Contributors:
//     dclarke, mnorman - Dynamic Persistence
//       http://wiki.eclipse.org/EclipseLink/Development/Dynamic
//       (https://bugs.eclipse.org/bugs/show_bug.cgi?id=200045)
//
package org.eclipse.persistence.internal.dynamic;

//EclipseLink imports
import org.eclipse.persistence.indirection.ValueHolder;
import org.eclipse.persistence.internal.dynamic.DynamicEntityImpl.PropertyWrapper;
import org.eclipse.persistence.internal.helper.ClassConstants;
import org.eclipse.persistence.internal.indirection.BasicIndirectionPolicy;
import org.eclipse.persistence.mappings.DatabaseMapping;
import org.eclipse.persistence.mappings.ForeignReferenceMapping;

public class DynamicPropertiesInitializatonPolicy {

    /**
     * Default constructor.
     */
    public DynamicPropertiesInitializatonPolicy() {
    }

    /**
     * After entity is created, initialize all required attributes.
     */
    public void initializeProperties(DynamicTypeImpl type, DynamicEntityImpl entity) {
        if (type != null) {
            for (DatabaseMapping mapping : type.getMappingsRequiringInitialization()) {
                initializeDefaultValue(mapping, entity);
            }
        }
    }

    /**
     * Initialize the default value handling primitives, collections and
     * indirection.
     *
     */
    private void initializeDefaultValue(DatabaseMapping mapping, DynamicEntityImpl entity) {
        Object value = null;
        if (mapping.isDirectToFieldMapping() && mapping.getAttributeClassification().isPrimitive()) {
            Class<?> primClass = mapping.getAttributeClassification();
            if (primClass == ClassConstants.PBOOLEAN) {
                value = false;
            }
            else if (primClass == ClassConstants.PINT) {
                value = 0;
            }
            else if (primClass == ClassConstants.PLONG) {
                value = 0L;
            }
            else if (primClass == ClassConstants.PCHAR) {
                value = Character.MIN_VALUE;
            }
            else if (primClass == ClassConstants.PDOUBLE) {
                value = 0.0d;
            }
            else if (primClass == ClassConstants.PFLOAT) {
                value = 0.0f;
            }
            else if (primClass == ClassConstants.PSHORT) {
                value = Short.MIN_VALUE;
            }
            else if (primClass == ClassConstants.PBYTE) {
                value = Byte.MIN_VALUE;
            }
        }
        else if (mapping.isForeignReferenceMapping()) {
            ForeignReferenceMapping refMapping = (ForeignReferenceMapping)mapping;
            if (refMapping.usesIndirection() &&
                refMapping.getIndirectionPolicy() instanceof BasicIndirectionPolicy) {
                value = new ValueHolder<>(value);
            }
            else if (refMapping.isCollectionMapping()) {
                value = refMapping.getContainerPolicy().containerInstance();
            }
        }
        else if (mapping.isAggregateObjectMapping()) {
            value = mapping.getReferenceDescriptor().getObjectBuilder().buildNewInstance();
        }
        PropertyWrapper propertyWrapper = entity.getPropertiesMap().get(mapping.getAttributeName());
        // NB - only the value is set, not the 'isSet' boolean
        propertyWrapper.setValue(value);
    }
}
