<?php

namespace App\Controller\Api;

use App\Entity\EquipementTypeOption;
use App\Entity\Option;
use App\Entity\Equipement;
use App\Entity\Produit;
use App\Entity\Utilisateur;
use App\Entity\Installateur;
use App\Entity\ContratPlage;
use App\Entity\OptionTarif;
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 Sensio\Bundle\FrameworkExtraBundle\Configuration\Entity;
use Symfony\Component\Serializer\SerializerInterface;
use Symfony\Component\HttpFoundation\Request;
use App\Entity\Post;
use App\Utils\Functions;
use Symfony\Component\HttpFoundation\JsonResponse;

/**
 * Class ApiEquipementController
 *
 * @Route("/api/equipement")
 */
class ApiEquipementController extends AbstractController
{
    /**
     * Liste des options
     * @Route("/options/{id}/{token_mobilite}", methods="GET", name="options")
     * @Entity("utilisateur", expr="repository.findOneBy({'token_mobilite': token_mobilite})")
     */
    public function optionsAction(Equipement $equipement, ?Utilisateur $utilisateur, SerializerInterface $serializer, Request $request)
    {
        if (!$utilisateur) {
            return new JsonResponse(['message' => 'Utilisateur non trouvé'], JsonResponse::HTTP_NOT_FOUND);
        }

        $em = $this->getDoctrine()->getManager();
        if($equipement->getEquipementTypePuissance() == null){
            return new JsonResponse(['message' => "Type de l'équipement non renseigné"], 403);
        }
        //rajouter prix selon equipement pour tout type de contrat si pas de contrat
        $equipementType = $equipement->getEquipementTypePuissance()->getEquipementType();
        $contratPlage = $em->getRepository(ContratPlage::class)->findByAge($equipement->getEquipementTranche()->getAge());
        $options = $em->getRepository(EquipementTypeOption::class)->getOptionByEquipementType($equipementType);

        foreach ($options as $cle => $opt){
            $option = $em->getRepository(Option::class)->findOneById($opt['id']);
            $optionTarifs = $em->getRepository(OptionTarif::class)->getOptionTarifForContrat($option, $equipementType, $contratPlage);
            $options[$cle]['optionTarifs'] = $optionTarifs;
        }

        $datasOptions = Functions::getSerialisedEntities($options, $serializer, 'api');
        return new JsonResponse(["options" => $datasOptions], 201);
    }


    /**
     * Liste des installateurs
     * @Route("/installateurs/{token_mobilite}", methods="GET", name="installateurs")
     * @Entity("utilisateur", expr="repository.findOneBy({'token_mobilite': token_mobilite})")
     */
    public function installateursAction(?Utilisateur $utilisateur, SerializerInterface $serializer, Request $request)
    {
        if (!$utilisateur) {
            return new JsonResponse(['message' => 'Utilisateur non trouvé'], JsonResponse::HTTP_NOT_FOUND);
        }
        $em = $this->getDoctrine()->getManager();
        $installateur = $em->getRepository(Installateur::class)->findAll();
        $datasInstallateur = Functions::getSerialisedEntities($installateur, $serializer, 'api');
        return new JsonResponse(["installateurs" => $datasInstallateur], 201);
    }
}