<?php

declare(strict_types=1);

namespace App\Controller\Admin\Acteurs\Locataires;

use App\Entity\Acteurs\Locataires;
use App\Entity\Acteurs\search;
use App\Form\Acteurs\LocatairesType;
use App\Form\Acteurs\SearchType;
use App\Handlers\Forms\LocatairesHandle;
use App\Managers\ManagersInterface;
use App\Repository\Acteurs\LocatairesRepository;
use App\Repository\Quittances\QuittancesRepository;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\HttpFoundation\RedirectResponse;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\Routing\Annotation\Route;
use Sensio\Bundle\FrameworkExtraBundle\Configuration\Security as Security;

#[Route('/admin/acteurs/locataires')]
#[Security("is_granted('ROLE_SUPER_ADMIN') or is_granted('ROLE_ADMIN')")]
class AdminLocatairesController extends AbstractController
{

    public function __construct(
        private ManagersInterface $managers,
        private LocatairesHandle $handle,
        private QuittancesRepository $quittancesRepository,
        private LocatairesRepository $repository,
    ){}

    #[Route('/', name:"admin.acteurs.locataires.index", methods: ['GET', 'POST'])]
    public function index(LocatairesRepository $locatairesRepository, Request $request): Response
    {
        $this->denyAccessUnlessGranted('IS_AUTHENTICATED_FULLY');
        $search = new search();
        $locataires = $locatairesRepository->searchLocataires($search);
        $search_locataire_form = $this->createForm(SearchType::class, $search);
        $search_locataire_form->handleRequest($request);

        if ($search_locataire_form->isSubmitted() && $search_locataire_form->isValid()) {
            $locataires = $locatairesRepository->searchLocataires($search);
        }

        return $this->render('admin/acteurs/locataires/index.html.twig', [
            'search' => $search,
            'locataires' => $locataires,
            'title' => 'Liste des locataires',
            'libelle_ajouter' => 'Nouveau locataire',
            'current_page' => 'locataires',
            'current_global' => 'acteurs'
        ]);
    }

    #[Route('/inactifs', name:"admin.acteurs.locataires.out", methods: ['GET'])]
    /**
     * @param LocatairesRepository $locatairesRepository
     * @return Response
     */
    public function out(LocatairesRepository $locatairesRepository): Response
    {
        $this->denyAccessUnlessGranted('IS_AUTHENTICATED_FULLY');
        return $this->render('admin/acteurs/locataires/index.html.twig', [
            'locataires' => $locatairesRepository->findBy([
                'deletedAt' => null,
                'is_actif' => false,
                'is_out' => true
            ], ['id' => 'DESC']),
            'title' => 'Liste des locataires',
            'libelle_ajouter' => 'Nouveau locataire',
            'current_page' => 'locataires_out',
            'current_global' => 'acteurs'
        ]);
    }

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

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

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

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

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

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

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

    #[Route('/show/{id<\d+>}', name:"admin.acteurs.locataires.show", methods: ['GET'])]
    /**
     * @param Locataires $locataire
     * @return Response
     */
    public function show(
        Locataires $locataire
    ): Response {
        $this->denyAccessUnlessGranted('IS_AUTHENTICATED_FULLY');
        return $this->render('admin/acteurs/locataires/show.html.twig', [
            'locataire' => $locataire,
            'quittances' => $this->quittancesRepository->findBy(['deletedAt' => NULL, 'locataires' => $locataire], ['createdAt' => 'DESC']),
            'title' => 'Fiche locataire',
            'libelle_ajouter' => 'Nouveau locataire',
            'libelle_liste' => 'Liste des locataires',
            'current_page' => 'locataires',
            'current_global' => 'acteurs'
        ]);
    }

    #[Route('/{id<\d+>}', name:"admin.acteurs.locataires.delete", methods: ['DELETE'])]
    #[Security("is_granted('ROLE_SUPER_ADMIN') or is_granted('ROLE_ADMIN')")]
    /**
     * @param Request $request
     * @param Locataires $locataire
     * @return Response
     */
    public function delete(Request $request, Locataires $locataire): Response
    {
        $this->denyAccessUnlessGranted('IS_AUTHENTICATED_FULLY');
        if ($this->isCsrfTokenValid('delete' . $locataire->getId(), $request->request->get('_token'))) {
            $this->managers->setEntity($locataire, 'delete');
            $this->addFlash('success', 'Locataire supprimé avec succès.');
        }

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