/**
 * 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
 * <p>
 * http://www.apache.org/licenses/LICENSE-2.0
 * <p>
 * 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.listener;

import org.apache.atlas.exception.AtlasBaseException;
import org.apache.atlas.model.glossary.AtlasGlossaryTerm;
import org.apache.atlas.model.instance.AtlasClassification;
import org.apache.atlas.model.instance.AtlasEntity;
import org.apache.atlas.model.instance.AtlasRelatedObjectId;
import org.apache.atlas.model.instance.AtlasRelationship;

import java.util.List;
import java.util.Set;

/**
 * Entity change notification listener V2.
 */
public interface EntityChangeListenerV2 {
    /**
     * This is upon adding new entities to the repository.
     *
     * @param entities the created entities
     * @param isImport
     */
    void onEntitiesAdded(List<AtlasEntity> entities, boolean isImport) throws AtlasBaseException;

    /**
     * This is upon updating an entity.
     *
     * @param entities the updated entities
     * @param isImport
     */
    void onEntitiesUpdated(List<AtlasEntity> entities, boolean isImport) throws AtlasBaseException;

    /**
     * This is upon deleting entities from the repository.
     *
     * @param entities the deleted entities
     * @param isImport
     */
    void onEntitiesDeleted(List<AtlasEntity> entities, boolean isImport) throws AtlasBaseException;


    /**
     * This is upon purging entities from the repository.
     *
     * @param entities the purged entities
     */
    void onEntitiesPurged(List<AtlasEntity> entities) throws AtlasBaseException;

    /**
     * This is upon adding new classifications to an entity.
     *
     * @param entity          the entity
     * @param classifications classifications that needs to be added to an entity
     * @throws AtlasBaseException if the listener notification fails
     */
    void onClassificationsAdded(AtlasEntity entity, List<AtlasClassification> classifications) throws AtlasBaseException;

    /**
     * This is upon updating classifications to an entity.
     *
     * @param entity          the entity
     * @param classifications classifications that needs to be updated for an entity
     * @throws AtlasBaseException if the listener notification fails
     */
    void onClassificationsUpdated(AtlasEntity entity, List<AtlasClassification> classifications) throws AtlasBaseException;

    /**
     * This is upon deleting classifications from an entity.
     *
     * @param entity              the entity
     * @param classifications classifications that needs to be updated for an entity
     * @throws AtlasBaseException if the listener notification fails
     */
    void onClassificationsDeleted(AtlasEntity entity, List<AtlasClassification> classifications) throws AtlasBaseException;

    /**
     * This is upon adding a new term to an entity.
     *
     * @param term     the term
     * @param entities list of entities to which the term is assigned
     */
    void onTermAdded(AtlasGlossaryTerm term, List<AtlasRelatedObjectId> entities) throws AtlasBaseException;

    /**
     * This is upon removing a term from an entity.
     *
     * @param term     the term
     * @param entities list of entities to which the term is assigned
     */
    void onTermDeleted(AtlasGlossaryTerm term, List<AtlasRelatedObjectId> entities) throws AtlasBaseException;

    /**
     * This is upon adding new relationships to the repository.
     *
     * @param relationships the created relationships
     * @param isImport
     */
    void onRelationshipsAdded(List<AtlasRelationship> relationships, boolean isImport) throws AtlasBaseException;

    /**
     * This is upon updating an relationships.
     *
     * @param relationships the updated relationships
     * @param isImport
     */
    void onRelationshipsUpdated(List<AtlasRelationship> relationships, boolean isImport) throws AtlasBaseException;

    /**
     * This is upon deleting relationships from the repository.
     *
     * @param relationships the deleted relationships
     * @param isImport
     */
    void onRelationshipsDeleted(List<AtlasRelationship> relationships, boolean isImport) throws AtlasBaseException;

    /**
     * This is upon purging relationships from the repository.
     *
     * @param relationships the purged relationships
     */
    void onRelationshipsPurged(List<AtlasRelationship> relationships) throws AtlasBaseException;

    /**
     * This is upon add new labels to an entity.
     *
     * @param entity the entity
     * @param labels labels that needs to be added to an entity
     * @throws AtlasBaseException if the listener notification fails
     */
    void onLabelsAdded(AtlasEntity entity, Set<String> labels) throws AtlasBaseException;

    /**
     * This is upon deleting labels from an entity.
     *
     * @param entity the entity
     * @param labels labels that needs to be deleted for an entity
     * @throws AtlasBaseException if the listener notification fails
     */
    void onLabelsDeleted(AtlasEntity entity, Set<String> labels) throws AtlasBaseException;
}