/*
 * 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.commons.jcs3.jcache;

import java.util.concurrent.atomic.AtomicLong;

public class Statistics
{
    private volatile boolean active = true;

    private final AtomicLong removals = new AtomicLong();
    private final AtomicLong expiries = new AtomicLong();
    private final AtomicLong puts = new AtomicLong();
    private final AtomicLong hits = new AtomicLong();
    private final AtomicLong misses = new AtomicLong();
    private final AtomicLong evictions = new AtomicLong();
    private final AtomicLong putTimeTaken = new AtomicLong();
    private final AtomicLong getTimeTaken = new AtomicLong();
    private final AtomicLong removeTimeTaken = new AtomicLong();

    public long getHits()
    {
        return hits.get();
    }

    public long getMisses()
    {
        return misses.get();
    }

    public long getPuts()
    {
        return puts.get();
    }

    public long getRemovals()
    {
        return removals.get();
    }

    public long getEvictions()
    {
        return evictions.get();
    }

    public long getTimeTakenForGets()
    {
        return getTimeTaken.get();
    }

    public long getTimeTakenForPuts()
    {
        return putTimeTaken.get();
    }

    public long getTimeTakenForRemovals()
    {
        return removeTimeTaken.get();
    }

    public void increaseRemovals(final long number)
    {
        increment(removals, number);
    }

    public void increaseExpiries(final long number)
    {
        increment(expiries, number);
    }

    public void increasePuts(final long number)
    {
        increment(puts, number);
    }

    public void increaseHits(final long number)
    {
        increment(hits, number);
    }

    public void increaseMisses(final long number)
    {
        increment(misses, number);
    }

    public void increaseEvictions(final long number)
    {
        increment(evictions, number);
    }

    public void addGetTime(final long duration)
    {
        increment(duration, getTimeTaken);
    }

    public void addPutTime(final long duration)
    {
        increment(duration, putTimeTaken);
    }

    public void addRemoveTime(final long duration)
    {
        increment(duration, removeTimeTaken);
    }

    private void increment(final AtomicLong counter, final long number)
    {
        if (!active)
        {
            return;
        }
        counter.addAndGet(number);
    }

    private void increment(final long duration, final AtomicLong counter)
    {
        if (!active)
        {
            return;
        }

        if (counter.get() < Long.MAX_VALUE - duration)
        {
            counter.addAndGet(duration);
        }
        else
        {
            reset();
            counter.set(duration);
        }
    }

    public void reset()
    {
        puts.set(0);
        misses.set(0);
        removals.set(0);
        expiries.set(0);
        hits.set(0);
        evictions.set(0);
        getTimeTaken.set(0);
        putTimeTaken.set(0);
        removeTimeTaken.set(0);
    }

    public void setActive(final boolean active)
    {
        this.active = active;
    }
}
