<?php

namespace App\Controller\Api;

use App\Entity\CategoriePro;
use App\Entity\Cgv;
use App\Entity\Conseil;
use App\Entity\ContratType;
use App\Entity\EquipementFamille;
use App\Entity\EquipementFamilleContrat;
use App\Entity\EquipementFluide;
use App\Entity\EquipementLocal;
use App\Entity\EquipementMarque;
use App\Entity\EquipementPuissance;
use App\Entity\EquipementType;
use App\Entity\EtatCivil;
use App\Entity\Installateur;
use App\Entity\InterventionMotifAbandon;
use App\Entity\InterventionMotifAnnulation;
use App\Entity\MomentPassage;
use App\Entity\HorairePassage;
use App\Entity\MotifDebitGaz;
use App\Entity\MoyenPaiement;
use App\Entity\PointControle;
use App\Entity\Energie;
use App\Entity\ProduitFactureAffectation;
use App\Entity\ProtectionSanitaire;
use App\Entity\Raccordement;
use App\Entity\Retour;
use App\Entity\RobinetRemplissage;
use App\Entity\TauxTva;
use App\Entity\TypeClient;
use App\Entity\TypeComplementAdresse;
use App\Entity\TypeConseil;
use App\Entity\TypeEmail;
use App\Entity\TypeEnergie;
use App\Entity\TypeEnvoi;
use App\Entity\TypeInstallation;
use App\Entity\TypeLogement;
use App\Entity\TypeTel;
use App\Entity\TypeZone;
use App\Entity\TypeVisiteIntervention;
use App\Entity\MotifModifClient;
use App\Entity\Utilisateur;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\Routing\Annotation\Route;
use Symfony\Component\Serializer\Encoder\JsonEncoder;
use Symfony\Component\Serializer\Normalizer\ObjectNormalizer;
use Symfony\Component\Serializer\Serializer;
use Symfony\Component\Serializer\SerializerInterface;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\JsonResponse;
use App\Utils\Functions;
use App\Entity\TypePlanification;
use App\Entity\TypeComplement;
use App\Entity\Anomalie;
use App\Entity\Observation;
use Sensio\Bundle\FrameworkExtraBundle\Configuration\Entity;

/**
 * Class ApiConfigController
 *
 */
class ApiConfigController extends AbstractController
{

    /**
     * Listes utilisées dans l'intervention
     * @Route("/api/config/{token_mobilite}", methods="GET", name="config")
     * @Entity("utilisateur", expr="repository.findOneBy({'token_mobilite': token_mobilite})")
     */
    public function configAction(?Utilisateur $utilisateur, SerializerInterface $serializer, Request $request)
    {
        if (!$utilisateur) {
            return new JsonResponse(['message' => 'Utilisateur non trouvé'], JsonResponse::HTTP_NOT_FOUND);
        }

        $em = $this->getDoctrine()->getManager();
        //type intervention
        $typePlanification = $em->getRepository(TypePlanification::class)->findAll();
        $datasTypePlanification = Functions::getSerialisedEntities($typePlanification, $serializer, 'api');
        //type equipement
        $equipementType = $em->getRepository(EquipementType::class)->findAll();
        $datasEquipementType = Functions::getSerialisedEntities($equipementType, $serializer, 'api');
        //famille equipement
        $equipementFamille = $em->getRepository(EquipementFamille::class)->findAll();
        $datasEquipementFamille = Functions::getSerialisedEntities($equipementFamille, $serializer, 'api');
        //equipement_marque
        $equipementMarque = $em->getRepository(EquipementMarque::class)->findAll();
        $datasEquipementMarque = Functions::getSerialisedEntities($equipementMarque, $serializer, 'api');
        //puissance
        $equipementPuissance = $em->getRepository(EquipementPuissance::class)->findAll();
        $datasEquipementPuissance = Functions::getSerialisedEntities($equipementPuissance, $serializer, 'api');
        //local
        $equipementLocal = $em->getRepository(EquipementLocal::class)->findAll();
        $datasEquipementLocal = Functions::getSerialisedEntities($equipementLocal, $serializer, 'api');
        //type contrat
        $contratType = $em->getRepository(ContratType::class)->findAll();
        $datasContratType = Functions::getSerialisedEntities($contratType, $serializer, 'api');
        //taux tva
        $tauxTva = $em->getRepository(TauxTva::class)->findBy(['actif' => true], ['taux' => 'ASC']);
        $datasTauxTva = Functions::getSerialisedEntities($tauxTva, $serializer, 'api');
        //type logement
        $typeLogement = $em->getRepository(TypeLogement::class)->findAll();
        $datasTypeLogement = Functions::getSerialisedEntities($typeLogement, $serializer, 'api');
        //energie
        $energie = $em->getRepository(Energie::class)->findBy(['affichage_tablette' => true]);
        $datasEnergie = Functions::getSerialisedEntities($energie, $serializer, 'api');
        //type energie
        $typeEnergie = $em->getRepository(TypeEnergie::class)->findAll();
        $datasTypeEnergie = Functions::getSerialisedEntities($typeEnergie, $serializer, 'api');
        //protection sanitaire
        $protectionSanitaire = $em->getRepository(ProtectionSanitaire::class)->findAll();
        $datasProtectionSanitaire = Functions::getSerialisedEntities($protectionSanitaire, $serializer, 'api');
        //robinet
        $robinetRemplissage = $em->getRepository(RobinetRemplissage::class)->findAll();
        $datasRobinetRemplissage = Functions::getSerialisedEntities($robinetRemplissage, $serializer, 'api');
        //raccordement
        $raccordement = $em->getRepository(Raccordement::class)->findAll();
        $datasRaccordement = Functions::getSerialisedEntities($raccordement, $serializer, 'api');
        //Point de contrôle
        $pointControle = $em->getRepository(PointControle::class)->findBy([], ['id' => 'ASC']);
        $datasPointControle = Functions::getSerialisedEntities($pointControle, $serializer, 'api');
        //affectation produit facture
        $affectationProduit = $em->getRepository(ProduitFactureAffectation::class)->findAll();
        $datasAffectationProduit = Functions::getSerialisedEntities($affectationProduit, $serializer, 'api');
        //retour
        $retour = $em->getRepository(Retour::class)->findAll();
        $datasRetour = Functions::getSerialisedEntities($retour, $serializer, 'api');
        //type visite intervention
        $typeVisiteIntervention = $em->getRepository(TypeVisiteIntervention::class)->findAll();
        $datasTypeVisiteIntervention = Functions::getSerialisedEntities($typeVisiteIntervention, $serializer, 'api');
        //conseil
        $conseil = $em->getRepository(Conseil::class)->findAll();
        $datasConseil = Functions::getSerialisedEntities($conseil, $serializer, 'api');

        //equipement famille contrat
        $equipementFamilleContrat = $em->getRepository(EquipementFamilleContrat::class)->findAll();
        $datasEquipementFamilleContrat = Functions::getSerialisedEntities($equipementFamilleContrat, $serializer, 'api');

        $cgv=[];
        foreach ($equipementFamilleContrat as $value){
            $cgvVersion = $em->getRepository(Cgv::class)->getLastVersion($value);
            //var_dump($cgvVersion);
            if($cgvVersion){
                $cgvTitre = str_replace(' ','_',strtolower($cgvVersion->getEquipementFamilleContrat()->getLibelle()));
                $cgv['cgv_'.$cgvTitre] = $cgvVersion;
            }
        }
        $datasCgv = Functions::getSerialisedEntities($cgv, $serializer, 'api');

        //civilité
        $etatCivil = $em->getRepository(EtatCivil::class)->findAll();
        $datasEtatCivil = Functions::getSerialisedEntities($etatCivil, $serializer, 'api');
        //type zone
        $typeZone = $em->getRepository(TypeZone::class)->findAll();
        $datasTypeZone = Functions::getSerialisedEntities($typeZone, $serializer, 'api');
        //type complement
        $typeComplement = $em->getRepository(TypeComplement::class)->findAll();
        $datasTypeComplement = Functions::getSerialisedEntities($typeComplement, $serializer, 'api');
        //type envoi
        $typeEnvoi = $em->getRepository(TypeEnvoi::class)->findAll();
        $datasTypeEnvoi = Functions::getSerialisedEntities($typeEnvoi, $serializer, 'api');
        //motif abandon
        $interventionMotifAbandon = $em->getRepository(InterventionMotifAbandon::class)->findAll();
        $datasInterventionMotifAbandon = Functions::getSerialisedEntities($interventionMotifAbandon, $serializer, 'api');
        //motif annulation
        $interventionMotifAnnulation = $em->getRepository(InterventionMotifAnnulation::class)->findAll();
        $datasInterventionMotifAnnulation = Functions::getSerialisedEntities($interventionMotifAnnulation, $serializer, 'api');
        //moyen paiement
        $moyenPaiement = $em->getRepository(MoyenPaiement::class)->findBy(['affichage_tablette' => true]);
        $datasMoyenPaiement = Functions::getSerialisedEntities($moyenPaiement, $serializer, 'api');
        //motif débit gaz
        $motifDebitGaz = $em->getRepository(MotifDebitGaz::class)->findAll();
        $datasMotifDebitGaz = Functions::getSerialisedEntities($motifDebitGaz, $serializer, 'api');
        //type client
        $typeClient = $em->getRepository(TypeClient::class)->findAll();
        $datasTypeClient = Functions::getSerialisedEntities($typeClient, $serializer, 'api');
        //type complement adresse
        $typeComplementAdresse = $em->getRepository(TypeComplementAdresse::class)->findAll();
        $datasTypeComplementAdresse = Functions::getSerialisedEntities($typeComplementAdresse, $serializer, 'api');
        //motif modif client
        $motifModifClient = $em->getRepository(MotifModifClient::class)->findAll();
        $datasMotifModifClient = Functions::getSerialisedEntities($motifModifClient, $serializer, 'api');
        //catégorie pro
        $categoriePro = $em->getRepository(CategoriePro::class)->findAll();
        $datasCategoriePro = Functions::getSerialisedEntities($categoriePro, $serializer, 'api');
        //type installation
        $typeInstallation = $em->getRepository(TypeInstallation::class)->findAll();
        $datasTypeInstallation = Functions::getSerialisedEntities($typeInstallation, $serializer, 'api');
        //type conseil
        $typeConseil = $em->getRepository(TypeConseil::class)->findAll();
        $datasTypeConseil = Functions::getSerialisedEntities($typeConseil, $serializer, 'api');
        //moment passage
        $momentPassage = $em->getRepository(MomentPassage::class)->findAll();
        $datasMomentPassage = Functions::getSerialisedEntities($momentPassage, $serializer, 'api');
        //equipement fluide
        $equipementFluide = $em->getRepository(EquipementFluide::class)->findAll();
        $datasEquipementFluide = Functions::getSerialisedEntities($equipementFluide, $serializer, 'api');

        return new JsonResponse(["type_planification" => $datasTypePlanification,
            "equipement_type" => $datasEquipementType,
            "equipement_famille" => $datasEquipementFamille,
            "equipement_puissance" => $datasEquipementPuissance,
            "equipement_local" => $datasEquipementLocal,
            "equipement_marque" => $datasEquipementMarque,
            "contrat_type" => $datasContratType,
            "taux_tva" => $datasTauxTva,
            "type_logement" => $datasTypeLogement,
            "energie" => $datasEnergie,
            "type_energie" => $datasTypeEnergie,
            "protection_sanitaire" => $datasProtectionSanitaire,
            "robinet_remplissage" => $datasRobinetRemplissage,
            "raccordement" => $datasRaccordement,
            "point_controle" => $datasPointControle,
            "produit_facture_affectation" => $datasAffectationProduit,
            "retour" => $datasRetour,
            "type_visite_intervention" => $datasTypeVisiteIntervention,
            "conseil" => $datasConseil,
            "cgv" => $datasCgv,
            "etat_civil" => $datasEtatCivil,
            "type_zone" => $datasTypeZone,
            "type_complement" => $datasTypeComplement,
            "type_envoi" => $datasTypeEnvoi,
            "motif_abandon" => $datasInterventionMotifAbandon,
            "motif_annulation" => $datasInterventionMotifAnnulation,
            "moyen_paiement" => $datasMoyenPaiement,
            "motif_debit_gaz" => $datasMotifDebitGaz,
            "type_client" => $datasTypeClient,
            "type_complement_adresse" => $datasTypeComplementAdresse,
            "motif_modif_client" => $datasMotifModifClient,
            "categorie_pro" => $datasCategoriePro,
            "type_installation" => $datasTypeInstallation,
            "type_conseil" => $datasTypeConseil,
            "moment_passage" => $datasMomentPassage,
            "equipement_famille_contrat" => $datasEquipementFamilleContrat,
            "equipement_fluide" => $datasEquipementFluide
        ], 201);
    }
}