package eu.dnetlib.espas.data.harvest;

import java.util.Random;

import org.apache.log4j.Logger;

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

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

   public Producer()
   {
      this.initializeProducer(DEFAULT_MAX_TIME_TO_SLEEP, DEFAULT_NUM_OF_RECORDS_TO_PRODUCE, null);
   }

   public Producer(int maxTimeToSleep, int numOfRecordsToProduce, RecordsHarvester recordsHarvester)
   {
      this.initializeProducer(maxTimeToSleep, numOfRecordsToProduce, recordsHarvester);
   }

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

   @Override
   public void run()
   {
      for(int i = 1; i <= this.numOfRecordsToProduce; i++)
      {
         try
         {
            Thread.sleep(this.randomGenerator.nextInt(this.maxTimeToSleep));
            this.recordsHarvester.put(Integer.toString(i));
            this.sum += i;
            logger.info("Produced:" + i);
         }
         catch(InterruptedException e)
         {
            logger.error("Interrupted exception", e);
         }
      }
      // Harvesting (records producing) is completed.
      this.recordsHarvester.setHarvestingCompleted(true);
   }

   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 getNumOfProducedRecords()
   {
      return numOfRecordsToProduce;
   }

   public void setNumOfRecordsToProduce(int numOfProducedRecords)
   {
      this.numOfRecordsToProduce = numOfProducedRecords;
   }

   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;
   }
}
