<?php
namespace App\Controller\APIIctus;
use App\Entity\Product;
use App\Entity\IctusPharmacie;
use App\Repository\UserRepository;
use App\Repository\ProductRepository;
use Doctrine\ORM\EntityManagerInterface;
use App\Repository\IctusHoraireRepository;
use Symfony\Contracts\Cache\ItemInterface;
use App\Services\ComparaisonProduitService;
use Knp\Component\Pager\PaginatorInterface;
use Symfony\Contracts\Cache\CacheInterface;
use App\Repository\IctusPharmacieRepository;
use App\Repository\StockpharmacieRepository;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\Routing\Annotation\Route;
use Symfony\Component\HttpFoundation\JsonResponse;
use Symfony\Component\HttpFoundation\RequestStack;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
/**
* @Route("/api/ictus-shop", name="app_ictus_shop_")
*/
class APIChopController extends AbstractController
{
private $session;
private $translator;
private $em;
private $ictusPcieRepo;
private $logitudePatient;
private $latitudePatient;
private $ville;
private $stockpharmacieRepository;
private $productRepository;
private $user = null;
private $mots_cles;
public function __construct(RequestStack $requestStack, EntityManagerInterface $em, IctusPharmacieRepository $ictusPcieRepo, StockpharmacieRepository $stockpharmacieRepository, ProductRepository $productRepository)
{
$this->session = $requestStack->getSession();
$this->em = $em;
$this->ictusPcieRepo = $ictusPcieRepo;
$this->logitudePatient = null;
$this->latitudePatient = null;
$this->ville = null;
$this->stockpharmacieRepository = $stockpharmacieRepository;
$this->productRepository = $productRepository;
}
/**
* @Route("/accueil", name="accueil", methods={"POST"})
*/
public function index(UserRepository $userRepo, Request $request): Response
{
$response = [
"erreur" => true,
"messagee"=> "Erreur lors de la recuperation des donnees"
];
$id_user = $request->get("id_user");
$patient = null;
if(!is_null($id_user) || $id_user != ""){
$patient = $userRepo->findOneById($id_user);
};
$villeId = "";
if (!is_null($patient)) {
if ($patient->getVille()) $villeId = $patient->getVille()->getId();
}
//GET pcie
$pcies = null;
if (!is_null($patient)) {
$this->latitudePatient = $patient->getLatitude();
$this->logitudePatient = $patient->getLogitude();
if ($patient->getVille()) $this->ville = $patient->getVille()->getId();
} elseif (!is_null($request->get('logitute')) && !is_null($request->get('latitude')))
{
$this->latitudePatient = $request->get('latitude');
$this->logitudePatient = $request->get('logitute');
}
$pcies = $this->ictusPcieRepo->findAllPcieByDistance($this->latitudePatient, $this->logitudePatient, $this->ville, 8);
//Fin get Pcie
$bestSellers = $this->stockpharmacieRepository->getBestSeller();
/*$newProducts = $cache->get('newProducts' . $villeId, function (ItemInterface $item) {
$item->expiresAfter(86400);
return $this->productRepository->findNewProduct();
});*/
$response = [
'pharmacies' => $pcies,
'bestSellers'=> $bestSellers
];
return new JsonResponse($response);
}
/**
* @Route("/pharmacies", name="pharmacies", methods={"POST"})
*/
public function getAllPharmacies(UserRepository $userRepo, Request $request): Response
{
$response = [
"erreur" => true,
"messagee"=> "Erreur lors de la recuperation des donnees"
];
$id_user = $request->get("id_user");
$patient = null;
if(!is_null($id_user) || $id_user != ""){
$patient = $userRepo->findOneById($id_user);
};
$villeId = "";
if (!is_null($patient)) {
if ($patient->getVille()) $villeId = $patient->getVille()->getId();
}
//GET pcie
$pcies = null;
if (!is_null($patient)) {
$this->latitudePatient = $patient->getLatitude();
$this->logitudePatient = $patient->getLogitude();
if ($patient->getVille()) $this->ville = $patient->getVille()->getId();
$pcies = $this->ictusPcieRepo->findAllPcieByDistance($this->latitudePatient, $this->logitudePatient, $this->ville, 100);
} elseif (!is_null($request->get('logitute')) && !is_null($request->get('latitude')))
{
$this->latitudePatient = $request->get('latitude');
$this->logitudePatient = $request->get('logitute');
$pcies = $this->ictusPcieRepo->findAllPcieByDistance($this->latitudePatient, $this->logitudePatient, $this->ville, 100);
}else{
$pcies = $this->ictusPcieRepo->findAllPcies();
}
if (!is_null($pcies)) {
$response = ["pharmacies"=> $pcies];
}
//Fin get Pcie
return new JsonResponse($response);
}
/**
* @Route("/produit-pharmacie/{id}", name="poduit_pcie", methods={"GET"})
*/
public function produitParPcie(
IctusPharmacie $ictusPharmacie,
StockpharmacieRepository $stockRepo,
Request $request,
IctusHoraireRepository $horaireRepo
): Response {
$offset = $request->get('offset'); // Offset par défaut à 0
$limit = $request->get('limit', 10); // Limit par défaut à 10
$response = [
'erreur' => true,
'message'=> "Erreur lors de la recuperation des donnees"
];
if (!is_null($ictusPharmacie)) {
$keyword = null;
if ($request->isMethod('POST')) {
if ($request->get('keyword') != '') {
$keyword = $request->get('keyword');
}
}
$produits = $stockRepo->findAllProductKnp($ictusPharmacie->getId(), $keyword, $limit, $offset);
if (count($produits)> 0) {
$response = [
'produit' => $produits
];
}
}
return new JsonResponse($response);
/*return $this->render('shop/produit_pharmacie.html.twig', [
'keyword' => $keyword,
'pharmacie' => $ictusPharmacie,
'produits' => $produits,
'horaireCheck' => $this->verifHorairePharmacieByTimeNow($ictusPharmacie, $horaireRepo),
'dayList' => [1 => "Lundi", 2 => "Mardi", 3 => "Mercredi", 4 => "Jeudi", 5 => "Vendredi", 6 => "Samedi", 7 => "Dimanche"],
]);*/
}
private function verifHorairePharmacieByTimeNow($ictusPharmacie, $horaireRepo)
{
$dateSemaine = ['Monday' => 1, 'Tuesday' => 2, 'Wednesday' => 3, 'Thursday' => 4, 'Friday' => 5, 'Saturday' => 6, 'Sunday' => 7];
$result['classHoraire'] = "";
$result['textHoraire'] = "";
$result['descHoraire'] = "";
if (count($ictusPharmacie->getIctusHoraires()) > 0) {
$jour = $dateSemaine[date("l", strtotime(date('Y-m-d')))];
$time = date('H:i:s');
$horaireNow = $horaireRepo->verifHoraireByTime($ictusPharmacie, $jour, $time);
if ($horaireNow) {
$heureDebut = new \DateTime($time);
$heureFin = new \DateTime($horaireNow[0]->getFin());
$diff = $heureDebut->diff($heureFin);
$result['classHoraire'] = "bg-success text-white";
$result['textHoraire'] = "Ouverte";
$result['descHoraire'] = "ferme dans " . $diff->format('%Hh %Imn');
} else {
$result['classHoraire'] = "bg-danger text-white";
$result['textHoraire'] = "Fermée";
$horaireOtherOwnDay = $horaireRepo->getOtherHoraireOwnDay($ictusPharmacie, $jour, $time);
if ($horaireOtherOwnDay) {
$heureDebut = new \DateTime($time);
$heureFin = new \DateTime($horaireOtherOwnDay[0]->getDebut());
$diff = $heureDebut->diff($heureFin);
$result['descHoraire'] = "ouvre dans " . $diff->format('%Hh %Imn');
} else {
$horaireOtherDay = $horaireRepo->getOtherHoraireNextDay($ictusPharmacie, $jour, $time);
if ($horaireOtherDay) {
$diffDay = (int)$horaireOtherDay[0]->getJour() - $jour;
$dateDebut = new \DateTime(date('Y-m-d H:i:s'));
$dateFin = new \DateTime(date('Y-m-d ' . $horaireOtherDay[0]->getDebut(), strtotime(' + ' . $diffDay . ' days')));
$diff = $dateDebut->diff($dateFin);
$delais = "";
if ((int)$diff->format('%d') == 0) {
$delais = $diff->format('%Hh %Imn');
} else {
$delais = $diff->format('%dj');
}
$result['descHoraire'] = "ouvre dans " . $delais;
} else {
$horaireDebusSemaine = $horaireRepo->getFirstHoraire($ictusPharmacie, $jour);
if ($horaireDebusSemaine) {
$diffDay = (int)$horaireDebusSemaine[0]->getJour() + (7 - $jour);
$dateDebut = new \DateTime(date('Y-m-d H:i:s'));
$dateFin = new \DateTime(date('Y-m-d ' . $horaireDebusSemaine[0]->getDebut(), strtotime(' + ' . $diffDay . ' days')));
$diff = $dateDebut->diff($dateFin);
$delais = "";
if ((int)$diff->format('%d') == 0) {
$delais = $diff->format('%Hh %Imn');
} else {
$delais = $diff->format('%dj');
}
$result['descHoraire'] = "ouvre dans " . $delais;
}
}
}
}
} else {
$result = null;
}
return $result;
}
/**
* @Route("/search", name="serch_produit", methods={"POST"})
*/
public function search(Request $request, ComparaisonProduitService $compService, CacheInterface $cache): Response
{
// Récupérer le filtre produit et l'offset depuis la requête
$filtreProduit = $request->get('filtre_produit');
$offset = $request->get('offset'); // Offset par défaut à 0
$limit = $request->get('limit', 10); // Limit par défaut à 10
// Vérifier si le filtre produit est valide
if (!$filtreProduit || !is_string($filtreProduit)) {
return new JsonResponse([
"erreur" => true,
"message" => "Le filtre du produit est invalide."
], Response::HTTP_BAD_REQUEST);
}
$produits_filtre = [];
$response = [
"erreur" => true,
"message" => "Erreur lors de la recherche."
];
try {
// Rechercher les produits si un filtre est présent
$this->mots_cles = $compService->getProduitByDesignation($filtreProduit);
$keyCache = str_replace(' ', '_', $this->mots_cles);
$keyCache = preg_replace('/[^A-Za-z0-9_]/', '', $keyCache);
$produits_filtre = $this->productRepository->findAllWithKeyWords(explode(" ", $this->mots_cles), $limit, $offset);
$response = [
"erreur" => false,
"produits" => $produits_filtre
];
} catch (\Exception $e) {
// Gérer les exceptions et retourner une réponse d'erreur
$response['message'] = $e->getMessage();
}
return new JsonResponse($response);
}
//Afficha pharmacie qui a dispo de produit cliquee
/**
* @Route("/produit-pcie-dispo/{id}", name="app_shop_produit_pcie_dispo", methods={"GET"})
*/
public function detailProduitAvecPcieDispo(
Product $produit,
StockpharmacieRepository $stockPcieRepo,
Request $request,
UserRepository $userRepo
) {
$logitudePatient = null;
$latitudePatient = null;
$ville = null;
$idUser = $request->query->get("id_user");
$latitudeUser = $request->query->get("latitude");
$longitudeUser = $request->query->get("longitude");
$patient = $userRepo->findOneById($idUser); // Patient connecté
if (!is_null($patient)) {
$latitudePatient = $patient->getLatitude();
$logitudePatient = $patient->getLogitude();
if ($patient->getVille()) {
$ville = $patient->getVille()->getId();
}
} elseif (!is_null($latitudeUser) && !is_null($longitudeUser)) {
$latitudePatient = $latitudeUser;
$logitudePatient = $longitudeUser;
}
$pcieSpecial = null;
$pcies = $stockPcieRepo->findAllPcieByDistance($produit->getId(), $latitudePatient, $logitudePatient, $ville);
if (count($pcies) == 0) {
$pcieSpecial = $stockPcieRepo->findAllPcieSpecialByDistance($latitudePatient, $logitudePatient, null, null);
}
if (!is_null($patient)) {
$pays = $patient->getPays();
$pcies = $stockPcieRepo->findAllPcieByDistance($produit->getId(), $latitudePatient, $logitudePatient, null, $pays);
}
$dispoGrossiste = null;
$stockGrossiste = $stockPcieRepo->findOneBy(["cip13" => $produit->getCip13()]);
if ($stockGrossiste) {
$dispoGrossiste = 1;
}
// Préparation des données pour JSON
$responseData = [
'timeNow' => date('H:i:s'),
'produit' => $produit,
'pharmacies' => $pcies,
'pharmaciesSpecial' => $pcieSpecial,
'dispoGrossiste' => $dispoGrossiste,
];
// Retourner une réponse JSON
return $this->json($responseData, 200, [], ['groups' => 'product:read']);
}
}