<?php

namespace App\Controller;

use App\Ocr\GeminiOcrClient;
use App\Service\ImageValidator;
use Psr\Log\LoggerInterface;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\HttpFoundation\JsonResponse;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\Routing\Attribute\Route;
use Symfony\Component\Security\Http\Attribute\IsGranted;

/**
 * Identification marque + modèle d'un véhicule à partir de son VIN (texte) et de
 * ses photos NON-VIN (plaque / vue d'ensemble), via Gemini. Appelé par le scan une
 * fois les photos d'un véhicule regroupées. Le serveur OVH ne pouvant pas lire les
 * octets sur S3, le navigateur transmet les images (base64) qu'il a déjà en mémoire.
 */
#[IsGranted('SCAN_CREATE')]
final class VehicleModelController extends AbstractController
{
    /** Au plus 2 photos non-VIN par véhicule (cf. regroupement du scan). */
    private const MAX_IMAGES = 2;

    #[Route('/api/vehicle-model', name: 'app_vehicle_model', methods: ['POST'])]
    public function model(
        Request $request,
        ImageValidator $validator,
        GeminiOcrClient $gemini,
        LoggerInterface $logger,
    ): JsonResponse {
        if (!str_contains((string) $request->headers->get('Content-Type'), 'application/json')) {
            return $this->json(['error' => 'Content-Type must be application/json'], Response::HTTP_BAD_REQUEST);
        }

        $body = json_decode($request->getContent(), true);
        if (!\is_array($body)) {
            return $this->json(['error' => 'Invalid JSON body'], Response::HTTP_BAD_REQUEST);
        }

        $vin = \is_string($body['vin'] ?? null) ? $body['vin'] : '';
        $rawImages = $body['images'] ?? null;
        if (!\is_array($rawImages) || [] === $rawImages) {
            return $this->json(['error' => "Missing 'images'"], Response::HTTP_BAD_REQUEST);
        }

        $images = [];
        foreach (\array_slice(array_values($rawImages), 0, self::MAX_IMAGES) as $img) {
            if (\is_string($img) && '' !== $img && $validator->isValidBase64($img)) {
                $images[] = $img;
            }
        }
        if ([] === $images) {
            return $this->json(['error' => 'Invalid base64 image data'], Response::HTTP_BAD_REQUEST);
        }

        try {
            $result = $gemini->recognizeModel($images, $vin);

            return $this->json([
                'make' => $result['make'],
                'model' => $result['model'],
                'confidence' => $result['confidence'],
            ], Response::HTTP_OK, ['Cache-Control' => 'no-store', 'X-Content-Type-Options' => 'nosniff']);
        } catch (\Throwable $e) {
            $logger->error('Erreur identification modèle', ['exception' => $e]);

            return $this->json(['error' => 'Identification du modèle échouée.'], Response::HTTP_INTERNAL_SERVER_ERROR);
        }
    }
}
