<?php
namespace App\Service;
use App\Entity\Client;
use App\Entity\Equipement;
use Doctrine\ORM\EntityManagerInterface;
use App\Utils\Functions as func;
/**
 * Created by PhpStorm.
 * User: m.dauphin
 * Date: 28/02/2022
 * Time: 17:50
 */

class EquipementManager
{

    private $em;

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

    public function removeInfosTechniqueEquipement(Equipement $equipement) {
        //on enleve tout ce qui est ooption + infos technique équipement
        foreach ($equipement->getEquipementOptions() as $option) {
           $equipement->removeEquipementOption($option);
        }
        $equipement->setEquipementFamille(null);
        $equipement->setEquipementTypePuissance(null);
        $equipement->setNumSeriePrincipal('');
        $equipement->setNumSerieSecondaire('');
        $equipement->setVmc(false);
        $equipement->setDatePremierAllumage(null);
        $equipement->setEquipementLocal(null);

        return $equipement;
    }

    public function getEquipementOptionsFormatted(Equipement $equipement) {
        $result = [];
        $tarif = '';
        $contrat = $equipement->getLastContrat();
        //tarif d'une option = "annee mise en service ou numero de serie " comprise entre date debut option_tarif et date_fin option tarif
        foreach ($equipement->getEquipementOptions() as $equipementOption) {
            if (!$equipementOption->getDateFin() || $equipementOption->getDateFin() > new \DateTime() ) {
                $etat = (($contrat && $equipementOption->getDateDebut() && $equipementOption->getDateDebut() <= $contrat->getDateDebutContrat()) && !$equipementOption->getDateResiliation()) ? 'Actif' : ($equipementOption->getDateResiliation() ? 'Suppression' : 'Ajout');
                $result[] = [
                    'id' => $equipementOption->getId(),
                    'option' => $equipementOption->getOption()->getId(),
                    'option_libelle' =>  $equipementOption->getOption()->getLibelleCourt(),
                    'date_souscription' => $equipementOption->getDateSouscription()->format('Y-m-d\TH:i:sP') ,
                    'prix_ht' => ($equipementOption->getPrixHt() ? $equipementOption->getPrixHt().'€' : ''),
                    'etat' => $etat,
                    'date_debut' => ($etat == 'Suppression' && $equipementOption->getDateFin()) ? $equipementOption->getDateFin()->format('Y-m-d\TH:i:sP') : ($equipementOption->getDateDebut() ? $equipementOption->getDateDebut()->format('Y-m-d\TH:i:sP') : ''),
                    'tva' => ($equipement->getTauxTva() ? $equipement->getTauxTva()->getTaux().'%' : null),
                ];
            }
        }
        return $result;
    }

    /**
     * Calcule et met à jour le flag a_servir pour un équipement
     * Un équipement est à servir si :
     * - Il est actif
     * - Il a un contrat en cours (date_debut <= now <= date_fin)
     * - Le contrat est le dernier contrat (dernier_contrat = true)
     * - Il n'a pas d'intervention V1 (code = 'V1' ou libelle LIKE '%V1%')
     */
    public function updateAServirFlag(Equipement $equipement): bool
    {
        $now = new \DateTime();
        // Vérifier si l'équipement est actif
        if (!$equipement->getActif()) {
            $equipement->setAServir(false);
//            var_dump($equipement->getId());
//            var_dump('equipement inactif');
            return false;
        }
        
        // Vérifier s'il a un contrat en cours
        $contratEnCours = $equipement->getLastContrat();
        if (!$contratEnCours) {
//            var_dump($equipement->getId());
//            var_dump('pas de contrat en cours');
            $equipement->setAServir(false);
            return false;
        }
        
        // Vérifier les dates du contrat
        $dateDebut = $contratEnCours->getDateDebutContrat();
        $dateFin = $contratEnCours->getDateFinContrat();

        if (!$dateDebut || !$dateFin) {
//            var_dump($equipement->getId());
//            var_dump('pas de dates');
            $equipement->setAServir(false);
            return false;
        }
//
//        if ($dateDebut > $now || $dateFin < $now) {
//            $equipement->setAServir(false);
//            return false;
//        }
//
//        // Vérifier si c'est le dernier contrat
//        if (!$contratEnCours->getDernierContrat()) {
//            $equipement->setAServir(false);
//            return false;
//        }
        
        // Vérifier s'il a une intervention V1
        if($equipement->getDateDerniereV1() >= $dateDebut && $equipement->getDateDerniereV1() <= $dateFin){
            $equipement->setAServir(false);
//            var_dump($equipement->getId());
//            var_dump($equipement->getDateDerniereV1()->format('d/m/Y'));
//            var_dump($dateDebut->format('d/m/Y'));
//            var_dump($dateFin->format('d/m/Y'));
//            var_dump('intervention V1');
            return false;
        }
//        foreach ($equipement->getInterventions() as $intervention) {
//            $planning = $intervention->getPlanning();
//            if($planning->getDate() >= $dateDebut && $planning->getDate() <= $dateFin) {
//                $typePlanif = $intervention->getTypePlanification();
//                if ($typePlanif) {
//                    if ($typePlanif->getCode() === 'V1' ||
//                        (strpos($typePlanif->getLibelle(), 'V1') !== false)) {
//                        var_dump('intervention V1');
//                        return false;
//                    }
//                }
//            }
//        }
        
        // Toutes les conditions sont remplies
        $equipement->setAServir(true);
        return true;
    }

}