<?php
namespace App\Controller;
use DateTime;
use App\Entity\User;
use App\Entity\Image;
use Twig\Environment;
use App\Entity\Magasin;
use App\Entity\Produit;
use App\Data\SearchData;
use App\Form\SearchForm;
use App\Data\ShopContext;
use App\Form\ProductType;
use App\Service\PictureService;
use Doctrine\ORM\EntityRepository;
use App\Entity\MaintenanceSchedule;
use App\Repository\ProduitRepository;
use Doctrine\ORM\EntityManagerInterface;
use Doctrine\Persistence\ManagerRegistry;
use App\Controller\ProduitVariantController;
use App\Repository\ProduitVariantRepository;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\Security\Core\Security;
use Symfony\Component\Translation\Translator;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\Security\Csrf\CsrfToken;
use Symfony\Component\Routing\Annotation\Route;
use App\Repository\MaintenanceScheduleRepository;
use Symfony\Component\Translation\LocaleSwitcher;
use Symfony\Component\HttpFoundation\JsonResponse;
use Symfony\Contracts\Translation\TranslatorInterface;
use Symfony\Component\HttpFoundation\Session\SessionInterface;
use Symfony\Component\Security\Csrf\CsrfTokenManagerInterface;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\DependencyInjection\ParameterBag\ParameterBagInterface;
class ProduitController extends AbstractController
{
private CsrfTokenManagerInterface $csrfTokenManager;
private $params;
private $shopContext;
public function __construct(CsrfTokenManagerInterface $csrfTokenManager,
ShopContext $shopContext)
{
$this->csrfTokenManager = $csrfTokenManager;
$this->shopContext = $shopContext;
}
public function validateCsrfToken($token): bool
{
return $this->csrfTokenManager->isTokenValid(new CsrfToken('my-form-promo', $token));
}
#[Route('/locale/{_locale}', name: 'app_locale')]
public function setLocale(Request $request,SessionInterface $session
,TranslatorInterface $translator,LocaleSwitcher $localeSwitcher ):Response
{
$locale = $request->get('_locale');
$currentLocale = $localeSwitcher->getLocale();
if($locale !=null){
$localeSwitcher->setLocale($locale);
$translator->setLocale($locale);
$request->getSession()->set('_locale',$locale);
}
// Rediriger vers la page précédente
// $referer = $request->headers->get('referer');
// return $this->redirect($referer);
$sessionlocal= $request->getSession()->get('_locale');
return $this->redirectToRoute("app_home",['_locale'=>$sessionlocal]);
}
// #[Route('/home', name: 'app_home')]
// #[Route('/{shopName}/home', name: 'app_home', requirements: ['shopName' => '.+'], defaults: ['shopName' => null])]
// #[Route('/{shopName}/home', name: 'app_home', requirements: ['shopName' => '.+'], defaults: ['shopName' => null])]
#[Route(path: ['/home/{shopName}', '/home'], name: 'app_home',
defaults: ['shopName' => null]
)]
public function index(ManagerRegistry $doctrine, Request $request
,?string $shopName
,Environment $twig,Security $security,SessionInterface $session
,TranslatorInterface $translator,LocaleSwitcher $localeSwitcher
,EntityManagerInterface $entityManager):Response
{
if ($request->getSession()->has('_locale')) {
$locale = $request->getSession()->get('_locale');
if($locale !=null){
$localeSwitcher->setLocale($locale);
$translator->setLocale($locale);
// $request->getSession()->set('_locale',$locale);
$request->getSession()->set('lang',$locale);
}
}
else {
//default lang
$request->getSession()->set('_locale','en');
$request->getSession()->set('lang','en');
$locale = 'en';
if($locale !=null){
$localeSwitcher->setLocale($locale);
$translator->setLocale($locale);
// $request->getSession()->set('_locale',$locale);
}
}
$session->set('srv_msg',null);
// shops context
// var_dump($shopName);
$shops = [];
if ($shopName) {
$slugs = explode(',', $shopName);
$shops = $entityManager->getRepository(Magasin::class)->findBy(['nom' => $slugs]);
// $shops = $shopRepo->findBy(['nom' => $slugs]);
// var_dump($shops);
if (!$shops) {
throw $this->createNotFoundException('Aucune boutique trouvée');
}
$this->shopContext->setShops($shops);
} else {
// $this->$shopContext->clear();
$this->shopContext->clear(); // ✅ correct
}
// shops context
//ajouter un test de maintenance en cours
$lastActive= $doctrine->getRepository(MaintenanceSchedule::class)
->findLastActiveSchedule();
// dd($lastActive);
if ($lastActive) {
// It's in progress
return $this->redirectToRoute("maintenance_index",['_locale'=>$locale,'lastActiveId'=>$lastActive->getId()]);
}
//ajouter un test de maintenance en cours
$data = new SearchData();
$form = $this->createForm(SearchForm::class, $data);
$form->handleRequest($request);
$data->categories = $request->query->get('categories');
$data->shops = $shops;
$data->promo = $request->query->get('promo');
$offset = max(0, $request->query->getInt('offset', 0));
$findProduitsNouveaute = [];
//to be changed to read user roles
$isAdmin = 0;
$user = $security->getUser();
if($user){
$roles = $user->getRoles();
// var_dump($roles);
if($roles[0] == "ROLE_ADMIN"){
$isAdmin=1;
}
}
else{
$isAdmin=0;
}
//is valid assoccier avec assert constraint
if($form->isSubmitted() && $form->isValid() ){
$produits = $doctrine->getRepository(Produit::class)->findSearch($data,$offset,$isAdmin);
$magasins = $doctrine->getRepository(Magasin::class)->findAll();
}else{
$category = $request->request->get('category', null);//for post
if($category !=null){
$data = new SearchData();
$categories = [$category];
$data->categories = $categories;
}
//vip default if no category chosen
else{
$findProduitsNouveaute = $doctrine->getRepository(Produit::class)
->findProduitsNouveaute($data,$offset,$isAdmin);
}
//produitsNouveaute
$produits = $doctrine->getRepository(Produit::class)->findSearch($data,$offset,$isAdmin);
// $magasins = $doctrine->getRepository(Magasin::class)->findAll();
$magasins = $doctrine->getRepository(Magasin::class)->findAll();
// var_dump(count($magasins));
}
return new Response($twig->render('produit/index.html.twig',[
'produits' => $produits,
'magasins' => $magasins,
'_locale' => $locale,
'produitsNouveaute' => $findProduitsNouveaute,
'form' => $form->createView(),
'previous' => $offset - ProduitRepository::PAGINATOR_PER_PAGE,
'next' => min(count($produits), $offset + ProduitRepository::PAGINATOR_PER_PAGE),
]));
}
//add edit product
#[Route('/produit/add', name: 'add_produit')]
#[Route('/produit/edit/{id}', name: 'edit_produit')]
public function new_edit(int $id =null ,Request $request,EntityManagerInterface $entityManager,Produit $produit = null,
PictureService $pictureService,ParameterBagInterface $params
,TranslatorInterface $translator,LocaleSwitcher $localeSwitcher ): Response
{
$this->denyAccessUnlessGranted('ROLE_ADMIN');
if ($id!=null){
$produit = $entityManager->getRepository(Produit::class)->find($id);
}
if (!$produit) {
$produit = new Produit();
$produitVariants = $produit->getProduitVariants();
$option = "add";
}
else{
$option = "edit";
}
// $category = $request->get('category');
// $category = $request->request->get('category');
// var_dump($category);die;
// creation d'un formulaire baser sur le $builder dans la class formationType
$form = $this->createForm(ProductType::class, $produit);
$form->handleRequest($request);
// isValid () remplace les filter input
if ($form->isSubmitted() && $form->isValid()) {
// recuperer les données
$produit = $form->getData();
// On récupère les images
$images = $form->get('images')->getData();
//var_dump("x1");
foreach($images as $image){
// On définit le dossier de destination
$folder = 'products';
// On appelle le service d'ajout
$fichier = $pictureService->add($image, $folder, 300, 300);
$img = new Image();
$img->setFileName($fichier);
// $params =new ParameterBagInterface();
$pictureService = new PictureService($params);
$img->setImageUrl($params->get('images_directory') . $folder);
$produit->addImage($img);
}
// var_dump($category);die;
// $produit->setCategory($category);
//prepare en pdo , on prepare a l'execution l'objet entreprise
$produit->setUser($this->getUser());
$produitVariants = $form->get('produitVariants')->getData();
foreach($produitVariants as $produitVariant){
$produitVariant->setProduit($produit);
$produit->addProduitVariant($produitVariant);
}
$date = new DateTime();
$produit->setPublishDate( $date);
try{
$entityManager->persist($produit);
}
catch (Exception $e) {
// Handle the exception
// You can log the error or show a flash message
// For example:
$this->addFlash('error', 'An error occurred while saving the entity.');
// var_dump("exception" + $exception);die;
}
// execute,inserer dans la bdd
// $entityManager->laragonflush();
$entityManager->flush();
// retourner a la page qui affiche toutes les formation
if ($option === 'edit') {
// Redirection vers la page du produit avec l'ID
return $this->redirectToRoute($option . '_produit', [
'id' => $produit->getId(),
]);
} else {
// Redirection vers la page d'index de la catégorie
return $this->redirectToRoute($option.'_produit');
//return $this->redirectToRoute('category_index');
}
}
if ($request->query->has('_locale')) {
$locale = $request->getSession()->get('_locale');
if($locale !=null){
$localeSwitcher->setLocale($locale);
$translator->setLocale($locale);
// $request->getSession()->set('_locale',$locale);
}
}
return $this->render('produit/add.html.twig', [
'formAddProduit' => $form->createView(),
'option' => $option
]);
}
// #[Route('/produit/all', name: 'all_product_filter', methods:'post')]
// public function getProducts(ProduitRepository $produitRepository): JsonResponse
// {
// // Fetch products from the database
// $products = $produitRepository->findAll();
// // Return products as JSON
// return $this->json($products);
// }
// #[Route('/produit/all', name: 'produit_all', methods: ['POST'])]
#[Route('/produits/ajax-filter', name: 'ajax_product_filter', methods: ['POST'])]
public function ajaxFilterProducts(Request $request,
CsrfTokenManagerInterface $csrfTokenManager,
ProduitRepository $produitRepository,ManagerRegistry $doctrine,
Environment $twig,Security $security,SessionInterface $session,
TranslatorInterface $translator,LocaleSwitcher $localeSwitcher): JsonResponse
{
// $filterData = $request->request->all(); // Exemple de récupération des données envoyées via POST
// dd($filterData);
// dd($filterData);
$csrfToken = $request->headers->get('X-CSRF-TOKEN');
// dd($csrfToken);
// if (!$this->isCsrfTokenValid('my-form', $csrfToken)) {
// // dd('not valid csrf');
// var_dump('ok');
// return new JsonResponse(['error' => 'Invalid CSRF token'], 400);
// }
// Validate CSRF token
// $csrfToken = $request->request->get('_csrf_token');
if (!$this->validateCsrfToken($csrfToken)) {
return new JsonResponse(['error' => 'Invalid CSRF token'], 400);
}
// else{
// return new JsonResponse(['valid' => 'okay CSRF token'], 400);
// }
// Exemple de réponse JSON
// return new JsonResponse([
// 'success' => true,
// 'message' => 'Données filtrées avec succès',
// 'data' => $filterData
// ]);
// return new JsonResponse(['message' => 'Data processed successfully']);
// return new JsonResponse(['success' => 'Data processed']);
$data = new SearchData();
$data->q = $request->request->get('q');
$data->categories = $request->request->get('categories');
$data->promo = $request->request->get('promo');
$data->min = $request->request->get('min');
$data->max = $request->request->get('max');
$data->dateproduction = $request->request->get('dateproduction');
$data->dateproduction = $request->request->get('dateexpiration');
$findProduitsPromo= [];
//to be changed to read user roles
$isAdmin = 0;
$user = $security->getUser();
if($user){
$roles = $user->getRoles();
// var_dump($roles);
if($roles[0] == "ROLE_ADMIN"){
$isAdmin=1;
}
}
else{
$isAdmin=0;
}
// Récupérer les données de filtrage envoyées via AJAX
// $filterData = $request->request->all();
//filterData
// Validate CSRF token
// $csrfToken = $request->request->get('_token');
// if (!$csrfTokenManager->isTokenValid(new CsrfToken('my-form', $csrfToken))) {
// return new JsonResponse(['error' => 'Invalid CSRF token'], 400);
// }
// dd("x");
// Exemple de filtrage : Utilisez les critères de filtrage depuis le repository
//Array $shops from context
// $shops = $this->shopContext->getShops();
// $data->shops = $shops;
// dd($shops[0]->getNom());
$products = $produitRepository->findSearchPromo($data,$isAdmin);
// Formatage des produits pour un retour JSON
$productData = [];
foreach ($products as $product) {
$productData[] = [
'id' => $product->getId(),
'name' => $product->getProductName(),
];
}
// var_dump($productData);
return new JsonResponse($productData);
}
//show products
#[Route('/produit/{id}', name: 'show_produit')]
public function show( string $id,EntityManagerInterface $entityManager
,TranslatorInterface $translator,LocaleSwitcher $localeSwitcher , Request $request): Response
{
//get list of product by category to be send to show page then to display list of product to be edited ...gestion stock
if ($id!=null){
$produit = $entityManager->getRepository(Produit::class)->find($id);
}
if (!$produit) {
throw $this->createNotFoundException('Product not found');
}
$locale = $request->getSession()->get('_locale');
if($locale !=null){
$localeSwitcher->setLocale($locale);
$translator->setLocale($locale);
}
//to get the avriants of product grouped by for better display
// Group the variants by size
$groupedVariantssize = [];
foreach ($produit->getProduitVariants() as $variant) {
$paramSize = $variant->getParamSize();
if ($paramSize !== null) {
$size = $paramSize->getSizeAbreviation();
if ($size !== null) {
$groupedVariantssize[$size][] = $variant;
}
}
}
$groupedVariantscolor = [];
foreach ($produit->getProduitVariants() as $variant) {
$paramColor = $variant->getParamColor();
if ($paramColor !== null) {
$color = $paramColor->getColorName();
if ($color !== null) {
$groupedVariantscolor[$color][] = $variant;
}
}
}
$variantsArray = [];
foreach ($produit->getProduitVariants() as $variant) {
// Vérifier si la couleur existe déjà dans le tableau
if (($variant !== null && $variant->getParamColor() !== null) ) {
// Si la couleur n'existe pas, on crée un nouveau tableau pour les tailles
if ($variant->getParamColor() !== null) {
$variantsArray[$variant->getParamColor()->getColorName()] = [];
}
}
// Ajouter la taille au tableau des tailles de la couleur
if ($variant !== null && $variant->getParamSize() !== null) {
$variantsArray[$variant->getParamColor()->getColorName()][] = $variant->getParamSize()->getSizeAbreviation();
}
}
return $this->render('produit/show.html.twig', [
'produit' => $produit,
'groupedVariantscolor' => $groupedVariantscolor,
'groupedVariantssize' => $groupedVariantssize,
'variants' =>$variantsArray
]);
//old before variants
// return $this->render('produit/show.html.twig', [
// 'produit' => $produit
// ]);
}
}