/*
 * 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.ignite.internal.processors.cache;

import javax.cache.processor.EntryProcessor;
import org.apache.ignite.internal.processors.cache.version.GridCacheVersion;
import org.apache.ignite.internal.processors.cache.version.GridCacheVersionConflictContext;
import org.apache.ignite.internal.util.tostring.GridToStringInclude;
import org.apache.ignite.internal.util.typedef.internal.S;
import org.apache.ignite.lang.IgniteBiTuple;
import org.jetbrains.annotations.Nullable;

/**
 * Cache entry atomic update result.
 */
public class GridCacheUpdateAtomicResult {
    /** Update operation outcome. */
    private final UpdateOutcome outcome;

    /** Old value. */
    @GridToStringInclude
    private final CacheObject oldVal;

    /** New value. */
    @GridToStringInclude
    private final CacheObject newVal;

    /** New TTL. */
    private final long newTtl;

    /** Explicit DR expire time (if any). */
    private final long conflictExpireTime;

    /** Version for deferred delete. */
    @GridToStringInclude
    private final GridCacheVersion rmvVer;

    /** DR resolution result. */
    @GridToStringInclude
    private final GridCacheVersionConflictContext<?, ?> conflictRes;

    /** */
    private final long updateCntr;

    /** Flag indicating whether value is transformed. */
    private boolean transformed;

    /** Value computed by entry processor. */
    private IgniteBiTuple<Object, Exception> res;

    /**
     * Constructor.
     *
     * @param outcome Update outcome.
     * @param oldVal Old value.
     * @param newVal New value.
     * @param res Value computed by the {@link EntryProcessor}.
     * @param newTtl New TTL.
     * @param conflictExpireTime Explicit DR expire time (if any).
     * @param rmvVer Version for deferred delete.
     * @param conflictRes DR resolution result.
     * @param updateCntr Partition update counter.
     * @param transformed {@code True} if result was transformed.
     */
    GridCacheUpdateAtomicResult(UpdateOutcome outcome,
        @Nullable CacheObject oldVal,
        @Nullable CacheObject newVal,
        @Nullable IgniteBiTuple<Object, Exception> res,
        long newTtl,
        long conflictExpireTime,
        @Nullable GridCacheVersion rmvVer,
        @Nullable GridCacheVersionConflictContext<?, ?> conflictRes,
        long updateCntr,
        boolean transformed) {
        assert outcome != null;

        this.outcome = outcome;
        this.oldVal = oldVal;
        this.newVal = newVal;
        this.res = res;
        this.newTtl = newTtl;
        this.conflictExpireTime = conflictExpireTime;
        this.rmvVer = rmvVer;
        this.conflictRes = conflictRes;
        this.updateCntr = updateCntr;
        this.transformed = transformed;
    }

    /**
     * @return Update operation outcome.
     */
    UpdateOutcome outcome() {
        return outcome;
    }

    /**
     * @return Value computed by the {@link EntryProcessor}.
     */
    @Nullable public IgniteBiTuple<Object, Exception> computedResult() {
        return res;
    }

    /**
     * @return Success flag.
     */
    public boolean success() {
        return outcome.success();
    }

    /**
     * @return Old value.
     */
    @Nullable public CacheObject oldValue() {
        return oldVal;
    }

    /**
     * @return New value.
     */
    @Nullable public CacheObject newValue() {
        return newVal;
    }

    /**
     * @return {@link GridCacheUtils#TTL_NOT_CHANGED} if TTL did not change, otherwise new TTL.
     */
    public long newTtl() {
        return newTtl;
    }

    /**
     * @return Partition update index.
     */
    public long updateCounter() {
        return updateCntr;
    }

    /**
     * @return Explicit conflict expire time (if any). Set only if it is necessary to propagate concrete expire time
     * value to DHT node. Otherwise set to {@link GridCacheUtils#EXPIRE_TIME_CALCULATE}.
     */
    public long conflictExpireTime() {
        return conflictExpireTime;
    }

    /**
     * @return Version for deferred delete.
     */
    @Nullable public GridCacheVersion removeVersion() {
        return rmvVer;
    }

    /**
     * @return DR conflict resolution context.
     */
    @Nullable public GridCacheVersionConflictContext<?, ?> conflictResolveResult() {
        return conflictRes;
    }

    /**
     * @return Whether update should be propagated to DHT node.
     */
    public boolean sendToDht() {
        return outcome.sendToDht();
    }

    /**
     *
     */
    public enum UpdateOutcome {
        /** */
        CONFLICT_USE_OLD(false, false, false),

        /** */
        VERSION_CHECK_FAILED(false, false, false),

        /** */
        FILTER_FAILED(false, false, true),

        /** */
        INVOKE_NO_OP(false, false, true),

        /** */
        INTERCEPTOR_CANCEL(false, false, true),

        /** */
        REMOVE_NO_VAL(false, true, true),

        /** */
        SUCCESS(true, true, true);

        /** */
        private final boolean success;

        /** */
        private final boolean sndToDht;

        /** */
        private final boolean updateReadMetrics;

        /**
         * @param success Success flag.
         * @param sndToDht Whether update should be propagated to DHT node.
         * @param updateReadMetrics Metrics update flag.
         */
        UpdateOutcome(boolean success, boolean sndToDht, boolean updateReadMetrics) {
            this.success = success;
            this.sndToDht = sndToDht;
            this.updateReadMetrics = updateReadMetrics;
        }

        /**
         * @return Success flag.
         */
        public boolean success() {
            return success;
        }

        /**
         * @return Whether update should be propagated to DHT node.
         */
        public boolean sendToDht() {
            return sndToDht;
        }

        /**
         * @return Metrics update flag.
         */
        public boolean updateReadMetrics() {
            return updateReadMetrics;
        }
    }

    /**
     * @return {@code True} if transformed.
     */
    public boolean transformed() {
        return transformed;
    }

    /** {@inheritDoc} */
    @Override public String toString() {
        return S.toString(GridCacheUpdateAtomicResult.class, this);
    }
}