<?php
namespace App\Service;
use App\Entity\ContratPlage;
use App\Entity\ContratRegroupement;
use App\Entity\ContratTarif;
use App\Entity\ContratType;
use App\Entity\EquipementFamille;
use App\Entity\EquipementPuissance;
use App\Entity\EquipementType;
use App\Entity\EquipementTypePuissance;
use App\Entity\Option;
use App\Entity\OptionTarif;
use App\Entity\Produit;
use App\Entity\ProduitPrestationTarif;
use App\Entity\ProduitTarif;
use App\Entity\ProduitType;
use App\Entity\SecteurTarif;
use App\Entity\SecteurZone;
use DateTime;
use Doctrine\ORM\EntityManagerInterface;
use App\Utils\Functions as func;
/**
 * Created by PhpStorm.
 * User: m.dauphin
 * Date: 28/02/2022
 * Time: 17:50
 */

class TarifManager
{

    private $em;
    private $tabContratType = ["GT" => 'GT 1', "GT2" => "GT 2","MOD" => "MOD 1","MOD2" => "MOD 2"];
    private $tabPrestationContrat = [0 => 'HORS CONTRAT', 1 => 'GT', '2' => 'MOD'];
    private $tabContratTypeBDD = ['GT' => 1, 'GT2' => 2,'MOD' => 3, 'MOD2' => 4];
    private $tabContratPlageBDD = ['3-5 ans' => 1, '6-20 ans' => 2];


    public function __construct(EntityManagerInterface $em) {
        $this->em = $em;
    }

    public function getFormattedContratTarifs() {
        $result = [];
        $tabCount = [];
        $tabPeriodeDeletable = [];
        $now = new DateTime();

        $contratTarifs = $this->em->getRepository(ContratTarif::class)->getOrderedContratTarif();

        //1- famille qui vient du type d'equipement à mettre en clef principale
        //2 - type d'equipement en clef secondaire
        //3 puissance en clef terciere
        //4 -pour chaques puissance on initialise un tableau avec MOD gt2 plage
        foreach ($contratTarifs as $contratTarif) {
            $equipementTypePuissance = $contratTarif->getEquipementTypePuissance();
            $equipementTypeFamilles = $equipementTypePuissance->getEquipementType()->getEquipementTypeFamilles();
            $dateDebut = $contratTarif->getDateDebut();
            $keyPeriode = $this->getPeriodeKey($dateDebut, $contratTarif->getDateFin());

            if (!isset($result[$keyPeriode])) { $result[$keyPeriode] = []; if ($dateDebut > $now) $tabPeriodeDeletable[] = $keyPeriode;}

            foreach ($equipementTypeFamilles as $equipementTypeFamille) {
                $keyFamille = $equipementTypeFamille->getEquipementFamille()->getCode() . ' - ' . $equipementTypeFamille->getEquipementFamille()->getLibelle();
                $keyPuissance = $equipementTypePuissance->getEquipementPuissance()->getLibelle();
                $keyTarif = $this->tabContratType[$contratTarif->getContratType()->getLibelleCourt()];
                $keyType = $equipementTypePuissance->getEquipementType()->getType();
                if (!isset($result[$keyPeriode][$keyFamille])) { $result[$keyPeriode][$keyFamille] = []; $tabCount[$keyPeriode][$keyFamille] = 0; }
                if (!isset($result[$keyPeriode][$keyFamille][$keyType])) $result[$keyPeriode][$keyFamille][$keyType] = [];
                if (!isset($result[$keyPeriode][$keyFamille][$keyType][$keyPuissance])) { $result[$keyPeriode][$keyFamille][$keyType][$keyPuissance] = []; $tabCount[$keyPeriode][$keyFamille]+=1; };

                if ($contratPlage = $contratTarif->getContratPlage())
                    $keyTarif.= ' <br/> ' . $contratPlage->getLibelle();

                $result[$keyPeriode][$keyFamille][$keyType][$keyPuissance][$keyTarif] = ['idContratTarif' => $contratTarif->getId(), 'tarif' => $contratTarif->getTarifContratHt()];
            }
            uksort($result[$keyPeriode], function ($a, $b) {
                return (int)$a - (int)$b;
            });
        }

        return ['result' => $result, 'tabCount' => $tabCount, 'tabPeriode' => $tabPeriodeDeletable];
    }
    public function getFormattedOptionTarifs() {
        $result = [];
        $tabPeriodeDeletable = [];
        $now = new DateTime();

        $optionsTarifs = $this->em->getRepository(OptionTarif::class)->findBy([], ['date_debut' => 'DESC']);

        foreach ($optionsTarifs as $optionsTarif) {
            $option = $optionsTarif->getOption();
            $type = $optionsTarif->getEquipementType()->getType();
            $dateDebut = $optionsTarif->getDateDebut();
            $keyOption = $option->getLibelleCourt();
            $keyTarif = $this->tabContratType[$optionsTarif->getContratType()->getLibelleCourt()];

            $keyPeriode = $this->getPeriodeKey($dateDebut, $optionsTarif->getDateFin());

            if (!isset($result[$keyPeriode])) { $result[$keyPeriode] = []; if ($dateDebut > $now) $tabPeriodeDeletable[] = $keyPeriode;}

            if ($contratPlage = $optionsTarif->getContratPlage())
                $keyTarif.= ' <br/> ' . $contratPlage->getLibelle();

            $result[$keyPeriode][$keyOption][$type][$keyTarif] = ['idContratTarif' => $optionsTarif->getId(), 'tarif' => $optionsTarif->getTarifHt()];
        }
        return ['result' => $result, 'tabPeriode' => $tabPeriodeDeletable];
    }

    public function getFormattedPrestations() {
        $result = [];
        $resultSecteur = [];
        $tabPeriodeDeletable = [];
        $now = new DateTime();

        $produitPrestationContratTarifs = $this->em->getRepository(ProduitPrestationTarif::class)->getPrestationTarifsByType(ProduitType::TYPE_CONTRAT);

        foreach ($produitPrestationContratTarifs as $produitPrestationTarif){
            $dateDebut = $produitPrestationTarif->getDateDebut();
            $keyPeriode = $this->getPeriodeKey($dateDebut, $produitPrestationTarif->getDateFin());

            $keyProduit = $produitPrestationTarif->getProduit()->getDesignation();

            if (!isset($resultSecteur[$keyPeriode])) { $resultSecteur[$keyPeriode] = []; if ($dateDebut > $now) $tabPeriodeDeletable[] = $keyPeriode;}

            $keyTarif = ($contrat_regroupement = $produitPrestationTarif->getContratRegroupement()) ? $this->tabPrestationContrat[$contrat_regroupement->getId()] : $this->tabPrestationContrat[0];
            if ($contratPlage = $produitPrestationTarif->getContratPlage())
                $keyTarif.= ' <br/> ' . $contratPlage->getLibelle();

            $result[$keyPeriode]['contrat'][$keyProduit][$keyTarif] = $produitPrestationTarif->getPrixHt();
        }

        $secteurTarifs = $this->em->getRepository(SecteurTarif::class)->getOrderByDateProduit();
        foreach ($secteurTarifs as $secteurTarif) {
            $dateDebut = $secteurTarif->getDateDebut();
            $keyPeriode = $this->getPeriodeKey($dateDebut, $secteurTarif->getDateFin());
            $keyTarif = $secteurTarif->getSecteurZone()->getLibelle();
            $keyProduit = $secteurTarif->getProduit()->getDesignation();

            $result[$keyPeriode]['secteur'][$keyProduit][$keyTarif] = $secteurTarif->getTarifHtDeplacement();
        }

        return ['result' => $result, 'tabPeriode' => $tabPeriodeDeletable];

    }

    public function getFormattedPieces() {
        $result = [];
        $tabPeriodeDeletable = [];
        $now = new DateTime();

        $produitTarifs = $this->em->getRepository(ProduitTarif::class)->getPiecesTarif();

        foreach ($produitTarifs as $produitTarif) {
            //on ne prend que les pieces
            $produit = $produitTarif->getProduit();
            $dateDebut = $produitTarif->getDateDebut();
            $keyPeriode = $this->getPeriodeKey($dateDebut, $produitTarif->getDateFin());

            if (!isset($result[$keyPeriode])) { $result[$keyPeriode] = []; if ($dateDebut > $now) $tabPeriodeDeletable[] = $keyPeriode;}

            $result[$keyPeriode][] = [
                'reference' => $produit->getCode(),
                'designation' => $produit->getDesignation(),
                'gtin' => $produit->getGtin(),
                'famille' => $produit->getFamilleAgi()->getLibelle(),
                'tarif' => $produitTarif->getPrixHt(),
            ];
        }
        return ['result' => $result, 'tabPeriode' => $tabPeriodeDeletable];
    }

    public function getFormattedPeriode($periode) {
        if (str_contains($periode, '>')) {
            $tabDates = explode(' > ', $periode);
            $result['date_debut'] = DateTime::createFromFormat('d/m/Y', $tabDates[0]);
            $result['date_debut_1_day'] = DateTime::createFromFormat('d/m/Y', $tabDates[0])->modify('-1 DAY');
            $result['date_fin'] = DateTime::createFromFormat('d/m/Y', $tabDates[1]);
        } else {
            $result['date_debut'] = DateTime::createFromFormat('d/m/Y', $periode);
            $result['date_debut_1_day'] = DateTime::createFromFormat('d/m/Y', $periode)->modify('-1 DAY');
        }
        return $result;
    }

    private function getPeriodeKey($dateDebut, $dateFin) {
        $keyPeriode = $dateDebut->format('d/m/Y');
        if ($dateFin) $keyPeriode .= ' > ' . $dateFin->format('d/m/Y');

        return $keyPeriode;
    }

    /**
     * @param $file
     * @param $date_debut
     * @param $old_date
     * @return array
     * fonction qui permet de traiter l'envoi d'un fichier tarif pour les ajouts en base
     */
    public function parseFileTarif($file, $type, $date_debut_string, $old_date_string = null) {
        // 1 - on commence par récupérer toutes les puissances et type equipement en mode [libelle => id] et contrat plage aussi
        $date_debut = DateTime::createFromFormat('Y-m-d', $date_debut_string);
        $date_debut_1_jour = DateTime::createFromFormat('Y-m-d', $date_debut_string)->modify('-1 DAY');
        $old_date =  DateTime::createFromFormat('Y-m-d', $old_date_string);
        if ($old_date)
            $old_date_1_jour = DateTime::createFromFormat('Y-m-d', $old_date_string)->modify('-1 DAY');

        $tabErreurs = [];
        $validKey = false;
        $success = 0;
        $className =  "App\\Entity\\" .ucfirst($type.'Tarif');

        if (($handle = fopen($file, "rb")) !== FALSE) {
            $finfo = finfo_open(FILEINFO_MIME_ENCODING);
            $mime = finfo_file($finfo, $file);
            finfo_close($finfo);
            $contents = fread($handle, filesize($file));
            if (strtoupper($mime) != 'UTF-8') {
                // Convertir le contenu de ISO-8859-1 (latin1) en UTF-8
                $contents_utf8 = iconv(strtoupper($mime), 'UTF-8', $contents);
            }
            fclose($handle);
            $row = 1;
            $contratTypes = $this->em->getRepository(ContratType::class)->findAllByIndexLibelle();
            $plages = $this->em->getRepository(ContratPlage::class)->findAllByIndexLibelle();
            if ($type == 'contrat'){
                $puissanceTypes = $this->getArrayEquipementPuissanceType();
            } else if ($type == 'option') {
                $options = $this->em->getRepository(Option::class)->findAllByIndexLibelle();
                $equipementTypes = $this->em->getRepository(EquipementType::class)->findAllByIndexLibelle();
                $validKey = true;
            }

            // Diviser le contenu en lignes
            $lines = explode("\n", $contents_utf8);
            foreach ($lines as $line) {
                if ($row == 1) { $row++; continue;}
                $data = explode(';', $line);
                if (trim(implode(',',$data), ',') == '' ) {
                    if (count($lines) != $row) {
                        $tabErreurs[] = '-Ligne '.$row.': la ligne est vide';
                    }
                    $row++;
                    continue;
                }
                $data[0] = $data[0];
                $data[1] = $data[1];
                if ($type == 'contrat') {
                    $keyTypePuissance = $data[0] . ' / ' . $data[1];
                    $keyString = 'type/puissance';
                    $validKey = isset($puissanceTypes[$keyTypePuissance]);
                } else if ($type == 'option') {
                    if (!isset($options[$data[0]]) || !isset($equipementTypes[$data[1]])) {
                        if (!isset($options[$data[0]])) {
                            $tabErreurs[] = "-Ligne $row: Option incorrecte";
                        }
                        if (!isset($equipementTypes[$data[1]])) {
                            $tabErreurs[] = "-Ligne $row: Type incorrect";
                        }
                        $row++;
                        continue;
                    } else {
                        $option = $options[$data[0]];
                        $equipementType = $equipementTypes[$data[1]];
                    }
                }

                $mod = func::isValidFloat(str_replace([',', ';'] , '.', $data[2]));
                $gt135 = func::isValidFloat(str_replace([',', ';'] , '.', $data[3]));
                $gt1620 = func::isValidFloat(str_replace([',', ';'] , '.', $data[4]));

                if ($validKey) {
                    if ((empty($mod) && $mod !=0) || (empty($gt135) && $gt135 !=0) || (empty($gt1620) && $gt1620 != 0)) {
                        if (empty($mod) ) $tabErreurs[] = "-Ligne $row: Tarif MOD vide";
                        if (empty($gt135)) $tabErreurs[] = "-Ligne $row: Tarif GT 3-5 ans vide";
                        if (empty($gt1620)) $tabErreurs[] = "-Ligne $row: Tarif GT 6-20 ans vide";
                        $row++;
                        continue;
                    } else if ($mod === false || $gt135 === false || $gt1620 === false) {
                        if ($mod === false) $tabErreurs[] = "-Ligne $row: Tarif MOD incorrect";
                        if ($gt135 === false) $tabErreurs[] = "-Ligne $row: Tarif GT 3-5 ans incorrect";
                        if ($gt1620 === false) $tabErreurs[] = "-Ligne $row: Tarif GT 6-20 ans incorrect";
                        $row++;
                        continue;
                    }  else {
                        $success++;
                        if (!empty($tabErreurs)) {$row++; continue;}
                        else {
                            if ($type == 'contrat') {
                                //on prévoit le traitement et on ajoute le nombre de succes
                                $tarifMod = ContratTarif::create($date_debut, $contratTypes['MOD'], $puissanceTypes[$keyTypePuissance], null, $mod);
                                $tarifGT35 = ContratTarif::create($date_debut, $contratTypes['GT'], $puissanceTypes[$keyTypePuissance], $plages['3-5 ans'], $gt135);
                                $tarifGT620 = ContratTarif::create($date_debut, $contratTypes['GT'], $puissanceTypes[$keyTypePuissance], $plages['6-20 ans'], $gt1620);

                                $tarif2 = $this->getTarif2($mod,$gt135 ,$gt1620);
                                $tarifMod2 = ContratTarif::create($date_debut, $contratTypes['MOD2'], $puissanceTypes[$keyTypePuissance], null, $tarif2['MOD2']);
                                $tarifGT235 = ContratTarif::create($date_debut, $contratTypes['GT2'], $puissanceTypes[$keyTypePuissance], $plages['3-5 ans'], $tarif2['GT2 3-5']);
                                $tarifGT2620 = ContratTarif::create($date_debut, $contratTypes['GT2'], $puissanceTypes[$keyTypePuissance], $plages['6-20 ans'], $tarif2['GT2 6-20']);
                            } else if ($type == 'option') {
                                //on prévoit le traitement et on ajoute le nombre de succes
                                $tarifMod = OptionTarif::create($date_debut, $contratTypes['MOD'], $option, $equipementType, null, $mod);
                                $tarifGT35 = OptionTarif::create($date_debut, $contratTypes['GT'], $option, $equipementType, $plages['3-5 ans'], $gt135);
                                $tarifGT620 = OptionTarif::create($date_debut, $contratTypes['GT'], $option, $equipementType, $plages['6-20 ans'], $gt1620);

                                $tarif2 = $this->getTarif2($mod,$gt135 ,$gt1620);
                                $tarifMod2 = OptionTarif::create($date_debut, $contratTypes['MOD2'], $option, $equipementType, null, $tarif2['MOD2']);
                                $tarifGT235 = OptionTarif::create($date_debut, $contratTypes['GT2'], $option, $equipementType, $plages['3-5 ans'], $tarif2['GT2 3-5']);
                                $tarifGT2620 = OptionTarif::create($date_debut, $contratTypes['GT2'], $option, $equipementType, $plages['6-20 ans'], $tarif2['GT2 6-20']);
                            }

                            //on ajoute les lignes pour MOD 2 , GT 2 (3-5 et 6-20)
                            $this->em->persist($tarifMod);
                            $this->em->persist($tarifGT35);
                            $this->em->persist($tarifGT620);
                            $this->em->persist($tarifMod2);
                            $this->em->persist($tarifGT235);
                            $this->em->persist($tarifGT2620);
                        }
                    }
                } else {
                    $tabErreurs[] = "-Ligne $row:  $keyString \" $keyTypePuissance \" n'existe pas, veuillez le créer dans CONFIGURATION / Equipement / onglet Type";
                }
                $row++;
            }


        } else {
            $tabErreurs [] = ['impossible d\'ouvrir le fichier'];
        }

        if (empty($tabErreurs)) {
            //si la old date n'est pas vide et différente de l'ancienne il faut degager les anciennes données  + mettre à jour les date de fin des autres
            if ($old_date) {
                $this->em->getRepository($className)->deleteByPeriode(['date_debut' => $old_date]);
                if ($date_debut != $old_date) {
                    $this->em->getRepository($className)->majField('date_fin',$old_date_1_jour, null);
                }
            }
            $this->em->getRepository($className)->addDateFin($date_debut_1_jour);
            $this->em->flush();
            $type = 'success';
            $message = 'Fichier traité avec succès: ' . $success . ' lignes traitées';
        } else {
            $type = 'danger';
            $message = '<b>Fichier non traité:</b><br/>';
            $message .= implode("<br/>", $tabErreurs);
        }

        return ['type' => $type, 'message' => $message];
    }

    public function addPrestations($datas, $date_debut_string, $old_date_string = null) {
        $date_debut = DateTime::createFromFormat('Y-m-d', $date_debut_string);
        $date_debut_1_jour = DateTime::createFromFormat('Y-m-d', $date_debut_string)->modify('-1 DAY');
        $old_date =  DateTime::createFromFormat('Y-m-d', $old_date_string);
        if ($old_date)
            $old_date_1_jour = DateTime::createFromFormat('Y-m-d', $old_date_string)->modify('-1 DAY');

        $prestationsContrats = $this->em->getRepository(Produit::class)->findAllByIndexTypePrestationByType(ProduitType::TYPE_CONTRAT);
        $prestationsSecteurs = $this->em->getRepository(Produit::class)->findAllByIndexTypePrestationByType(ProduitType::TYPE_SECTEUR);
        $regroupement = $this->em->getRepository(ContratRegroupement::class)->findAllByIndexLibelle();
        $plages = $this->em->getRepository(ContratPlage::class)->findAllByIndexLibelle();

        //prestation liée au type de contrat
        foreach ($prestationsContrats as $prestation) {
            $prestationTarifHC = ProduitPrestationTarif::create($prestation, null, null, $date_debut, $datas->get('hors-contrat-' . $prestation->getId()));
            $this->em->persist($prestationTarifHC);

             if ($datas->get('mod-' . $prestation->getId())) {
                 $prestationTarifMod = ProduitPrestationTarif::create($prestation, $regroupement['MOD + MOD2'], null, $date_debut, $datas->get('mod-' . $prestation->getId()));
                 $this->em->persist($prestationTarifMod);
             }
             if ($datas->get('gt35-' . $prestation->getId())) {
                 $prestationTarifgGT35 = $prestationTarifgGT35 = ProduitPrestationTarif::create($prestation, $regroupement['GT + GT2'], $plages['3-5 ans'], $date_debut, $datas->get('gt35-' . $prestation->getId()));
                 $this->em->persist($prestationTarifgGT35);
             }
             if ($datas->get('gt620-' . $prestation->getId())) {
                 $prestationTarifgGT620 = $prestationTarifgGT620 = ProduitPrestationTarif::create($prestation, $regroupement['GT + GT2'], $plages['6-20 ans'], $date_debut, $datas->get('gt620-' . $prestation->getId()));
                 $this->em->persist($prestationTarifgGT620);
             }
        }

        //prestation liée au secteur
        foreach ($prestationsSecteurs as $prestation) {
            $secteurZoneStandard = $this->em->getRepository(SecteurZone::class)->findOneBy(['libelle' => 'Standard']);
            $secteurZUD = $this->em->getRepository(SecteurZone::class)->findOneBy(['libelle' => 'ZUD']);
            $secteurProvince = $this->em->getRepository(SecteurZone::class)->findOneBy(['libelle' => 'Province']);
            $secteurStandard = SecteurTarif::create($secteurZoneStandard, $date_debut, $datas->get('st-' . $prestation->getId() ), $prestation);
            $secteurZUD = SecteurTarif::create($secteurZUD, $date_debut, $datas->get('zd-' . $prestation->getId() ), $prestation);
            $secteurProvince = SecteurTarif::create($secteurProvince, $date_debut, $datas->get('pro-' . $prestation->getId() ), $prestation);
            $this->em->persist($secteurStandard);
            $this->em->persist($secteurZUD);
            $this->em->persist($secteurProvince);
        }

            //si la old date n'est pas vide et différente de l'ancienne il faut degager les anciennes données  + mettre à jour les date de fin des autres
        if ($old_date) {
            $this->em->getRepository(ProduitPrestationTarif::class)->deleteByPeriode(['date_debut' => $old_date]);
            $this->em->getRepository(SecteurTarif::class)->deleteByPeriode(['date_debut' => $old_date]);
            if ($date_debut != $old_date) {
                $this->em->getRepository(ProduitPrestationTarif::class)->majField('date_fin',$old_date_1_jour, null);
                $this->em->getRepository(SecteurTarif::class)->majField('date_fin',$old_date_1_jour, null);
            }
        }
        $this->em->getRepository(ProduitPrestationTarif::class)->addDateFin($date_debut_1_jour);
        $this->em->getRepository(SecteurTarif::class)->addDateFin($date_debut_1_jour);
        $this->em->flush();

        return ['type' => 'success', 'message' => 'Période ajoutée avec succès'];
    }

    public function getCsvData($type, $periode) {
        if ($type == 'contrat') $result = $this->getCsvContrat($periode);
        elseif ($type == 'option') $result = $this->getCsvOption($periode);

        return $result;
    }

    private function getCsvContrat($periode) {
        $result = [];
        $resultsTmp[0] =  ['Type', 'Puissance', 'MOD 1', 'GT 3-5 ans', 'GT 6-20 ans', 'MOD 2', 'GT 2 3-5 ans', 'GT 2 6-20 ans'];
        unset($periode['date_debut_1_day']);
        $contratsTarif = $this->em->getRepository(ContratTarif::class)->getOrderedContratTarif($periode['date_debut']);
        foreach ($contratsTarif as $contratTarif) {
            $equipementTypePuissance = $contratTarif->getEquipementTypePuissance();
            $keyPuissance = $equipementTypePuissance->getEquipementPuissance()->getLibelle();
            $keyType = $equipementTypePuissance->getEquipementType()->getType();
            $keyArray = $keyType . ' - ' . $keyPuissance;
            $keyContratType = $contratTarif->getContratType()->getLibelleCourt();
            $contratPlage = $contratTarif->getContratPlage();
            if (!isset($resultsTmp[$keyArray])) {
                $resultsTmp[$keyArray][] = $keyType;
                $resultsTmp[$keyArray][] = $keyPuissance;
            }

            if ($keyContratType == 'MOD') $resultsTmp[$keyArray][2] = $contratTarif->getTarifContratHt();
            elseif ($keyContratType == 'MOD2') $resultsTmp[$keyArray][5] = $contratTarif->getTarifContratHt();
            elseif ($keyContratType == 'GT' && $contratPlage->getLibelle() == '3-5 ans') $resultsTmp[$keyArray][3] = $contratTarif->getTarifContratHt();
            elseif ($keyContratType == 'GT' && $contratPlage->getLibelle() == '6-20 ans') $resultsTmp[$keyArray][4] = $contratTarif->getTarifContratHt();
            elseif ($keyContratType == 'GT2' && $contratPlage->getLibelle() == '3-5 ans') $resultsTmp[$keyArray][6] = $contratTarif->getTarifContratHt();
            elseif ($keyContratType == 'GT2' && $contratPlage->getLibelle() == '6-20 ans') $resultsTmp[$keyArray][7] = $contratTarif->getTarifContratHt();

            ksort($resultsTmp[$keyArray]);
        }

        foreach ($resultsTmp as $row) {
            $result[] = implode(';', $row);
        }

        return mb_convert_encoding(implode("\n", $result), 'UTF-16LE', 'UTF-8');
    }
    private function getCsvOption($periode) {
        $result = [];
        $resultsTmp[0] = ['Option', 'Type', 'MOD 1', 'GT 3-5 ans', 'GT 6-20 ans', 'MOD 2', 'GT 2 3-5 ans', 'GT 2 6-20 ans'];
        unset($periode['date_debut_1_day']);
        $optionsTarif = $this->em->getRepository(OptionTarif::class)->findBy($periode);

        foreach ($optionsTarif as $optionTarif) {
            $option = $optionTarif->getOption();
            $keyType = $optionTarif->getEquipementType()->getType();
            $keyOption = $option->getLibelleCourt();
            $keyContratType = $optionTarif->getContratType()->getLibelleCourt();
            $contratPlage = $optionTarif->getContratPlage();

            $keyArray = $keyOption . ' - ' . $keyType;

            if (!isset($resultsTmp[$keyArray])) {
                $resultsTmp[$keyArray][] = $keyOption;
                $resultsTmp[$keyArray][] = $keyType;
            }
            if ($keyContratType == 'MOD') $resultsTmp[$keyArray][2] = $optionTarif->getTarifHt();
            if ($keyContratType == 'MOD2') $resultsTmp[$keyArray][5] = $optionTarif->getTarifHt();
            if ($keyContratType == 'GT' && $contratPlage->getLibelle() == '3-5 ans') $resultsTmp[$keyArray][3] = $optionTarif->getTarifHt();
            if ($keyContratType == 'GT' && $contratPlage->getLibelle() == '6-20 ans') $resultsTmp[$keyArray][4] = $optionTarif->getTarifHt();
            if ($keyContratType == 'GT2' && $contratPlage->getLibelle() == '3-5 ans') $resultsTmp[$keyArray][6] = $optionTarif->getTarifHt();
            if ($keyContratType == 'GT2' && $contratPlage->getLibelle() == '6-20 ans') $resultsTmp[$keyArray][7] = $optionTarif->getTarifHt();

            ksort($resultsTmp[$keyArray]);
        }

        foreach ($resultsTmp as $row) {
            $result[] = implode(';', $row);
        }

        return mb_convert_encoding(implode("\n", $result), 'UTF-16LE', 'UTF-8');
    }

    private function getArrayEquipementPuissanceType() {
        $result =[];
        $puissanceTypes = $this->em->getRepository(EquipementTypePuissance::class)->findAll();

        foreach ($puissanceTypes as $puissanceType) {
            $keyTypePuissance = $puissanceType->getEquipementType()->getType() . ' / ' . $puissanceType->getEquipementPuissance()->getLibelle();
            $result[$keyTypePuissance] = $puissanceType;
        }

        return $result;
    }

    private function getTarif2($mod1, $gt135, $gt1620) {
        $mod2 = (float)($mod1 * 1.7);
        $gt235 = (float)($gt135 + $mod2 - $mod1);
        $gt2620 = (float)($gt1620 + $mod2 -$mod1);

        return [
            'MOD2' => $mod2,
            'GT2 3-5' => $gt235,
            'GT2 6-20' => $gt2620
        ];
    }

    public function calculOptionTarif($option, $equipementType, $ageEquipement, $contratType) {
        //si contrat type Mod on s'en fou de la plage
        $contratPlage = null;
        if (in_array($contratType->getLibelleCourt() , ['GT', 'GT2'])) {
            if ($ageEquipement <= 5 ) $contratPlage = $this->em->getRepository(ContratPlage::class)->find($this->tabContratPlageBDD['3-5 ans']);
            else  $contratPlage = $this->em->getRepository(ContratPlage::class)->find($this->tabContratPlageBDD['6-20 ans']);
        }

        $optionTarif = $this->em->getRepository(OptionTarif::class)->getOptionTarifEquipement($option, $equipementType, $contratType, $contratPlage);

        return $optionTarif ? $optionTarif[0]->getTarifHt() : null;
    }
}