<?php

namespace App\Controller\Api;

use App\Entity\AgentAppareil;
use App\Entity\Planning;
use App\Entity\Utilisateur;
use App\Entity\Intervention;
use App\Entity\ClassificationEnergetique;
use App\Entity\InterventionClasseEnergetique;
use Sensio\Bundle\FrameworkExtraBundle\Configuration\IsGranted;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\Routing\Annotation\Route;
use JMS\Serializer\SerializationContext;
use Symfony\Component\HttpFoundation\JsonResponse;
use Symfony\Component\HttpFoundation\Request;
use Sensio\Bundle\FrameworkExtraBundle\Configuration\Entity;
use App\Entity\Post;
use App\Utils\Functions;
use Symfony\Component\Serializer\Encoder\JsonEncoder;
use Symfony\Component\Serializer\Normalizer\ObjectNormalizer;
use Symfony\Component\Serializer\Serializer;
use Symfony\Component\Serializer\SerializerInterface;
use \DateTime;

/**
 * Class ApiAuthentificationController
 *
 */
class ApiAuthentificationController extends ApiGlobalController
{

    /**
     * Connexion application
     * @Route("/api/login", methods="POST", name="login")
     */
    public function loginAction(SerializerInterface $serializer, Request $request) {
        $em = $this->getDoctrine()->getManager();

        $datas = json_decode($request->getContent(),true);

        $utilisateur = $em->getRepository(Utilisateur::class)->findOneByLogin($datas['login']);
        if (!is_null($utilisateur) && !$utilisateur->getActif()) {
            return new JsonResponse(['message' => 'Utilisateur non actif'], 423);
        }else if(!in_array($utilisateur->getRole()->getId(), array('4','5'))){
            return new JsonResponse(['message' => "Cet utilisateur n'est pas autorisé"], 403);
        }
        else if (is_null($utilisateur) || !password_verify($datas['password'], $utilisateur->getPassword())) {
            return new JsonResponse(['message' => 'Informations de connexion incorrecte'], 403);
        }


        try {
            $token = bin2hex(random_bytes(16));
        } catch (\TypeError $e) {
            return new JsonResponse(['message' => $e->getMessage()], 500);
        } catch (\Error $e) {
            return new JsonResponse(['message' => $e->getMessage()], 500);
        } catch (\Exception $e) {
            return new JsonResponse(['message' => $e->getMessage()], 500);
        }

        $utilisateur->setTokenMobilite($token);
        $em->persist($utilisateur);
        $em->flush();

        //tous les appareils actif sauf tablette
        $appareils = $em->getRepository(AgentAppareil::class)->getAppareilsWithoutTab($utilisateur);
        $utilisateur->setAppareils($appareils);
        $datasUtilisateur = Functions::getSerialisedEntities($utilisateur, $serializer, 'api');


        $listePlanification = $em->getRepository(Planning::class)->getPlanificationByAgent($utilisateur, true);
        $plannings = [];
        foreach ($listePlanification as $planning) {
            $intervention = $planning->getIntervention();
            if ($intervention) {
                $this->completeDataIntervention($intervention);
            }
            $plannings[$planning->getDate()->format('Y-m-d H:i:s')][] = $planning;
        }
        $datasPlannings = Functions::getSerialisedEntities($plannings, $serializer, 'api');
        return new JsonResponse(["utilisateur" => $datasUtilisateur,"interventions" => $datasPlannings], 201);

    }

    /**
     * @Route("/api/logout/{token_mobilite}")
     * @Entity("utilisateur", expr="repository.findOneBy({'token_mobilite': token_mobilite})")
     */
    public function logoutAction(?Utilisateur $utilisateur)
    {
        if (!$utilisateur) {
            return new JsonResponse(['message' => 'Utilisateur non trouvé'], JsonResponse::HTTP_NOT_FOUND);
        }
        $em = $this->getDoctrine()->getManager();

        $utilisateur->setTokenMobilite(null);
        $em->persist($utilisateur);
        $em->flush();

        return new JsonResponse(['message' => 'OK']);

    }


}