<?php
namespace App\Controller;
use App\Entity\Product;
use App\Form\ProductAddChoixType;
use App\Form\ProductNameChoiceType;
use App\Form\ProductNameType;
use App\Form\ProductType;
use App\Form\ProductUpdateType;
use App\Services\ApiChatGptService;
use App\Services\ApiService;
use Sensio\Bundle\FrameworkExtraBundle\Configuration\IsGranted;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\DependencyInjection\ParameterBag\ParameterBagInterface;
use Symfony\Component\Filesystem\Filesystem;
use Symfony\Component\HttpFoundation\File\UploadedFile;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\Routing\Annotation\Route;
use Symfony\Component\Routing\Generator\UrlGeneratorInterface;
class ProductController extends AbstractController
{
/**
* ce script définit une classe qui a trois propriétés injectées par dépendance via son constructeur
* : $params, $router et $api_service.
*/
private $params;
private $router;
private $api_service;
private $api_chatgtp_service;
/**
* $params est une instance de ParameterBagInterface qui permet d'accéder aux paramètres définis dans les fichiers de configuration de l'application.
* $router est une instance de UrlGeneratorInterface qui permet de générer des URLs pour les routes de l'application.
* $api_service est une instance de ApiService qui est une classe définie dans l'application et qui fournit des fonctionnalités pour communiquer avec une API WIZIHOP.
* $api_service est une instance de Api qui est une classe définie dans l'application et qui fournit des fonctionnalités pour communiquer avec une API CHAT GTP.
*/
public function __construct(ParameterBagInterface $params, UrlGeneratorInterface $router, ApiService $api_service, ApiChatGptService $api_chatgtp_service)
{
$this->params = $params;
$this->router = $router;
$this->api_service = $api_service;
$this->api_chatgtp_service = $api_chatgtp_service;
}
#[Route('/', name: 'app_product')]
#[IsGranted("ROLE_ADMIN")]
public function addproduct(Request $request)
{
$product = new Product();
$form = $this->createForm(ProductNameType::class, $product, ['info' => 'add_product']);
$form->handleRequest($request);
if ($form->isSubmitted() && $form->isValid()) {
$product_name = $request->request->get('product_name')['name'];
$product = new Product();
$product->setName($product_name);
$form = $this->createForm(ProductAddChoixType::class, $product, [
'action' => $this->router->generate('app_validate_product'),
'method' => 'POST',
]);
return $this->render('product/add_product_choix.html.twig', [
'form' => $form->createView(),
]);
/*$parameterValue = $this->params->get('is_api_key_chatgpt');
$product_notes = $request->request->get('product_name')['notes'];
$product_full=$product_name." ".$product_notes;
$product = $this->api_chatgtp_service->createContenuProduct($product_name,$product_full,$id=null);
$form = $this->createForm(ProductType::class, $product, [
'action' => $this->router->generate('app_validate_product'),
'method' => 'POST',
]);
return $this->render('product/product_details.html.twig', [
'form' => $form->createView(),
]);*/
}
return $this->render('product/add_product.html.twig', [
'form' => $form->createView(),
]);
}
#[Route('/validate/product', name: 'app_validate_product')]
#[IsGranted("ROLE_ADMIN")]
public function validteproduct(Request $request)
{
if (!empty($request->request->get('product_add_choix'))) {
$product = new Product();
$form = $this->createForm(ProductAddChoixType::class, $product);
$form->handleRequest($request);
if ($form->isSubmitted()) {
$product_name = $request->request->get('product_add_choix')['name'];
$product_notes = $request->request->get('product_add_choix')['notes'];
$product_full = $product_name . " " . $product_notes;
$fullPath = '';
if (!is_null($request->files->get('product_add_choix'))) {
//Get the uploaded file from the form
/** @var UploadedFile $file */
$file = $request->files->get('product_add_choix')['imageFile']['file'];
// Generate a unique file name
//$fileName = md5(uniqid()) . '.' . $file->guessExtension();
$fileName = md5(uniqid()) . '.jpeg';
// Récupérer le protocole, le nom de domaine et le port à partir de l'URL de la requête
$protocol = $request->getScheme();
$domain = $request->getHost();
$port = $request->getPort();
// Construire l'URL complète avec le protocole, le nom de domaine et le port
$fullUrl = $protocol . '://' . $domain;
if (($protocol == 'http' && $port != 80) || ($protocol == 'https' && $port != 443)) {
$fullUrl .= ':' . $port;
}
// Move the file to the desired directory
$filesystem = new Filesystem();
$targetDirectory = 'images/product/';
$filesystem->mkdir($targetDirectory);
$file->move($targetDirectory, $fileName);
if ($filesystem->exists($targetDirectory) && is_dir($targetDirectory)) {
$fullPath = $fullUrl . '/' . $targetDirectory . '' . $fileName;
}
}
$product = $this->api_chatgtp_service->createContenuProduct($fullPath,$request->request, $product_full, $id = null);
$form = $this->createForm(ProductType::class, $product, [
'action' => $this->router->generate('app_confirmer_create_product'),
'method' => 'POST',
]);
return $this->render('product/product_details.html.twig', [
'form' => $form->createView(),
]);
}
} else {
$this->addFlash('danger', "Problème lors de création du produit , saisir au moins le nom du produit ou sku");
//Redirect to success page
return $this->redirectToRoute('app_product');
}
}
#[Route('/confirmer/create/product', name: 'app_confirmer_create_product')]
#[IsGranted("ROLE_ADMIN")]
public function confirmerCreateProduct(Request $request)
{
$product = new Product();
$form = $this->createForm(ProductType::class, $product);
$form->handleRequest($request);
if ($form->isSubmitted() && $form->isValid()) {
// Récupérer les données soumises
$data = $form->getData();
$id = $request->request->get('id_product');
// $fullPath = '';
// if (!is_null($request->files->get('product'))) {
// // Get the uploaded file from the form
// /** @var UploadedFile $file */
// $file = $request->files->get('product')['imageFile']['file'];
//
// // Generate a unique file name
// $fileName = md5(uniqid()) . '.' . $file->guessExtension();
//
// // Récupérer le protocole, le nom de domaine et le port à partir de l'URL de la requête
// $protocol = $request->getScheme();
// $domain = $request->getHost();
// $port = $request->getPort();
//
// // Construire l'URL complète avec le protocole, le nom de domaine et le port
// $fullUrl = $protocol . '://' . $domain;
// if (($protocol == 'http' && $port != 80) || ($protocol == 'https' && $port != 443)) {
// $fullUrl .= ':' . $port;
// }
//
// // Move the file to the desired directory
// $filesystem = new Filesystem();
// $targetDirectory = 'images/product/';
// $filesystem->mkdir($targetDirectory);
// $file->move($targetDirectory, $fileName);
//
// if ($filesystem->exists($targetDirectory) && is_dir($targetDirectory)) {
// $fullPath = $fullUrl . '/' . $targetDirectory . '' . $fileName;
// }
// }
if (isset($id) && ($id) >= 1) {
$product = $this->api_service->updateProduct($data, $id);
} else {
$product = $this->api_service->createProduct($data);
}
if (!is_null($product)) {
//Redirect to success page
$this->addFlash('success', "Votre produit a été créé avec succès ! ");
//Redirect to success page
return $this->redirectToRoute('app_update_product');
} else {
$this->addFlash('danger', "Problème lors de création du produit , veuillez vérifier que Sku ou le nom du produit n'existe pas ");
//Redirect to success page
return $this->redirectToRoute('app_product');
}
}
}
#[Route('/update/product', name: 'app_update_product')]
#[IsGranted("ROLE_ADMIN")]
public function updateproduct(Request $request)
{
$product = new Product();
$form = $this->createForm(ProductNameChoiceType::class, $product);
$form->handleRequest($request);
if ($form->isSubmitted() && $form->isValid()) {
$product_id = $request->request->get('product_name_choice')['name'];
if (isset($product_id)) {
$reponseProduct = $this->api_service->getProduct($product_id);
$product = new Product();
$product->setId($reponseProduct['id']);
$product->setSku($reponseProduct['sku']);
$product->setName($reponseProduct['name']);
$product->setDescription($reponseProduct['description']);
$product->setShortDescription($reponseProduct['short_description']);
$product->setUrl($reponseProduct['url']);
$product->setMetaTitle($reponseProduct['meta']['title']);
$product->setMetaDescription($reponseProduct['meta']['description']);
$product->setMetaDescription($reponseProduct['meta']['description']);
$product->setCategory($reponseProduct['category_id']);
$form = $this->createForm(ProductUpdateType::class, $product, [
'action' => $this->router->generate('app_generer_visualiser_product'),
'method' => 'POST',
]);
return $this->render('product/visualiser.html.twig', [
'form' => $form->createView(),
'id' => $reponseProduct['id'],
]);
} else {
$this->addFlash('danger', "Veuillez choisir un produit");
//Redirect to success page
return $this->redirectToRoute('app_product');
}
}
return $this->render('product/update_product.html.twig', [
'form' => $form->createView(),
]);
}
#[Route('/validate/generate/product', name: 'app_generer_visualiser_product')]
#[IsGranted("ROLE_ADMIN")]
public function genererVisualiserteproduct(Request $request)
{
$product = new Product();
$form = $this->createForm(ProductUpdateType::class, $product);
$form->handleRequest($request);
if ($form->isSubmitted()) {
$product_name = $request->request->get('product_update')['name'];
$product_notes = $request->request->get('product_update')['notes'];
$id_product = $request->request->get('id_product');
$product_full = $product_name . " " . $product_notes;
$product = $this->api_chatgtp_service->createContenuProduct($fullPath=null,$request->request, $product_full, $id_product);
$form = $this->createForm(ProductUpdateType::class, $product, [
'action' => $this->router->generate('app_confirmer_update_product'),
'method' => 'POST',
]);
return $this->render('product/product_update_details.html.twig', [
'form' => $form->createView(),
'id' => $id_product,
]);
}
}
#[Route('/confirmer/update/product', name: 'app_confirmer_update_product')]
#[IsGranted("ROLE_ADMIN")]
public function confirmerUpdateProduct(Request $request)
{
$product = new Product();
$form = $this->createForm(ProductUpdateType::class, $product);
$form->handleRequest($request);
if ($form->isSubmitted() && $form->isValid()) {
// Récupérer les données soumises
$data = $form->getData();
$id = $request->request->get('id_product');
$product = $this->api_service->updateProduct($data, $id);
if (!is_null($product)) {
//Redirect to success page
$this->addFlash('success', "Votre produit a été modifié avec succès ! ");
//Redirect to success page
return $this->redirectToRoute('app_update_product');
} else {
$this->addFlash('danger', "Problème lors de création du produit , veuillez vérifier que Sku ou le nom du produit n'existe pas ");
//Redirect to success page
return $this->redirectToRoute('app_product');
}
}
}
#[Route('/get/product', name: 'app_get_product')]
#[IsGranted("ROLE_ADMIN")]
public function getproduct(Request $request)
{
dd("ggg");
$this->api_service->getProduct($request);
$product = new Product();
$form = $this->createForm(ProductNameType::class, $product, ['info' => 'update_product']);
$form->handleRequest($request);
if ($form->isSubmitted() && $form->isValid()) {
$product_id = $request->request->get('product_name')['name'];
$product_name = $request->request->get('name_product_update');
if (isset($product_id) && isset($product_name)) {
$product = $this->api_chatgtp_service->createContenuProduct($product_name, $product_id);
$form = $this->createForm(ProductType::class, $product, [
'action' => $this->router->generate('app_validate_product'),
'method' => 'POST',
]);
return $this->render('product/product_details.html.twig', [
'form' => $form->createView(),
'id' => $product_id,
]);
} else {
$this->addFlash('danger', "Veuillez choisir un produit");
//Redirect to success page
return $this->redirectToRoute('app_product');
}
}
return $this->render('product/add_product.html.twig', [
'form' => $form->createView(),
]);
}
}