package controler.rapport;

import java.awt.Desktop;
import java.io.File;
import java.math.BigDecimal;
import java.sql.Connection;
import java.util.List;
import java.util.Map;

import rapport.RapportFermeture;
import view.vueRapportFermeture.VueRapportFermeture;

import commander.Commander;

import controler.Message;
import database.crud.DepotCrud;
import database.crud.EmployeCrud;
import database.crud.FactureCrud;
import database.crud.FermetureCrud;
import database.crud.ModePaiementCrud;
import database.crud.denormalised.ViewEncaissementCrud;
import database.crud.denormalised.ViewFactureCrud;
import database.crud.denormalised.ViewVenteCrud;
import database.dataset.Depot;
import database.dataset.Employe;
import database.dataset.Facture;
import database.dataset.Fermeture;
import database.dataset.Modedepaiement;
import database.dataview.view_facture;

public class ControlerRapportFermeture {
	public static final Message reveil = new Message(){
		public void trigger(Object caster) throws Exception {
			if (!(caster instanceof VueRapportFermeture))
				return;
			VueRapportFermeture vue = (VueRapportFermeture)caster;
			Connection connection = Commander.getInstance().getConnectionBD();
			
			FermetureCrud fermetureCrud = new FermetureCrud(connection);
			DepotCrud depotCrud = new DepotCrud(connection);
			ModePaiementCrud modedepaiementCrud = new ModePaiementCrud(connection);
			ViewFactureCrud viewFactureCrud = new ViewFactureCrud(connection);
			ViewEncaissementCrud viewEncaissementCrud = new ViewEncaissementCrud(connection);
			ViewVenteCrud viewVenteCrud = new ViewVenteCrud(connection);
			
			Depot depot = depotCrud.getLastDepot();
			List<Fermeture> fermetureLst = fermetureCrud.readByFk_depot(depot.getDepot_p_id());
			for (Fermeture ferm : fermetureLst){
				vue.addFermeture(ferm.getfermeture_p_id(), 
						         "sum(encaissement)", 
						         ferm.getFermeture_jour().toString());
			}
			
			Fermeture fermeture;
			if (vue.getSelectedFermeture()==0){
				fermeture = fermetureCrud.getLastFermeture();
			}else{
				fermeture = fermetureCrud.readById(vue.getSelectedFermeture());
			}
			vue.setCurrentFermetureId(fermeture.getfermeture_p_id());
			
			List<view_facture> openFactureLst = viewFactureCrud.readByFk_fermeture(fermeture.getfermeture_p_id());
			
			vue.clear();
			for (view_facture facture : openFactureLst){
				Map<String,BigDecimal> charge = viewVenteCrud.getSumVenteFromFacture(facture.getFacture_p_id());
				BigDecimal encaissement = viewEncaissementCrud.getSumEncaissementFromFacture(facture.getFacture_p_id(),"");
				BigDecimal vente = (charge.get("soustotal").add(charge.get("tps")).add(charge.get("tvq")).add(charge.get("hebergement")));
				String t = encaissement.toPlainString()+"$";
				vue.addFacture(facture.getFacture_p_id(), 
						       facture.getFacture_jour().toString(),
						       vente.toPlainString()+"$", 
						       encaissement.toPlainString()+"$");
			}
			
			for (Modedepaiement modedepaiement : modedepaiementCrud.readAll()){
				BigDecimal sommaire = new BigDecimal("0");
				for (view_facture facture : openFactureLst){
					sommaire = sommaire.add(viewEncaissementCrud.getSumEncaissementFromFacture(facture.getFacture_p_id(), modedepaiement.getModedepaiement_nom()));
				}
				vue.addSommaire(modedepaiement.getModedepaiement_nom(), sommaire);
			}
		}
	};
	
	public static final Message imprimer = new Message(){
		public void trigger(Object caster) throws Exception {
			if (!(caster instanceof VueRapportFermeture))
				return;
			VueRapportFermeture vue = (VueRapportFermeture)caster;
			Connection connection = Commander.getInstance().getConnectionBD();
			
			RapportFermeture rapport = new RapportFermeture();
			
			FactureCrud factureCrud = new FactureCrud(connection);
			FermetureCrud fermetureCrud = new FermetureCrud(connection);
			DepotCrud depotCrud = new DepotCrud(connection);
			ModePaiementCrud modedepaiementCrud = new ModePaiementCrud(connection);
			EmployeCrud employeCrud = new EmployeCrud(connection);
			ViewEncaissementCrud viewEncaissementCrud = new ViewEncaissementCrud(connection);
			ViewVenteCrud viewVenteCrud = new ViewVenteCrud(connection);
			
			Depot depot = depotCrud.getLastDepot();
			Fermeture fermeture;
			int selectedFermeture = vue.getSelectedFermeture();
			if (selectedFermeture==0){
				fermeture = fermetureCrud.getLastFermeture();
			}else{
				fermeture = fermetureCrud.readById(selectedFermeture);
			}
			Employe employe = employeCrud.readById(fermeture.getemploye_fk_id());
			
			List<Fermeture> fermetureLst = fermetureCrud.readByFk_depot(depot.getDepot_p_id());
			List<Facture> openFactureLst = factureCrud.readByFk_fermeture(fermeture.getfermeture_p_id());
			BigDecimal sumEncaissement = new BigDecimal("0");
			
			rapport.setNomEmploye(employe.getEmploye_prenom()+" "+employe.getEmploye_nom());
			rapport.setDateFermeture(fermeture.getFermeture_jour());
			rapport.setNumeroFermeture(fermeture.getfermeture_p_id());
			
			/*
			 * "SELECT facture_p_id, sous_total, tps, tvq, sous_total+tps+tvq+hebergement AS total, comptant, interac, cheque, amex, visa, mastercard, autres FROM view_facture_encaissement_rapport WHERE fermeture_fk_id="+fermetureID
			 * 
			 * */
			
			for (Facture facture : openFactureLst){
				Map<String,BigDecimal> charge = viewVenteCrud.getSumVenteFromFacture(facture.getFacture_p_id());
				
				rapport.add(facture.getFacture_p_id(), 
						    "", 
						    charge.get("soustotal"), 
						    charge.get("tps"), 
						    charge.get("tvq"), 
						    charge.get("soustotal").add(charge.get("tps")).add(charge.get("tvq")).add(charge.get("hebergement")), 
						    viewEncaissementCrud.getSumEncaissementFromFacture(facture.getFacture_p_id(),"ARGENT"), 
						    viewEncaissementCrud.getSumEncaissementFromFacture(facture.getFacture_p_id(),"INTERAC"), 
						    viewEncaissementCrud.getSumEncaissementFromFacture(facture.getFacture_p_id(),"CHEQUE"), 
						    viewEncaissementCrud.getSumEncaissementFromFacture(facture.getFacture_p_id(),"AMEX"), 
						    viewEncaissementCrud.getSumEncaissementFromFacture(facture.getFacture_p_id(),"VISA"), 
						    viewEncaissementCrud.getSumEncaissementFromFacture(facture.getFacture_p_id(),"MASTERCARD"), 
						    viewEncaissementCrud.getSumEncaissementFromFacture(facture.getFacture_p_id(),"AUTRE"));
			}
			
			
			for (Modedepaiement modedepaiement : modedepaiementCrud.readAll()){
				BigDecimal sommaire = new BigDecimal("0");
				for (Facture facture : openFactureLst){
					sommaire = sommaire.add(viewEncaissementCrud.getSumEncaissementFromFacture(facture.getFacture_p_id(), modedepaiement.getModedepaiement_nom()));
				}
				
			}
			
			rapport.generate();
			rapport.saveas("test.pdf");
		    File myFile = new File("test.pdf");
		    Desktop.getDesktop().open(myFile);
		}
	};
	
	public static final Message selectionner = new Message(){
		public void trigger(Object caster) throws Exception {
			if (!(caster instanceof VueRapportFermeture))
				return;
			VueRapportFermeture vue = (VueRapportFermeture)caster;
				Connection connection = Commander.getInstance().getConnectionBD();

		}
	};
	
	public static final Message annuler = new Message(){
		public void trigger(Object caster) throws Exception {
			if (!(caster instanceof VueRapportFermeture))
				return;
			VueRapportFermeture vue = (VueRapportFermeture)caster;
				Connection connection = Commander.getInstance().getConnectionBD();
		}
	};
	
	public static final Message fermer = new Message(){
		public void trigger(Object caster) throws Exception {
			if (!(caster instanceof VueRapportFermeture))
				return;
			VueRapportFermeture vue = (VueRapportFermeture)caster;
				Connection connection = Commander.getInstance().getConnectionBD();

		}
	};
}
