package com.mossle.core.mail;

import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

public class MailConsumer implements Runnable {
    private static Logger logger = LoggerFactory.getLogger(MailConsumer.class);
    private MailStore mailStore;
    private MailHelper mailHelper;
    private boolean active;
    private Thread thread;
    private ExecutorService executorService;
    private int threshold = 10;

    public void start() {
        active = true;
        thread = new Thread(this);
        thread.setDaemon(true);
        thread.start();
        executorService = Executors.newFixedThreadPool(10);
    }

    public void stop() {
        active = false;
        thread = null;
        executorService.shutdown();
    }

    public void run() {
        while (active) {
            for (int i = 0; i < threshold; i++) {
                doConsume();
            }

            try {
                Thread.sleep(1000);
            } catch (InterruptedException ex) {
                logger.info(ex.getMessage(), ex);
                Thread.currentThread().interrupt();
            }
        }
    }

    public void doConsume() {
        try {
            MailDTO mailDto = mailStore.takeMailDto();
            logger.debug("consume : {}", mailDto);

            MailWorker mailWorker = new MailWorker(mailDto, mailHelper);
            executorService.submit(mailWorker);
        } catch (Exception ex) {
            logger.warn(ex.getMessage(), ex);
        }
    }

    public void setMailStore(MailStore mailStore) {
        this.mailStore = mailStore;
    }

    public void setMailHelper(MailHelper mailHelper) {
        this.mailHelper = mailHelper;
    }

    public void setThreshold(int threshold) {
        this.threshold = threshold;
    }
}
