<?php

namespace App\Controller\Api;

use App\Entity\AttestationEntretien;
use App\Entity\ClassificationEnergetique;
use App\Entity\InterventionAnomalie;
use App\Entity\InterventionClasseEnergetique;
use App\Entity\ContratPlage;
use App\Entity\Produit;
use App\Entity\FactureLigne;
use App\Entity\ContratTarif;
use App\Entity\SecteurTarif;
use App\Entity\SecteurZone;
use App\Entity\Intervention;
use App\Entity\Utilisateur;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use App\Entity\Post;
use \DateTime;
use Symfony\Component\HttpFoundation\JsonResponse;


/**
 * Class ApiGlobalController
 *
 */
class ApiGlobalController extends AbstractController
{
    public function completeDataIntervention($intervention)
    {
        $em = $this->getDoctrine()->getManager();
        $equipement = $intervention->getEquipement();

        //classification energetique
        $this->getClassificationEnergetique($intervention);

        //forfaits
        $contratRegroupement = null;
        $contratPlage = null;
        $contratEnCours = false;
        if($intervention->getEquipement()){
            if ($intervention->getEquipement()->getLastContrat()) {
                $contratEnCours = true;
                $contratRegroupement = $equipement->getLastContrat()->getContratType()->getContratRegroupement();
            }
            $contratPlage = ($equipement && $equipement->getEquipementTranche()) ? $em->getRepository(ContratPlage::class)->findByAge($equipement->getEquipementTranche()->getAge()) : null;

            $forfait = $em->getRepository(Produit::class)->getForfaits($contratRegroupement, $contratPlage);
            $intervention->setForfaits($forfait);

            //deplacement et supplement contrat
            $supplement = 0;
            $zud = false;
            if ($secteur = $equipement->getSecteur()) {
                $secteurZone = $equipement->getSecteur()->getSecteurZone();
                $zoneZud = $em->getRepository(SecteurZone::class)->findOneBy(['libelle' => 'ZUD']);
                if ($secteurZone == $zoneZud) {
                    $zud = true;
                    $produit = $em->getRepository(Produit::class)->findOneBy(['code' => 'SUPP']);
                    $secteurTarif = $em->getRepository(SecteurTarif::class)->findOneBy([
                        'produit' => $produit,
                        'secteur_zone' => $secteurZone,
                        'date_fin' => null,
                    ]);
                    $supplement = $secteurTarif->getTarifHtDeplacement();
                }
            }else{
                $secteurZone = $em->getRepository(SecteurZone::class)->findOneBy(['libelle' => 'Standard']);
            }
            $produit = $em->getRepository(Produit::class)->findOneBy(['code' => 'DEPL']);
            $deplacement = $em->getRepository(SecteurTarif::class)->getSecteurTarif($produit, $secteurZone);
            $intervention->setDeplacement($deplacement);
            $intervention->setZud($zud);

            //pieces changées payées -2ans ou 5 ans si gu_etendue
            $piecesHisto = $em->getRepository(FactureLigne::class)->getPiecesChangeesByEquipement($equipement);
            $intervention->setPiecesHistorique($piecesHisto);

            //anomalies dernière intervention
            $lastIntervention = $em->getRepository(Intervention::class)->getLastInterventionByEquipement($equipement);
            $lastAnomalies = $em->getRepository(InterventionAnomalie::class)->findByIntervention($lastIntervention);
            $intervention->setAnomalieHistorique($lastAnomalies);

            //contrat tarifs
            if($contratEnCours == false && $contratPlage != null) {
                $contratTarifs = $em->getRepository(ContratTarif::class)->findForOneEquipement($equipement->getEquipementTypePuissance(), $contratPlage);
                foreach ($contratTarifs as $cle => $contratTarif) {
                    $contratTarif->setTarifContratHt($contratTarif->getTarifContratHt() + $supplement);
                }
                $intervention->setContratTarifs($contratTarifs);
            }

            //date dernier entretien
            $lastEntretien = $em->getRepository(Intervention::class)->getLastEntretien($equipement);
            if($lastEntretien) {
                $attestationEntretien = new AttestationEntretien();
                $attestationEntretien->setDateDernierEntretien($lastEntretien->getPlanning()->getDate());
                $intervention->setAttestationEntretien($attestationEntretien);
            }
        }
        return $intervention;
    }

    public function getClassificationEnergetique($intervention)
    {
        $em = $this->getDoctrine()->getManager();
        /*classe energetique*/
        $interventionClasseEnergetique = new InterventionClasseEnergetique();
        $interventionClasseEnergetique->setEnergie('Gaz');
        $equipement = $intervention->getEquipement();
        if($equipement) {
            $numSerie = str_pad($equipement->getNumSeriePrincipal(), 14, "0", STR_PAD_LEFT);
            $anneeFabrication = substr($numSerie, 0, 2);
            $semaineFabrication = substr($numSerie, 2, 2);
            $dateFabrication = new DateTime($this->dateLundi($anneeFabrication, $semaineFabrication));
            $dateFabrication = $dateFabrication->format("Y-m-d 00:00:00");

            $rendementNox = $em->getRepository(ClassificationEnergetique::class)->getClassificationEnergetique($equipement->getEquipementTypePuissance()->getEquipementType()->getId(), $dateFabrication);
            $interventionClasseEnergetique->setClasseRendement($rendementNox[0]->getClasseRendement());
            $interventionClasseEnergetique->setClasseEnergetique($rendementNox[0]->getClasseEnergetique());
            $interventionClasseEnergetique->setRendement($rendementNox[0]->getRendement());
            $interventionClasseEnergetique->setRendementReference($rendementNox[0]->getRendementReference());
            $interventionClasseEnergetique->setNox($rendementNox[0]->getNox());
            $interventionClasseEnergetique->setNoxReference($rendementNox[0]->getNoxReference());
            $interventionClasseEnergetique->setEvacuationEtanche(($rendementNox[0]->getEvacuationEtanche() == "1") ? 'Étanche' : 'Non étanche');
            $semaineFabrication = substr($numSerie, 2, 2);
            $interventionClasseEnergetique->setDateFabrication('S' . $semaineFabrication . ' ' . $anneeFabrication);
            /*Fin classe energetique*/
            $intervention->setInterventionClasseEnergetique($interventionClasseEnergetique);
        }
        return $intervention;
    }

    public function checkToken($token){
        $em = $this->getDoctrine()->getManager();
        $tech = $em->getRepository(Utilisateur::class)->findOneBy(['token_mobilite' => $token]);
        if ($tech == null) {
            return new JsonResponse(['message' => 'Token incorrect'], 403);
        }
        return $tech;
    }

    private function dateLundi($annee, $numSemaine)
    {
        //retourne la date du lundi de la semaine N° xx
        //détermination de la date du lundi de la semaine N° 1
        $laDate = new DateTime($annee . '-01-01');
        //N° de semaine du 1er lundi de janvier
        $laDate -> modify('first monday');
        //si la semaine du 1er lundi est la semaine N° 1, c'est bon
        //sinon, c'est le lundi précédent
        if ($laDate -> format('W') != '01')
        {
            $laDate -> modify('last monday');
        }
        //on ajoute le nombre de semaines
        $laDate -> modify('+' . ($numSemaine - 1) . ' week');
        return $laDate -> format('Y-m-d');
    }
}