package danielcortes.xyz.informes;

import danielcortes.xyz.data.DAOManager;
import danielcortes.xyz.models.caja.Caja;
import danielcortes.xyz.models.caja.CajaDAO;
import danielcortes.xyz.models.documentos.Documentos;
import danielcortes.xyz.models.documentos.DocumentosDAO;
import danielcortes.xyz.models.efectivo.EfectivoDAO;
import danielcortes.xyz.models.egreso.EgresoDAO;
import danielcortes.xyz.models.ingreso.IngresoDAO;
import java.time.LocalDate;
import java.time.YearMonth;
import java.util.HashMap;

public class InformeResumenArqueo {

  private HashMap<LocalDate, ResumenArqueo> informe;
  private YearMonth mes;

  private InformeResumenArqueo(){}

  public ResumenArqueo get(LocalDate localDate) {
    return informe.get(localDate);
  }

  private void put(LocalDate localDate, ResumenArqueo resumenArqueo) {
    informe.put(localDate, resumenArqueo);
  }

  public int size(){
    return informe.size();
  }

  public YearMonth getMes(){
    return mes;
  }

  public static InformeResumenArqueo generate(YearMonth mes){
    InformeResumenArqueo informeResumenArqueo = new InformeResumenArqueo();
    informeResumenArqueo.informe = new HashMap<>();
    informeResumenArqueo.mes = mes;

    LocalDate currentDate = mes.atDay(1);
    LocalDate endDatePlusOne = mes.atEndOfMonth().plusDays(1);

    CajaDAO cajaDAO = DAOManager.getCajaDAO();
    EfectivoDAO efectivoDAO = DAOManager.getEfectivoDAO();
    EgresoDAO egresoDAO = DAOManager.getEgresoDAO();
    IngresoDAO ingresoDAO = DAOManager.getIngresoDAO();
    DocumentosDAO documentosDAO = DAOManager.getDocumentosDAO();

    while (currentDate.isBefore(endDatePlusOne)) {
      ResumenArqueo resumenArqueo = new ResumenArqueo();
      Caja caja = cajaDAO.getByFecha(currentDate).orElse(Caja.EMPTY);
      Documentos documentos = documentosDAO.getByCaja(caja).orElse(Documentos.EMPTY);

      int efectivo = efectivoDAO.getTotalEfectivo(caja);
      int cheques =  documentos.getCheques();
      int tarjetasCredito = documentos.getTarjetas();
      int retiros = documentos.getRetiros();
      int egresos = egresoDAO.getTotalEgreso(caja);
      int debeRendir = ingresoDAO.getTotalIngreso(caja);

      resumenArqueo.setEfectivo(efectivo);
      resumenArqueo.setCheques(cheques);
      resumenArqueo.setTarjetaCredito(tarjetasCredito);
      resumenArqueo.setRetiros(retiros);
      resumenArqueo.setEgresos(egresos);
      resumenArqueo.setDebeRendir(debeRendir);

      informeResumenArqueo.put(currentDate, resumenArqueo);
      currentDate = currentDate.plusDays(1);
    }

    return informeResumenArqueo;
  }

  @Override
  public String toString() {
    StringBuilder sb = new StringBuilder();
    for(LocalDate localDate: informe.keySet()){
      sb.append(localDate);
      sb.append(":");
      sb.append(informe.get(localDate));
      sb.append("\n");
    }
    return sb.toString();
  }
}
