package Models;

import Controllers.Traitement.Adaptateur;
import Controllers.Traitement.ParametreSystem;
import Models.BonReceptionFrs.BonReceptionDB;
import Models.BonReceptionFrs.BonReceptionFrs;
import Models.BonReceptionFrs.BonReceptionProduitList;
import Models.FactureFrs.FactureFrs;
import Models.FactureFrs.FactureFrsDB;
import Models.Fournisseur.Fournisseur;
import Models.Fournisseur.FournisseurDB;
import Models.Produit.ListeProduit;
import Models.Produit.Produit;
import Models.Produit.ProduitDB;
import java.time.LocalDate;
import java.time.LocalTime;
import java.time.format.DateTimeFormatter;
import java.util.List;
import javafx.collections.FXCollections;
import javafx.collections.ObservableList;

/**
 * @author Maher Ben Tili
 */
public class SimpleDataAchat {
    
    ObservableList<Fournisseur> Fournisseurs = null;
    ObservableList<String> Transporteurs = null;
    ObservableList<String> Magasins = null;
    ObservableList<Produit>  Produits = null;
    
    public SimpleDataAchat() {
        Produits = new ProduitDB().getAllProduits();
        Fournisseurs = new FournisseurDB().getAllFournisseurs();
        Transporteurs = FXCollections.observableArrayList("Mabrouk Gillot", "Manoubi Dewet", "Salah Dubuisson", "Ali Romann", "Sabir Kariger");
        Magasins = FXCollections.observableArrayList("Magasin II", "Magasin III", "Magasin IV");
    }
    
    public void setDataFactureFrs(int nbrFactureFrs)
    {
        int[] uniqueArray = Adaptateur.generateUniqueRandomArray(nbrFactureFrs, 10000); 
        for(int i=0; i<nbrFactureFrs; i++)
        {
            FactureFrs Facture = new FactureFrs();

            Fournisseur Frs = Adaptateur.getRandomObject(Fournisseurs);
            Frs.setCode(Frs.getCode());
            Frs.setNom(Frs.getNom());
            Facture.setFournisseur(Frs);

            Facture.setLocal(ParametreSystem.NomLocalPC);

            LocalDate date = Adaptateur.getRandomDateBetween(LocalDate.of(2022, 1, 1), LocalDate.of(2025, 12, 31));
            DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd");
            String formattedDate = date.format(formatter);
            Facture.setDateCreation(formattedDate);

            Facture.setNumero(String.valueOf(uniqueArray[i]));
            
            String heure = Adaptateur.getRandomTimeBetween(LocalTime.of(8, 0), LocalTime.of(18, 0));
            Facture.setHeurCreation(heure);
            
            List<Produit> randomProduits = Adaptateur.getUniqueRandomObjectList(Produits, Adaptateur.getRandomValueBetween(2, 25) );
            ObservableList<ListeProduit> listeProduit = getListProduits(randomProduits);
            Facture.setListProduit(listeProduit);
            float netaPayer = 0; float Remises = 0; float totalTVA = 0; float total_H_T_Net= 0;
        
            //calcule
            for(ListeProduit liste : listeProduit){
                float totaht = Adaptateur.StringToFloat(liste.getTotalHT()) ;
                float prix_U_H_T = Adaptateur.StringToFloat(liste.getPrixHT()) ;
                float remises = Adaptateur.StringToFloat(liste.getRemise().replace("%", "")) ;
                float tva = Adaptateur.StringToFloat(liste.getTVA().replace("%", ""));
                
                totalTVA = totalTVA + ((totaht *  tva) /100) ;
                Remises =  Remises + (prix_U_H_T * remises)/100 ;
                total_H_T_Net = total_H_T_Net + totaht ;
            }

            float timbre = Adaptateur.StringToFloat(ParametreSystem.Timbre);
            netaPayer = total_H_T_Net + totalTVA + timbre ;
            Facture.setTotalTVA(Adaptateur.floatDeleZero(totalTVA));
            Facture.setRemise(Adaptateur.floatDeleZero(Remises));
            Facture.setNetAPayer(Adaptateur.floatDeleZero(netaPayer));
            Facture.setTimbre(ParametreSystem.Timbre);
            Facture.setTotalHorsTaxNet(Adaptateur.floatDeleZero(total_H_T_Net));
            
            Facture.setTypeReglement(null);
            Facture.setEtatReglement(null);
            new FactureFrsDB().setFactureFrsDB(Facture);
        }
    }
    
    public void setDataBonReception(int nbrBonReception)
    {
        int[] uniqueArray = Adaptateur.generateUniqueRandomArray(nbrBonReception, 10000); 
        for(int i=0; i<nbrBonReception; i++)
        {
            BonReceptionFrs BonReception = new BonReceptionFrs();
            BonReception.setFournisseur(Adaptateur.getRandomObject(Fournisseurs));
            
            LocalDate date = Adaptateur.getRandomDateBetween(LocalDate.of(2022, 1, 1), LocalDate.of(2025, 12, 31));
            DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd");
            String formattedDate = date.format(formatter);
            BonReception.setDate(formattedDate);
            
            BonReception.setLocal(Adaptateur.getRandomObject(Magasins));
            
            String heure = Adaptateur.getRandomTimeBetween(LocalTime.of(8, 0), LocalTime.of(18, 0));
            BonReception.setHeur(heure);
            
            BonReception.setNumero(String.valueOf(uniqueArray[i]));
            
            BonReception.setTransporteur(Adaptateur.getRandomObject(Transporteurs));
            
            List<Produit> randomProduits = Adaptateur.getUniqueRandomObjectList(Produits, Adaptateur.getRandomValueBetween(2, 25) );
            ObservableList<BonReceptionProduitList> ListProduitBons = FXCollections.observableArrayList();
            float  netaPayer = 0;
            float  Remises = 0;
            float  totalTVA = 0;
            float  total_H_T_Net= 0;
            for(Produit prod : randomProduits)
            {
                float qte = (float) Adaptateur.getRandomValueBetween(1, 7);
                float remises = (float) Adaptateur.getRandomValueBetween(1, 30);
                float prix_U_H_T = Adaptateur.StringToFloat(prod.getPrixachatht()) ;
                float tva = Adaptateur.StringToFloat(prod.getTvaachat());
                float totaht = Adaptateur.StringToFloat(prod.getPrixachatht()) ;
                float totalttc = totaht + ((totaht * tva)/100) ;
                
                totalTVA = totalTVA + ((totaht *  tva) /100) ;
                Remises =  Remises + (prix_U_H_T * remises)/100 ;
                total_H_T_Net = total_H_T_Net + totaht ;
            
                ListProduitBons.add(new BonReceptionProduitList("", "", prod.getReference(), "", Adaptateur.floatDeleZero(qte), prod.getPrixachatht(), Adaptateur.floatDeleZero(totaht), prod.getTvaachat(), Adaptateur.floatDeleZero(totalttc)));
            }
            BonReception.setListProduit(ListProduitBons);
            
            netaPayer = total_H_T_Net + totalTVA ;
            BonReception.setNetPayer(Adaptateur.floatDeleZero(netaPayer));
            
            new BonReceptionDB().setBonReceptionFrsDB(BonReception);
        }
    }
    
    private ObservableList<ListeProduit> getListProduits(List<Produit> listProduits)
    {   
        ObservableList<ListeProduit> ListProduit = FXCollections.observableArrayList();
        for(Produit prod : listProduits){
            float prixht = Adaptateur.StringToFloat(prod.getPrixventeht()) ;
            float tva = Adaptateur.StringToFloat(prod.getTvavente());
            float qte = (float) Adaptateur.getRandomValueBetween(1, 7);
            float remise = (float) Adaptateur.getRandomValueBetween(1, 30);
            float totalht = (prixht - ((prixht * remise)/100))* qte ;
            float totalttc = totalht + ((totalht * tva)/100) ;
            
            ListProduit.add(new ListeProduit(prod.getReference(), prod.getDesignation(), Adaptateur.floatDeleZero(qte), prod.getPrixventeht(), Adaptateur.floatDeleZero(remise), Adaptateur.floatDeleZero(totalht), prod.getTvavente(), Adaptateur.floatDeleZero(totalttc)));
        }
        return ListProduit;
    }
    
}
