<?php
namespace App\Controller;
use App\Entity\Produit;
use App\Entity\Commande;
use App\Entity\ProduitVariant;
use App\Service\PanierService;
use App\Entity\CommandeDetails;
use App\Repository\ProduitRepository;
use Doctrine\ORM\EntityManagerInterface;
use App\Repository\ProduitVariantRepository;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\HttpFoundation\JsonResponse;
use Symfony\Component\Routing\Annotation\Route;
use Symfony\Component\Translation\LocaleSwitcher;
use Symfony\Contracts\Translation\TranslatorInterface;
use Symfony\Component\HttpFoundation\Session\SessionInterface;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
class PanierController extends AbstractController
{
public $panierService;
public function __construct(PanierService $panierService)
{
$this->panierService = $panierService;
}
#[Route('/panier', name: 'app_panier')]
public function index(SessionInterface $session, ProduitRepository $productrepository,
ProduitVariantRepository $productVariantRepository
,TranslatorInterface $translator,LocaleSwitcher $localeSwitcher,Request $request ): Response
{
if ($request->query->has('_locale')) {
$locale = $request->getSession()->get('_locale');
if($locale != null){
$localeSwitcher->setLocale($locale);
$translator->setLocale($locale);
}
}
$panier = $session->get('panier',[]);
$panierWithData = [];
foreach($panier as $pan){
$productVariant = new ProduitVariant();
if ($pan["idVariante"] != 'notdefined'){
$productVariant = $productVariantRepository->find($pan["idVariante"]);
}
$panierWithData[] = [
'product' => $productrepository->find($pan["id"]),
'productVariant' => $productVariant,
'quantity' => $pan["qtt"]
];
}
$frais = 5;
$total = 0;
foreach($panierWithData as $item){
$totalItem = $item['product']->getSalePrice() * $item['quantity'];
$total += $totalItem;
}
$total += $frais;
return $this->render('panier/index.html.twig', [
'items' => $panierWithData,
'frais' => $frais,
'total' => $total
]);
}
#[Route('/panier/add/{id}/{idVariante}/{option}', name: 'panier_add')]
public function add($id, $idVariante, $option, SessionInterface $session, Request $request,
EntityManagerInterface $entityManager, TranslatorInterface $translator,
LocaleSwitcher $localeSwitcher): Response
{
if (empty($idVariante)) { $idVariante = 'notdefined'; }
if (!isset($idVariante)) { $idVariante = 'notdefined'; }
if ($request->query->has('_locale')) {
$locale = $request->getSession()->get('_locale');
if($locale != null){
$localeSwitcher->setLocale($locale);
$translator->setLocale($locale);
}
}
// ── Check if AJAX request ──
$isAjax = $request->isXmlHttpRequest()
|| $request->headers->get('X-Requested-With') === 'XMLHttpRequest'
|| $request->headers->get('Accept') === 'application/json';
$srv_msg = [];
$panier = $session->get('panier', []);
$qtt = $request->request->get('qttprdid') ?? 1;
$size = $request->request->get('chosenSize');
$color = $request->request->get('chosenColor');
if ($id != null){
$produit = $entityManager->getRepository(Produit::class)->find($id);
$stock = $produit->getQtt();
if($stock !== null && $stock < $qtt){
$srv_msg = ["data" => "Available Qty $stock"];
$session->set('srv_msg', $srv_msg["data"]);
if ($isAjax) {
return new JsonResponse(['success' => false, 'message' => "Only $stock available"], 400);
}
return $this->redirectToRoute("show_produit", ['id' => $id]);
}
if ($idVariante == 'notdefined'){
if($size != null || $color != null){
$variant = $entityManager->getRepository(ProduitVariant::class)
->findProductByColorAndSizeAndProductId($id, $color, $size);
if ($variant != null){
$idVariante = $variant->getId();
$stock = $variant->getQtt();
} else {
$stock = 0;
}
}
} else {
$variant = $entityManager->getRepository(ProduitVariant::class)->find($idVariante);
if ($variant != null){
$stock = $variant->getQtt();
} else {
$stock = 0;
}
}
if($stock !== null && $stock < $qtt){
$srv_msg = ["data" => "Available Qty $stock"];
$session->set('srv_msg', $srv_msg["data"]);
if ($isAjax) {
return new JsonResponse(['success' => false, 'message' => "Only $stock available"], 400);
}
return $this->redirectToRoute("show_produit", ['id' => $id]);
}
}
if(count($panier) == 0){
$session->set('duration', 240);
$session->set('start_time', date("Y-m-d H:i:s"));
$end_time = date('Y-m-d H:i:s',
strtotime('+' . $session->get('duration') . 'minutes',
strtotime($session->get('start_time'))));
$session->set('end_time', $end_time);
}
try {
$panier = $session->get('panier', []);
if ($this->panierService->produit_existe_dans_panier($panier, $id, $idVariante)) {
$this->panierService->modifierQuantite($session, $id, $idVariante, $qtt);
} else {
$this->panierService->ajouterAuPanier($session, $id, $idVariante, $qtt);
}
// ── Return JSON for AJAX calls ──
if ($isAjax) {
// Calculate new cart count
$newPanier = $session->get('panier', []);
$count = array_sum(array_column($newPanier, 'qtt'));
return new JsonResponse(['success' => true, 'cartCount' => $count]);
}
if ($option == "done"){
return $this->redirectToRoute("app_panier");
}
} catch(\Exception $e) {
if ($isAjax) {
return new JsonResponse(['success' => false, 'message' => 'Error'], 500);
}
return $this->redirectToRoute("app_home");
}
return $this->redirectToRoute("app_home");
}
#[Route('/panier/remove/{id}/{idVariante}', name: 'panier_remove')]
public function remove($id, $idVariante, SessionInterface $session, Request $request): Response
{
$key = $id . '-' . $idVariante;
$isAjax = $request->isXmlHttpRequest()
|| $request->headers->get('X-Requested-With') === 'XMLHttpRequest';
try {
$this->panierService->supprimerItem($key, $session);
} catch(\Exception $e) {}
if ($isAjax) {
$newPanier = $session->get('panier', []);
$count = array_sum(array_column($newPanier, 'qtt'));
return new JsonResponse(['success' => true, 'cartCount' => $count]);
}
return $this->redirectToRoute("app_panier");
}
#[Route('/panier/minus/{id}/{idVariante}/{option}', name: 'panier_minus')]
public function minus($id, $idVariante, $option, SessionInterface $session, Request $request): Response
{
if (empty($idVariante)) { $idVariante = 'notdefined'; }
if (!isset($idVariante)) { $idVariante = 'notdefined'; }
$isAjax = $request->isXmlHttpRequest()
|| $request->headers->get('X-Requested-With') === 'XMLHttpRequest';
try {
$this->panierService->supprimerDuPanier($session, $id, $idVariante);
} catch(\Exception $e) {}
if ($isAjax) {
$newPanier = $session->get('panier', []);
$count = array_sum(array_column($newPanier, 'qtt'));
return new JsonResponse(['success' => true, 'cartCount' => $count]);
}
return $this->redirectToRoute("app_panier");
}
}