<?php

namespace App\Controller;

use App\Entity\ScanSession;
use App\Entity\User;
use App\Repository\ActivityLogRepository;
use App\Repository\ScanSessionRepository;
use App\Security\Voter\ScanVoter;
use App\Service\ConcessionsProvider;
use App\Service\VehicleErrorChecker;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\Routing\Attribute\Route;
use Symfony\Component\Security\Http\Attribute\IsGranted;

/**
 * Page de détail d'un inventaire : statut, lieu, paires plaque/VIN avec vignettes des images.
 */
#[IsGranted('ROLE_USER')]
final class InventaireDetailController extends AbstractController
{
    #[Route('/inventaires/{id}', name: 'app_inventaire_detail', methods: ['GET'], requirements: ['id' => '[0-9a-f-]{36}'])]
    public function show(
        string $id,
        ScanSessionRepository $sessions,
        ConcessionsProvider $provider,
        ActivityLogRepository $activityLogs,
        VehicleErrorChecker $errors,
    ): Response {
        /** @var User $user */
        $user = $this->getUser();
        $session = $sessions->findOneInScope($id, $user->scopeConcessions());

        if (null === $session) {
            throw $this->createNotFoundException();
        }

        // Choix offerts pour modifier les concessions du scan (avant validation) :
        // tout le référentiel pour ADMIN/AUDIT, ses propres concessions sinon,
        // plus les valeurs déjà portées par le scan (anciens noms hérités inclus).
        $concessionChoices = [];
        if ($this->isGranted(ScanVoter::EDIT_CONCESSIONS, $session)) {
            $ids = $user->seesAllConcessions() ? array_keys($provider->all()) : $user->getConcessions();
            $concessionChoices = $provider->labels(array_values(array_unique(array_merge($ids, $session->getConcessions()))));
        }

        // Historique du scan (journal d'audit), visible des valideurs.
        $history = $this->isGranted(ScanVoter::CHANGE_STATUS, $session)
            ? $activityLogs->findRecentForScan($id)
            : [];

        return $this->render('page/inventaire_detail.html.twig', [
            'session' => $session,
            'concessionChoices' => $concessionChoices,
            'history' => $history,
            'duplicateIndexes' => $errors->duplicateIndexes($session->getResults()),
            'statusLabels' => [
                ScanSession::STATUS_EN_COURS => 'En cours',
                ScanSession::STATUS_A_VALIDER => 'À valider',
                ScanSession::STATUS_VALIDE => 'Validé',
                ScanSession::STATUS_ANNULE => 'Annulé',
            ],
        ]);
    }
}
