package org.limewire.nio.channel;

import java.io.IOException;
import java.nio.ByteBuffer;

import org.limewire.collection.Buffer;
import org.limewire.nio.observer.WriteObserver;

/** A simple writer that maintains statistics about how much was written. */
public class StatisticGatheringWriter extends AbstractChannelInterestWriter {

    private final static long NANO_START = System.nanoTime();
    private static final int HISTORY = 50;

    private final Buffer<Long> handleWrites = new Buffer<Long>(HISTORY);
    private final Buffer<Long> interestWrites = new Buffer<Long>(HISTORY);
    private final Buffer<Boolean> interestWritesStatus = new Buffer<Boolean>(HISTORY);
    private final Buffer<Long> writeTimes = new Buffer<Long>(HISTORY);
    private final Buffer<Long> writeAmounts = new Buffer<Long>(HISTORY);
    
    private long amountWrote, totalHandleWrite, totalInterestWrite, positiveInterestWrite;
    
    @Override
    public int write(ByteBuffer src) throws IOException {
        writeTimes.add(System.nanoTime() - NANO_START);
        int wrote = super.write(src);
        amountWrote += wrote;
        writeAmounts.add((long)wrote);
        return wrote;
    }
    
    @Override
    public boolean handleWrite() throws IOException {
        handleWrites.add(System.nanoTime() - NANO_START);
        totalHandleWrite++;
        return super.handleWrite();
    }

    @Override
    public void interestWrite(WriteObserver observer, boolean status) {
        interestWrites.add(System.nanoTime() - NANO_START);
        interestWritesStatus.add(status);
        totalInterestWrite++;
        if (status)
            positiveInterestWrite++;
        super.interestWrite(observer, status);
    }
}
