<?php

declare(strict_types=1);

namespace App\Controller\Admin\Acteurs\Proprietaires;

use App\Managers\ManagersInterface;
use App\Form\Acteurs\LocatairesType;
use App\Services\Carts\CartsService;
use App\Entity\Acteurs\Proprietaires;
use App\Form\Acteurs\ProprietairesType;
use App\Interfaces\NotificationsInterface;
use App\Handlers\Forms\ProprietairesHandle;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\Routing\Annotation\Route;
use App\Repository\Acteurs\ProprietairesRepository;
use App\Repository\Parametres\Etats\EtatsRepository;
use Symfony\Component\HttpFoundation\RedirectResponse;
use Symfony\Component\DependencyInjection\ContainerInterface;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Sensio\Bundle\FrameworkExtraBundle\Configuration\Security as Security;

#[Route('/admin/acteurs/proprietaires')]
#[Security("is_granted('ROLE_SUPER_ADMIN') or is_granted('ROLE_ADMIN')")]
class AdminProprietairesController extends AbstractController
{
    public function __construct(
        private NotificationsInterface $notifications,
        private ManagersInterface $managers,
        private ProprietairesHandle $handle,
        private ProprietairesRepository $repository,
    ) {}

    #[Route('/', name: "admin.acteurs.proprietaires.index", methods: ['GET'])]
    /**
     * @param ProprietairesRepository $proprietairesRepository
     * @return Response
     */
    public function index(
        ProprietairesRepository $proprietairesRepository
    ): Response {
        $this->denyAccessUnlessGranted('IS_AUTHENTICATED_FULLY');
        $proprietaires = $proprietairesRepository->findBy(['deletedAt' => null], ['id' => 'DESC']);
        return $this->render('admin/acteurs/proprietaires/index.html.twig', [
            'proprietaires' => $proprietaires,
            'title' => 'Liste des proprietaires',
            'libelle_ajouter' => 'Nouveau proprietaire',
            'current_page' => 'proprietaires',
            'current_global' => 'acteurs'
        ]);
    }

    #[Route('/lists', name: "admin.acteurs.proprietaires.list", methods: ['GET'])]
    /**
     * @param ProprietairesRepository $proprietairesRepository
     * @return Response
     */
    public function listCard(ProprietairesRepository $proprietairesRepository): Response
    {
        $this->denyAccessUnlessGranted('IS_AUTHENTICATED_FULLY');
        return $this->render('admin/acteurs/proprietaires/list.html.twig', [
            'proprietaires' => $proprietairesRepository->findBy(['deletedAt' => null], ['id' => 'DESC']),
            'title' => 'Liste des proprietaires',
            'libelle_ajouter' => 'Nouveau proprietaire',
            'current_page' => 'proprietaires',
            'current_global' => 'acteurs'
        ]);
    }

    #[Route('/new', name: "admin.acteurs.proprietaires.new", methods: ['GET', 'POST'])]
    /**
     * @param Request $request
     * @return Response
     */
    public function new(Request $request): Response
    {
        $this->denyAccessUnlessGranted('IS_AUTHENTICATED_FULLY');
        $proprietaire = $this->repository->new();
        $form = $this->createForm(ProprietairesType::class, $proprietaire);
        $form->handleRequest($request);

        if ($form->isSubmitted() && $form->isValid()) {
            // Traiter le formulaire via ton service
            $this->handle->handleProprietaireForm($form);
            $this->addFlash('success', 'Propriétaire ajouté avec succès.');
            return $this->redirectToRoute('admin.acteurs.proprietaires.index');
        }

        return $this->render('admin/acteurs/proprietaires/new.html.twig', [
            'proprietaire' => $proprietaire,
            'form' => $form->createView(),
            'title' => 'Nouveau proprietaire',
            'libelle_liste' => 'Liste des proprietaires',
            'current_page' => 'proprietaires_new',
            'current_global' => 'acteurs'
        ]);
    }


    #[Route('/{id<\d+>}/edit', name: "admin.acteurs.proprietaires.edit", methods: ['GET', 'POST'])]
    /**
     * @param Request $request
     * @param Proprietaires $proprietaire
     * @return Response
     */
    public function edit(Request $request, Proprietaires $proprietaire): Response
    {
        $this->denyAccessUnlessGranted('IS_AUTHENTICATED_FULLY');
        $form = $this->createForm(ProprietairesType::class, $proprietaire);
        $form->handleRequest($request);

        if ($form->isSubmitted()) {
            $this->addFlash('success', 'Proprietaire modifié avec succès.');
            return $this->handle->handleProprietaireForm($form);
        }

        return $this->render('admin/acteurs/proprietaires/edit.html.twig', [
            'proprietaire' => $proprietaire,
            'form' => $form->createView(),
            'title' => 'Editer la devise',
            'libelle_ajouter' => 'Nouveau proprietaires',
            'libelle_liste' => 'Liste des proprietaires',
            'current_page' => 'proprietaires',
            'current_global' => 'acteurs'
        ]);
    }

    #[Route('/show/{id<\d+>}', name: "admin.acteurs.proprietaires.show", methods: ['GET', 'POST'])]
    /**
     * @param Proprietaires $proprietaire
     * @param CartsService $cartsService
     * @param ContainerInterface $container
     * @param EtatsRepository $etatsRepository
     * @param Request $request
     * @return Response
     */
    public function show(
        Proprietaires         $proprietaire,
        CartsService          $cartsService,
        ContainerInterface    $container,
        EtatsRepository       $etatsRepository,
        Request               $request
    ): Response {
        $this->denyAccessUnlessGranted('IS_AUTHENTICATED_FULLY');
        dd($proprietaire);
        return $this->render('admin/acteurs/proprietaires/show.html.twig', [
            'proprietaire' => $proprietaire,
            'title' => 'Fiche proprietaire',
            'libelle_ajouter' => 'Nouveau proprietaire',
            'libelle_liste' => 'Liste des proprietaires',
            'current_page' => 'proprietaires',
            'current_global' => 'acteurs'
        ]);
    }

    #[Route('/{id<\d+>}', name: "admin.acteurs.proprietaires.delete", methods: ['DELETE'])]
    #[Security("is_granted('ROLE_SUPER_ADMIN') or is_granted('ROLE_ADMIN')")]
    /**
     * @param Request $request
     * @param Proprietaires $proprietaire
     * @return Response
     */
    public function delete(Request $request, Proprietaires $proprietaire): Response
    {
        $this->denyAccessUnlessGranted('IS_AUTHENTICATED_FULLY');
        if ($this->isCsrfTokenValid('delete' . $proprietaire->getId(), $request->request->get('_token'))) {
            $this->notifications->save(
                "Suppression du propriétaire #{$proprietaire->getName()}",
                "Suppression",
                $proprietaire,
                "trash",
                "red"
            );
            $this->managers->setEntity($proprietaire, 'delete');
            $this->addFlash('success', 'Proprietaire supprimé avec succès.');
        }

        $referer = $request->headers->get('referer');
        return new RedirectResponse($referer ?? $this->generateUrl('admin.acteurs.proprietaires.index'));
    }
}
