<?php

namespace App\Controller\Api;

use App\Entity\Devis;
use App\Entity\DevisLigne;
use App\Entity\DevisStatut;
use App\Entity\Produit;
use App\Entity\ProduitFactureAffectation;
use App\Entity\TauxTva;
use App\Entity\TypeDevise;
use App\Entity\TypeEnvoi;
use App\Entity\Intervention;
use App\Entity\Utilisateur;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\Routing\Annotation\Route;
use Symfony\Component\Security\Http\Event\InteractiveLoginEvent;
use Symfony\Component\Serializer\Encoder\JsonEncoder;
use Symfony\Component\Serializer\Normalizer\ObjectNormalizer;
use Symfony\Component\Serializer\Normalizer\AbstractObjectNormalizer;
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;
use DateTime;

/**
 * Class ApiDevisController
 *
 * @Route("/api/devis")
 */
class ApiDevisController extends ApiGlobalController
{
    /**
     * Création devis
     *
     * @Route("/create/{idIntervention}/{token_mobilite}", methods="POST", name="create")
     * @Entity("utilisateur", expr="repository.findOneBy({'token_mobilite': token_mobilite})")
     */
    public function createAction($idIntervention, ?Utilisateur $utilisateur, SerializerInterface $serializer, Request $request)
    {
        if (!$utilisateur) {
            return new JsonResponse(['message' => 'Utilisateur non trouvé'], JsonResponse::HTTP_NOT_FOUND);
        }

        $em = $this->getDoctrine()->getManager();
        $dataDevis = $serializer->deserialize($request->getContent(), Devis::class, 'json');

        $intervention = $em->getRepository(Intervention::class)->findOneById($idIntervention);
        if ($intervention == null || $intervention->getPlanning()->getUtilisateurAgent() != $utilisateur) { //existe et est pour ce tech
            return new JsonResponse(['message' => 'Intervention non trouvée'], 403);
        }


        //Devis
        $devisStatut = $em->getRepository(DevisStatut::class)->findOneById($dataDevis->getDevisStatut()->getId());
        $typeDevise = $em->getRepository(TypeDevise::class)->findOneById($dataDevis->getTypeDevise()->getId());
        $typeEnvoi = $em->getRepository(TypeEnvoi::class)->findOneById($dataDevis->getTypeEnvoi()->getId());

        //$date =  DateTime::createFromFormat('Y-m-d', new DateTime());
        $devis = new Devis();
        $devis
            ->setIntervention($intervention)
            ->setNumDevis('00000') //num devis substr('00000' . $id, -5) selon site table pour stocker le numéro en cours ?
            ->setDevisStatut($devisStatut)
            ->setMontantHt($dataDevis->getMontantHt())
            ->setMontantTtc($dataDevis->getMontantTtc())
            ->setDateEmission(new DateTime())
            ->setTypeDevise($typeDevise)
            ->setCliRefusSignature($dataDevis->getCliRefusSignature())
            ->setCommentaireRefusSignature($dataDevis->getCommentaireRefusSignature())
            ->setTypeEnvoi($typeEnvoi)
            ->setStack($request->getContent())
        ;

        //Lignes devis
        foreach($dataDevis->getDevisLignes() as $ligne){
            $produit = $em->getRepository(Produit::class)->findOneById($ligne->getProduit()->getId());
            $tauxTva = $em->getRepository(TauxTva::class)->findOneById($ligne->getTauxTva()->getId());
            $produitFactureAffectation = $em->getRepository(ProduitFactureAffectation::class)->findOneById($ligne->getProduitFactureAffectation()->getId());

            $devisLigne = new DevisLigne();
            $devisLigne
                ->setDevis($devis)
                ->setProduit($produit)
                ->setCodeArticle($produit->getCode())
                ->setDesignation($produit->getDesignation())
                ->setQuantite($ligne->getQuantite())
                ->setPuHt($ligne->getPuHt())
                ->setTauxTva($tauxTva)
                ->setRemise($ligne->getRemise())
                ->setPuTtc($ligne->getPuTtc())
                ->setPrixTotalTva($ligne->getPrixTotalTva())
                ->setPrixTotalTtc($ligne->getPrixTotalTtc())
                ->setProduitFactureAffectation($produitFactureAffectation)
                ->setMotifService($ligne->getMotifService())
            ;
            $devis->addDevisLigne($devisLigne);
        }
        //return num_devis

        $em->persist($devis);
        $em->flush();
        $datasDevis = Functions::getSerialisedEntities($devis, $serializer, 'api');
        return new JsonResponse($datasDevis, 201);

    }

    /**
     * Met à jour le status d'un devis
     * @Route("/update_status/{token_mobilite}", methods="POST", name="update_status_devis")
     * @Entity("utilisateur", expr="repository.findOneBy({'token_mobilite': token_mobilite})")
     */
    public function updateStatusAction(?Utilisateur $utilisateur, SerializerInterface $serializer, Request $request)
    {
        if (!$utilisateur) {
            return new JsonResponse(['message' => 'Utilisateur non trouvé'], JsonResponse::HTTP_NOT_FOUND);
        }

        $em = $this->getDoctrine()->getManager();
        $data = json_decode($request->getContent(), true);

        if (!isset($data['id']) || !isset($data['devisStatut']['id'])) {
            return new JsonResponse(['message' => 'Données invalides'], JsonResponse::HTTP_BAD_REQUEST);
        }
        $devis = $em->getRepository(Devis::class)->find($data['id']);
        if (!$devis) {
            return new JsonResponse(['message' => 'Devis non trouvé'], JsonResponse::HTTP_NOT_FOUND);
        }
        $nouveauStatut = $em->getRepository(DevisStatut::class)->find($data['devisStatut']['id']);
        if (!$nouveauStatut) {
            return new JsonResponse(['message' => 'Statut non trouvé'], JsonResponse::HTTP_NOT_FOUND);
        }

        $devis->setDevisStatut($nouveauStatut);
        $em->persist($devis);
        $em->flush();
        //génération devis si en attente ou validé
        return new JsonResponse(['message' => 'OK'], 201);
    }

}