/**
 * Licensed to the Apache Software Foundation (ASF) under one
 * or more contributor license agreements.  See the NOTICE file
 * distributed with this work for additional information
 * regarding copyright ownership.  The ASF licenses this file
 * to you under the Apache License, Version 2.0 (the
 * "License"); you may not use this file except in compliance
 * with the License.  You may obtain a copy of the License at
 *
 *     http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */
package org.apache.atlas.repository.store.graph.v1;


import org.apache.atlas.model.instance.EntityMutations.EntityOperation;
import org.apache.atlas.model.typedef.AtlasStructDef;
import org.apache.atlas.model.typedef.AtlasStructDef.AtlasAttributeDef;
import org.apache.atlas.repository.graphdb.AtlasEdge;
import org.apache.atlas.repository.graphdb.AtlasVertex;
import org.apache.atlas.type.AtlasStructType;
import org.apache.atlas.type.AtlasStructType.AtlasAttribute;
import org.apache.atlas.type.AtlasType;


import java.util.Objects;

public class AttributeMutationContext {
    private EntityOperation op;
    /**
     * Atlas Attribute
     */

    private AtlasAttribute attribute;

    /**
     * Overriding type for which elements are being mapped
     */
    private AtlasType currentElementType;

    /**
     * Current attribute value/entity/Struct instance
     */
    private Object value;

    private String vertexProperty;

    /**
     *
     * The vertex which corresponds to the entity/struct for which we are mapping a complex attributes like struct, traits
     */
    AtlasVertex referringVertex;

    /**
     * The current edge(in case of updates) from the parent entity/struct to the complex attribute like struct, trait
     */
    AtlasEdge existingEdge;

    public AttributeMutationContext(EntityOperation op, AtlasVertex referringVertex, AtlasAttribute attribute, Object value) {
        this(op, referringVertex, attribute, value, attribute.getVertexPropertyName(), null, null);
    }

    public AttributeMutationContext(EntityOperation op, AtlasVertex referringVertex, AtlasAttribute attribute, Object value,
                                    String vertexProperty, AtlasType currentElementType, AtlasEdge currentEdge) {
        this.op                 = op;
        this.referringVertex    = referringVertex;
        this.attribute          = attribute;
        this.value              = value;
        this.vertexProperty     = vertexProperty;
        this.currentElementType = currentElementType;
        this.existingEdge       = currentEdge;
    }

    @Override
    public int hashCode() {
        return Objects.hash(op, referringVertex, attribute, value, vertexProperty, currentElementType, existingEdge);
    }

    @Override
    public boolean equals(Object obj) {
        if (obj == null) {
            return false;
        } else if (obj == this) {
            return true;
        } else if (obj.getClass() != getClass()) {
            return false;
        } else {
            AttributeMutationContext rhs = (AttributeMutationContext) obj;
            return Objects.equals(op, rhs.op)
                    && Objects.equals(referringVertex, rhs.referringVertex)
                    && Objects.equals(attribute, rhs.attribute)
                    && Objects.equals(value, rhs.value)
                    && Objects.equals(vertexProperty, rhs.vertexProperty)
                    && Objects.equals(currentElementType, rhs.currentElementType)
                    && Objects.equals(existingEdge, rhs.existingEdge);
        }
    }


    public AtlasStructType getParentType() {
        return attribute.getDefinedInType();
    }

    public AtlasStructDef getStructDef() {
        return attribute.getDefinedInDef();
    }

    public AtlasAttributeDef getAttributeDef() {
        return attribute.getAttributeDef();
    }

    public AtlasType getAttrType() {
        return currentElementType == null ? attribute.getAttributeType() : currentElementType;
    }

    public AtlasType getCurrentElementType() {
        return currentElementType;
    }

    public Object getValue() {
        return value;
    }

    public String getVertexProperty() { return vertexProperty; }

    public AtlasVertex getReferringVertex() { return referringVertex; }

    public AtlasEdge getCurrentEdge() {
        return existingEdge;
    }

    public void setElementType(final AtlasType attrType) {
        this.currentElementType = attrType;
    }

    public AtlasAttribute getAttribute() {
        return attribute;
    }

    public EntityOperation getOp() {
        return op;
    }

    public void setExistingEdge(AtlasEdge existingEdge) { this.existingEdge = existingEdge; }
}
