package com.lobito.capitannemostock.business.entities.dao.impl;

import com.lobito.capitannemostock.business.entities.Deposito;
import com.lobito.capitannemostock.business.konstante.Evento;
import com.lobito.capitannemostock.business.konstante.StockTipo;
import java.io.Serializable;
import java.lang.reflect.InvocationTargetException;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Calendar;
import java.util.Collections;
import java.util.Comparator;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.Random;
import java.util.logging.Level;
import java.util.logging.Logger;
import org.apache.commons.beanutils.BeanUtils;

public class DepositoDAOImpl implements Serializable {
  private static final long serialVersionUID = 1L;
  private static String[] productos = {"Pescadilla", "Lenguado", "Corbina Rubia", "Corbina Negra", "Cazón", 
                               "Pescadilla de Red", "Mero", "Abadejo", "Brótola", "Anchoa", "Pargo",
                               "Besugo", "Bonito", "Caballa", "Merluza Astral", "Merluza Negra",
                               "Pulpo Chileno", "Langostinos", "Mejillones", "Salmón", "1234567890",
                               "Salmon Filet con piel congelado p",
                               "12345678901234567890", "123456789 123456789 1234567"};
  
  private static final String[] apellidos = {"Pérez", "Puppo", "Lopez", "Fernandez", "Acosta", "Medina"};
       
  private static DepositoDAOImpl instance;   
  private static DepositoDAOImpl instanceProd;
  private final HashMap<Long, Deposito> entradas = new HashMap<>();
  private final HashMap<Long, Deposito> entradasProd = new HashMap<>();
  private long nextId = 0;
  private static int stVnosov;
  
  private DepositoDAOImpl() {}
  
  static public DepositoDAOImpl getInstanceProd(int items, Evento evento) throws InvocationTargetException {
		if (instanceProd == null) {
			instanceProd = new DepositoDAOImpl();
			instanceProd.generirajPodatkeProd(items, evento);
		}
		return instanceProd;
	}
  
  public static DepositoDAOImpl generirajPodatke(int items, StockTipo tipo) throws InvocationTargetException {
    final DepositoDAOImpl depositoDAOImpl = new DepositoDAOImpl();

    Random r = new Random(1);
    Calendar cal = Calendar.getInstance();
    for (int i = 0; i < items; i++) {
       Deposito deposito = new Deposito();
       cal.set(1990 + r.nextInt(60), r.nextInt(11), r.nextInt(24));
       deposito.setFecha(cal.getTime());
       deposito.setProducto(productos[r.nextInt(productos.length)]);
       deposito.setSt_cajones(r.nextInt(51));        
       deposito.setPeso(r.nextDouble() * 121);     
       double total = deposito.getSt_cajones() * deposito.getPeso();

       deposito.setDestino(tipo.name());

       //System.out.println("deposito:" + deposito.getProducto() + "|" + deposito.getDestino()); 
       deposito.setTotal(total);
       depositoDAOImpl.shrani(deposito);

       instance = depositoDAOImpl;   
    }
   
    return instance;
  }
  
  public synchronized void shrani(Deposito entry) throws InvocationTargetException {
    if (entry.getDeposito_id() == null) {
      entry.setDeposito_id(new Long(entradas.size()));     
    }
    try {
      entry = (Deposito) BeanUtils.cloneBean(entry);
    } catch (Exception ex) {
      throw new RuntimeException(ex);
    }
    entradas.put(entry.getDeposito_id(), entry);
  }
  
  public synchronized List<Deposito> poisciEnteros(int items, StockTipo stockTipo) throws InvocationTargetException {
    ArrayList arrayList = new ArrayList();
           
    for (Deposito deposito : entradas.values()) {
      try {     
          arrayList.add(deposito.clone());
 
      } catch (CloneNotSupportedException ex) {
          Logger.getLogger(DepositoDAOImpl.class.getName()).log(Level.SEVERE, null, ex);
      }        
    }
       
    Collections.sort(arrayList, new Comparator<Deposito>() {
      @Override
      public int compare(Deposito o1, Deposito o2) {
          return (int) (o2.getDeposito_id()- o1.getDeposito_id());
      }
    });
    return arrayList;
  }
    
  public synchronized void zbrisi(Deposito value) {
    entradas.remove(value.getDeposito_id());
  }
  
  public void generirajPodatkeProd(int items, Evento evento) throws InvocationTargetException {
    //final DepositoDAOImpl depositoDAOImpl = new DepositoDAOImpl();

    Random r = new Random(1);
    Calendar cal = Calendar.getInstance();
    for (int i = 0; i < items; i++) {
       Deposito produccion = new Deposito();
       cal.set(2000 + r.nextInt(60), r.nextInt(11), r.nextInt(24));
       produccion.setFecha(cal.getTime());
       produccion.setProducto(productos[r.nextInt(productos.length)]);       
       produccion.setPeso(r.nextDouble() * 41);     
       produccion.setEvento(evento.name());
       produccion.setOperario(apellidos[r.nextInt(apellidos.length)]);
       
       if (i == 0 || i == 1 || i == 3) {
          produccion.setPeso_salida(20);          
       }
       if (i == 0) {
         produccion.setFecha(new Date());
       }       
       //System.out.println("produccion:" +  deposito.getFecha() + "|" + deposito.getProducto() + "|" + deposito.getEvento()); 
      
       shraniProd(produccion);

       //instance = depositoDAOImpl;   
    }
   
    //return instance;
  }
  
  public synchronized void shraniProd(Deposito entry) throws InvocationTargetException {
    //long id = 7;
    if (entry.getDeposito_id() == null) {
      System.out.println("nextId:"+nextId);
      entry.setDeposito_id(nextId++);     
    }
    
    System.out.println("entry:" + entry.getPeso());
    
    try {
      entry = (Deposito) BeanUtils.cloneBean(entry);
    } catch (Exception ex) {
      throw new RuntimeException(ex);
    }
    entradasProd.put(entry.getDeposito_id(), entry);
  }
  
  public synchronized List<Deposito> poisciProduccion(int items, Evento evento) throws InvocationTargetException {
    ArrayList arrayList = new ArrayList();
           
    for (Deposito prod : entradasProd.values()) {
      try {     
          arrayList.add(prod.clone());
          System.out.println("produccion:" + prod.getFecha() + "|" + prod.getProducto() + "|" + prod.getPeso()+ "|" + prod.getPeso_salida() + "|" + prod.getOperario()); 
 
      } catch (CloneNotSupportedException ex) {
          Logger.getLogger(DepositoDAOImpl.class.getName()).log(Level.SEVERE, null, ex);
      }        
    }
       
    Collections.sort(arrayList, new Comparator<Deposito>() {
      @Override
      public int compare(Deposito o1, Deposito o2) {
          return (int) (o2.getDeposito_id()- o1.getDeposito_id());
      }
    });
    return arrayList;
  }
  
   public static List getProductos() {
    List list = Arrays.asList(productos);
    Collections.sort(list);
    return list;
  }

  public static void setProductos(String[] productos) {
    DepositoDAOImpl.productos = productos;
  }
}