package io.github.bucket4j.util;

import io.github.bucket4j.Bucket;

import java.util.concurrent.CountDownLatch;
import java.util.function.Function;

public class ConsumerThread extends Thread {

    private final CountDownLatch startLatch;
    private final CountDownLatch endLatch;
    private final Bucket bucket;
    private final long workTimeNanos;
    private final Function<Bucket, Long> action;
    private long consumed;
    private Exception exception;

    public ConsumerThread(CountDownLatch startLatch, CountDownLatch endLatch, Bucket bucket, long workTimeNanos, Function<Bucket, Long> action) {
        this.startLatch = startLatch;
        this.endLatch = endLatch;
        this.bucket = bucket;
        this.workTimeNanos = workTimeNanos;
        this.action = action;
    }

    @Override
    public void run() {
        try {
            startLatch.countDown();
            startLatch.await();
            long endNanoTime = System.nanoTime() + workTimeNanos;
            while(true) {
                if (System.nanoTime() >= endNanoTime) {
                    return;
                }
                consumed += action.apply(bucket);
            }
        } catch (Exception e) {
            exception.printStackTrace();
            exception = e;
        } finally {
            endLatch.countDown();
        }
    }

    public Exception getException() {
        return exception;
    }

    public long getConsumed() {
        return consumed;
    }

}