package eu.dnetlib.espas.data.harvest;

import java.util.Random;

import org.apache.log4j.Logger;

public class Consumer implements Runnable
{
   {  // Class initialization.
      logger = Logger.getLogger(Consumer.class);
   }
   private static Logger logger;
   private static final int DEFAULT_MAX_TIME_TO_SLEEP = Producer.DEFAULT_MAX_TIME_TO_SLEEP;

   private Random randomGenerator = null;
   private int maxTimeToSleep = DEFAULT_MAX_TIME_TO_SLEEP;
   private int sum = 0;
   private RecordsHarvester recordsHarvester = null;

   public Consumer()
   {
      this.initialize(DEFAULT_MAX_TIME_TO_SLEEP, null);
   }

   public Consumer(int maxTimeToSleep, RecordsHarvester recordsHarvester)
   {
      this.initialize(maxTimeToSleep, recordsHarvester);
   }

   public void initialize(int maxTimeToSleep, RecordsHarvester recordsHarvester)
   {
      this.randomGenerator = new Random();
      this.maxTimeToSleep = maxTimeToSleep;
      this.recordsHarvester = recordsHarvester;
   }

   @Override
   public void run()
   {
      int value = 0;
      while(this.recordsHarvester.hasNext())
      {
         try
         {
            Thread.sleep(this.randomGenerator.nextInt(this.maxTimeToSleep));
            value = Integer.parseInt(this.recordsHarvester.take());
            this.sum += value;
            logger.info("Consumed:" + value);
         }
         catch(InterruptedException e)
         {
            logger.error("Interrupted exception", e);
         }
         catch(NumberFormatException e)
         {
            logger.error("value = " + value);
            logger.error("Number format exception", e);
         }
      }
   }

   public Random getRandomGenerator()
   {
      return randomGenerator;
   }

   public void setRandomGenerator(Random randomGenerator)
   {
      this.randomGenerator = randomGenerator;
   }

   public int getMaxTimeToSleep()
   {
      return maxTimeToSleep;
   }

   public void setMaxTimeToSleep(int maxTimeToSleep)
   {
      this.maxTimeToSleep = maxTimeToSleep;
   }

   public int getSum()
   {
      return sum;
   }

   public void setSum(int sum)
   {
      this.sum = sum;
   }

   public RecordsHarvester getRecordsHarvester()
   {
      return recordsHarvester;
   }

   public void setRecordsHarvester(RecordsHarvester recordsHarvester)
   {
      this.recordsHarvester = recordsHarvester;
   }
}
