<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace App\Controller\Admin;

use App\Entity\Contrat;
use App\Entity\ContratPlage;
use App\Entity\ContratTarif;
use App\Entity\ContratType;
use App\Entity\Equipement;
use App\Entity\EquipementFamille;
use App\Entity\EquipementOption;
use App\Entity\EquipementPuissance;
use App\Entity\EquipementType;
use App\Entity\EquipementTypeFamille;
use App\Entity\EquipementTypePuissance;
use App\Entity\Option;
use App\Entity\OptionTarif;
use App\Entity\Produit;
use App\Entity\ProduitPrestationTarif;
use App\Entity\SecteurTarif;
use App\Entity\SecteurZone;
use App\Entity\TauxTva;
use App\Entity\TypeSav;
use App\Utils\Functions;
use DateTime;
use Sensio\Bundle\FrameworkExtraBundle\Configuration\IsGranted;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\Routing\Annotation\Route;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\JsonResponse;

/**
 * @Route("/contrat")
 * @IsGranted("ROLE_USER")
 *
 */
class ContratController extends ParentAdminController
{
    /**
     * @Route("/groupe/{id}", methods="DELETE", name="delete_contrat_groupe")
     */
    public function deleteContratGroupe(Contrat $contrat, Request $request) {
        $em = $this->getDoctrine()->getManager();
        $contratsGroupe = $em->getRepository(Contrat::class)->getContratsByGroupe($contrat->getGroupe());
        $countContratGroupe = count($contratsGroupe);
        $coefficient = null;
        if ($countContratGroupe == 2) {
            foreach ($contratsGroupe as $contratg) {
                //$coefficient = $contratg->getCoefficient() ? $contratg->getCoefficient() : 1;
               // $contratg->setCoefficient($coefficient + 0.05);
                $contratg->setGroupe(0);
             //   $contratg->setDateResiliationGroupe(new \DateTime());
                $em->persist($contratg);
            }
        }
        else if ($countContratGroupe < 5){
            //$coefficient = $contrat->getCoefficient() ? $contrat->getCoefficient() : 1;
           // $contrat->setCoefficient($coefficient + 0.05);
            $contrat->setGroupe(0);
            //$contrat->setDateResiliationGroupe(new \DateTime());
            $em->persist($contrat);
        }
        //si on en a 5 on rajoute +0.10 à l'actuel et on ajouter +0.05 au autres
        else if ($countContratGroupe >= 5){
            $contrat->setGroupe(0);
           // $contrat->setDateResiliationGroupe(new \DateTime());
            //$coefficient = $contrat->getCoefficient() ? $contrat->getCoefficient() : 1;
           // $contrat->setCoefficient($coefficient + 0.10);
            $em->persist($contrat);
            if ($countContratGroupe == 5) {
                foreach ($contratsGroupe as $contratg) {
                    if ($contratg->getId() != $contrat->getId()) {
                      //  $coefficient = $contratg->getCoefficient() ? $contratg->getCoefficient() : 1;
                     //   $contratg->setCoefficient($coefficient + 0.05);
                        $em->persist($contratg);
                    }
                }
            }
        }

        $em->flush();

        return new JsonResponse(['messages' => ['success' => ["Suppression effectuée avec succès"]]], Response::HTTP_OK);
    }

    /**
     * @Route("/search/{id}", methods="POST", name="search_contrat")
     */
    public function searchContrat(Contrat $contrat, Request $request) {

        $contrats = null;
        $datas = $request->request->all();

        foreach($datas as $key => $value) {
            $datas[$key] = Functions::clearData($value);
        }

        if (isset($datas['nom']) || isset($datas['prenom']) || isset($datas['equipement']) || isset($datas['adresse']) || isset($datas['code_postal']) || isset($datas['ville']) || isset($datas['groupe'])) {
            $contrats = $this->getDoctrine()->getRepository(Contrat::class)->searchContrats($datas,$contrat->getGroupe());
        }

        $html = $this->renderView('clients/_search_contrat_result.html.twig', [
            'contrats' => $contrats,
            'idContrat' => $contrat->getId(),
        ]);

        return new JsonResponse(['html' => $html], Response::HTTP_OK);
    }

    /**
     * @Route("/add/contrat_groupe/{id}", methods="POST", name="add_contrat_groupe")
     */
    public function AddContratGroupe(Contrat $contrat, Request $request) {
        $em = $this->getDoctrine()->getManager();
        $message_error = '';
        $addGroupe = false;
        if ($idContrat = $request->request->get('contrat-group-select')) {
            $contratAdd = $this->getDoctrine()->getRepository(Contrat::class)->find($idContrat);
            //on test si le groupe actuel ou le nouveau ont déjà un groupe pour le selectionner
            if (!$contratAdd->getGroupe() && $contrat->getGroupe()) {
                $contratAdd->setGroupe($contrat->getGroupe());
                $em->persist($contratAdd);
                $em->flush();
                $addGroupe = true;
            } else if (!$contrat->getGroupe() && $contratAdd->getGroupe()) {
                $contrat->setGroupe($contratAdd->getGroupe());
                $em->persist($contrat);
                $em->flush();
                $addGroupe = true;
            } else if (!$contrat->getGroupe() && !$contratAdd->getGroupe()) {
                $gapGroupe = $em->getRepository(Contrat::class)->getGapGroupe();
                if (!isset($gapGroupe[0])) {
                    $newGroupe = $em->getRepository(Contrat::class)->getNewGroupe();
                    $newGroupe = $newGroupe[0] + 1;
                } else
                    $newGroupe = $gapGroupe[0]['idgroupe'];

                $contratAdd->setGroupe($newGroupe);
                $contrat->setGroupe($newGroupe);
                $em->persist($contratAdd);
                $em->persist($contrat);
                $em->flush();
                $addGroupe = true;
            } else {
                $message_error = 'Le contrat du client N°'.$contratAdd->getClient()->getNumeroClient() . ' possède déjà un groupe';
            }
        }
        $contratsGroupe = $em->getRepository(Contrat::class)->getContratsByGroupe($contrat->getGroupe());
        $coefficient = null;
        if ($addGroupe) {
            $countContratsGroupe = count($contratsGroupe);
            //nouveau Groupe donc mettre à jour coefficient et tarif des deux
            /*if ($countContratsGroupe == 2) {
                foreach ($contratsGroupe as $contratGroupe) {
                    $coefficient = $contratGroupe->getCoefficient() ? $contratGroupe->getCoefficient() : 1;
                    $contratGroupe->setCoefficient($coefficient - 0.05);
                    $em->persist($contratGroupe);
                }
            }
            //Ajout dans un groupe existant donc que son tarif à mettre à jour
            else if ($countContratsGroupe < 5) {
                $coefficient = $contratAdd->getCoefficient() ? $contratAdd->getCoefficient() : 1;
                $contratAdd->setCoefficient($coefficient - 0.05);
                $em->persist($contratAdd);
            }
            //on met à jour tout le monde pour ajouter 5% de réduc + 10 % pour celui qu'on vient d'ajouter
            else if ($countContratsGroupe == 5) {
                $contratAdd->setCoefficient($contratAdd->getCoefficient() - 0.10);
                foreach ($contratsGroupe as $contratGroupe) {
                    if ($contratGroupe->getId() != $contratAdd->getId()) {
                        $coefficient = $contratGroupe->getCoefficient() ? $contratGroupe->getCoefficient() : 1;
                        $contratGroupe->setCoefficient($coefficient - 0.05);
                        $em->persist($contratGroupe);
                    }
                }
            }
            //on met 10 % de reduc sur le nouvel arrivant
            else if($countContratsGroupe >5) {
                $coefficient = $contratAdd->getCoefficient() ? $contratAdd->getCoefficient() : 1;
                $contratAdd->setCoefficient($coefficient - 0.10);
                $em->persist($contratAdd);
            }*/
        }
        $em->flush();
        //on met à jour le tarif
        $html = $this->renderView('clients/contrat/_contrats_groupe.html.twig', [
            'contratsGroupe' => $contratsGroupe,
            'idContrat' => $idContrat,
            'message_error' => $message_error
        ]);

        $js_return="";
        foreach($contratsGroupe as $contrat) {
            $js_return .= "$('#contrat-group-select option[value=".$contrat->getId()."]').remove();";
        }


        return new JsonResponse(['html' => $html, 'js_return' => $js_return], Response::HTTP_OK);
    }

    /**
     * @Route("/simulateur/{id}", methods="POST", name="contrat_simulateur")
     */
    public function simuleContrat(Equipement $equipement, Request $request) {
        $em = $this->getDoctrine()->getManager();
        $form_error = [];

        $famillesEquipement = $this->getDoctrine()->getRepository(EquipementFamille::class)->findAll();
        $tauxTva = $this->getDoctrine()->getRepository(TauxTva::class)->findAll();
        usort($tauxTva, function ($a, $b) {
            return $a->getTaux() <=> $b->getTaux();
        });

        $now = new DateTime();
        $interval = null;
        $optionsTarif = [];

        $datas_simulateur = [
            'equipement' => $equipement,
            'famillesEquipement' => $famillesEquipement,
        ];
        $datas_simulateur['simulateur_tauxTva'] = $tauxTva;

        $datas = $request->request->all();

        foreach($datas as $key => $value) {
            $datas_simulateur[$key] = (!is_array($value)) ? Functions::clearData($value) : $value;
        }

        //sur le changement de famille on recalcule les types
        if ($datas['simulateur_data_change'] == 'simulateur_famille_equipement') {
            $datas_simulateur['simulateur_equipement_type'] = "";
            $datas_simulateur['simulateur_equipement_puissance'] = "";
            $datas_simulateur['simulateur_list_puissances'] = "";
            $datas_simulateur['list_options'] = "";
            $datas_simulateur['simulateur_options_equipement'] = [];
        }
        //sur changement num serie et date allumage on recalcule l'age
        if ($datas['simulateur_data_change'] == 'simulateur_num_serie') {
            if (strlen($num_serie = $datas['simulateur_num_serie']) == 14) {
                $year = substr($num_serie, 0 ,2);
                $week = substr($num_serie,2,2);
                if ($year > $now->format('y')) $year = '19' . $year;
                else $year = '20'.$year;

                $date = (new DateTime())->setISODate($year, $week);
                $interval = $date->diff($now);
                $datas_simulateur['simulateur_age'] = ($interval != null && $interval->y != 0) ? $interval->y : 1;
            }
        }
        if ($datas['simulateur_data_change'] == 'simulateur_date_premier_allumage') {
            if ($datas['simulateur_date_premier_allumage'] != '') {
                $date_allumage =  DateTime::createFromFormat('d/m/Y', $datas['simulateur_date_premier_allumage']);
                $interval = $date_allumage->diff($now);
                $datas_simulateur['simulateur_age'] = ($interval != null && $interval->y != 0) ? $interval->y : 1;
            }
        }

        if ($datas['simulateur_data_change'] == 'simulateur_equipement_type') {
            if ($datas['simulateur_equipement_type'] != '') {
                $datas_simulateur['simulateur_options_equipement'] = [];
                $datas_simulateur['simulateur_equipement_puissance'] = "";
            }
        }

        if ($datas['simulateur_supplement'] == 'oui') {
                if ($secteur = $equipement->getSecteur()) {
                    $secteurZone = $em->getRepository(SecteurZone::class)->findOneBy(['libelle' => 'ZUD']);
                    // if ($secteur->getSecteurZone() == $secteurZone) {
                    $produitDepl = $em->getRepository(Produit::class)->find(Produit::ID_PRODUIT_DEPL);
                    $secteurTarifDeplacement = $em->getRepository(SecteurTarif::class)->findOneBy([
                        'produit' => $produitDepl,
                        'secteur_zone' => $secteurZone,
                        'date_fin' => null,
                    ]);

                    $produitSupp = $em->getRepository(Produit::class)->find(Produit::ID_PRODUIT_SUPP);
                    $secteurTarifSupp = $em->getRepository(SecteurTarif::class)->findOneBy([
                        'produit' => $produitSupp,
                        'secteur_zone' => $secteurZone,
                        'date_fin' => null,
                    ]);

                    if ($secteurTarifDeplacement) $datas_simulateur['supplement_deplacement'] = $secteurTarifDeplacement->getTarifHtDeplacement();
                }
        } else {
            $datas_simulateur['supplement_deplacement'] = 0;
        }

        //sur  changement age, on recalcule les types de contrats possibles
//        if ($datas_simulateur['simulateur_age'] != '') {
//            $old_age =  $equipement->getAge();
//            $new_age = $datas_simulateur['simulateur_age'];
//            $contrat = $equipement->getLastContrat();
//            $gt = false;
//            $mod = false;
//            //gt ok
//            if ($new_age > 2 && $new_age < 8 || ($new_age > 7 && $new_age < 21 && (!$contrat || stripos($contrat->getContratType()->getLibelleCourt(), 'GT') !== false))) {
//                $gt = true;
//            }
//            if ($new_age > 5 && $new_age < 26) {
//                $mod = true;
//            }
//            if ($gt && $mod) {
//                $datas_simulateur['simulateur_list_contrat_types'] = $em->getRepository(ContratType::class)->findAll();
//            } else if ($gt && !$mod) {
//                $datas_simulateur['simulateur_list_contrat_types'] = $em->getRepository(ContratType::class)->getGT();
//            } else if ($mod && !$gt) {
//                $datas_simulateur['simulateur_list_contrat_types'] = $em->getRepository(ContratType::class)->getMOD();
//            }
//            if ($new_age > 25) $datas_simulateur['simulateur_list_contrat_types'] ='';
//            //on recupère toutes les autres listes
//        }

        if ($datas['simulateur_equipement_type'] != '') {
            $datas_simulateur['list_options'] = $em->getRepository(Option::class)->getOptionsByType($datas['simulateur_equipement_type']);
            $datas_simulateur['simulateur_list_puissances'] = $em->getRepository(EquipementPuissance::class)->getPuissancesByType($datas['simulateur_equipement_type']);
        }
        if ($datas['simulateur_famille_equipement'] !='') {
            $datas_simulateur['simulateur_list_types'] = $em->getRepository(EquipementType::class)->getTypeByFamille($datas['simulateur_famille_equipement']);
        }
        if (!isset($datas_simulateur['simulateur_list_puissances'])) $datas_simulateur['simulateur_list_puissances'] = $em->getRepository(EquipementPuissance::class)->findAll();
        if (!isset($datas_simulateur['simulateur_list_contrat_types'])) $datas_simulateur['simulateur_list_contrat_types'] = $em->getRepository(ContratType::class)->findAll();
        if (!isset($datas_simulateur['simulateur_list_types'])) $datas_simulateur['simulateur_list_types'] = $em->getRepository(EquipementType::class)->findAll();
        if (!isset($datas_simulateur['list_options'])) $datas_simulateur['list_options'] = $em->getRepository(Option::class)->findAll();

        $mainOeuvreTarif = $this->getDoctrine()->getRepository(ProduitPrestationTarif::class)->findOneBy(['produit' => Produit::ID_PRODUIT_MO]);

        if ( $equipement->getSecteur())
            $deplacementTarif = $this->getDoctrine()->getRepository(SecteurTarif::class)->findOneBy(['produit' => Produit::ID_PRODUIT_DEPL, 'secteur_zone' => $equipement->getSecteur()->getSecteurZone()]);

        $datas_simulateur['deplacement_tarif'] = $deplacementTarif;
        $datas_simulateur['main_oeuvre_tarif'] = $mainOeuvreTarif;
        $datas_simulateur['simulateur_coefficient'] = str_replace('%','',$datas_simulateur['simulateur_coefficient']);
        //on calculer le tarif à ce moment la
        if ($datas['simulateur_data_change'] == "submit") {
            $total = 0;
            if (!$datas['simulateur_equipement_type']) $form_error[] = 'simulateur_equipement_type';
            if (!$datas['simulateur_equipement_puissance']) $form_error[] = 'simulateur_equipement_puissance';
            if (!$datas['simulateur_age']) $form_error[] = 'simulateur_age';
            if (!$datas['simulateur_contrat_type']) $form_error[] = 'simulateur_contrat_type';
            if (!$datas['simulateur_famille_equipement']) $form_error[] = 'simulateur_famille_equipement';
            if (!$datas['simulateur_coefficient']) $form_error[] = 'simulateur_coefficient';
            if (!$datas['simulateur_equipement_tva']) $form_error[] = 'simulateur_equipement_tva';

            if (empty($form_error)) {
                $equipementType = $em->getRepository(EquipementType::class)->find($datas['simulateur_equipement_type']);
                $equipementPuissance = $em->getRepository(EquipementPuissance::class)->find($datas['simulateur_equipement_puissance']);
                $equipementTypePuissance = $em->getRepository(EquipementTypePuissance::class)->findOneBy(['equipement_type' => $equipementType, 'equipement_puissance' => $equipementPuissance]);
                $contratType = $em->getRepository(ContratType::class)->find($datas['simulateur_contrat_type']);
                $contratPlage = (stripos($contratType->getLibelleCourt(), 'MOD') === false ) ? $em->getRepository(ContratPlage::class)->findByAge((int)$datas['simulateur_age']) : null;
                $tauxTva = $em->getRepository(TauxTva::class)->find((int)$datas['simulateur_equipement_tva']);

                $contratTarif = $em->getRepository(ContratTarif::class)->findOneBy([
                    'contrat_type' => $contratType,
                    'contrat_plage' => $contratPlage,
                    'equipement_type_puissance' => $equipementTypePuissance,
                    'date_fin' => null
                ]);

                if ($contratTarif) $total += $contratTarif->getTarifContratHt();
                //calcul ZUD
                if ($datas['simulateur_supplement'] == 'oui' && $secteurTarifSupp)
                    $total += $secteurTarifSupp->getTarifHtDeplacement();

                //Ajouter OPTION tarif
                if (isset($datas['simulateur_options_equipement'])) {
                    foreach ($datas['simulateur_options_equipement'] as $idoption) {
                        $option = $em->getRepository(Option::class)->find($idoption);
                        $optionTarif = $em->getRepository(OptionTarif::class)->findOneBy([
                            'option' => $option,
                            'contrat_type' => $contratType,
                            'contrat_plage' => $contratPlage,
                            'equipement_type' => $equipementType,
                            'date_fin' => null,
                        ]);

                        if ($optionTarif) {
                            $optionsTarif[$option->getId()] = $optionTarif->getTarifHt();
                            $total += $optionTarif->getTarifHt();
                        }
                    }
                } else {
                    $datas_simulateur['simulateur_options_equipement'] = [];
                }
                if ($datas_simulateur['simulateur_coefficient'] > 0) {
                    $total -= ($total * $datas_simulateur['simulateur_coefficient']) / 100;
                }
                $total += round(($total * $tauxTva->getTaux()) / 100, 2);
                $total = round($total,2);

                $datas_simulateur['simulateur_tarif_contrat'] = $total;
                $datas_simulateur['options_tarif'] = $optionsTarif;
            }


        }
        $datas_simulateur['form_error'] = $form_error;
        $html = $this->renderView('clients/contrat/_popup_simulateur_tarifs_content.html.twig', $datas_simulateur);

        return new JsonResponse(['html' => $html], Response::HTTP_OK);
    }

    /**
     * @Route("/get-options-by-type", methods="POST", name="contrat_get_options_by_type")
     */
    public function getOptionsByType(Request $request) {
        $em = $this->getDoctrine()->getManager();
        $equipementTypeId = $request->request->get('equipement_type_id');
        
        if (!$equipementTypeId) {
            return new JsonResponse(['error' => 'Type d\'équipement non spécifié'], Response::HTTP_BAD_REQUEST);
        }

        try {
            $options = $em->getRepository(Option::class)->getOptionsByType($equipementTypeId);
            
            // Formater les options pour le retour JSON
            $formattedOptions = [];
            foreach ($options as $option) {
                $formattedOptions[] = [
                    'id' => $option->getId(),
                    'libelle' => $option->getLibelleLong(),
                    'libelle_court' => $option->getLibelleCourt(),
                    'tarif_ht' => '0' // Vous pouvez ajouter la logique pour récupérer le tarif si nécessaire
                ];
            }
            
            return new JsonResponse(['options' => $formattedOptions], Response::HTTP_OK);
        } catch (\Exception $e) {
            return new JsonResponse(['error' => 'Erreur lors de la récupération des options'], Response::HTTP_INTERNAL_SERVER_ERROR);
        }
    }
}