<?php

namespace App\Command;

use App\Repository\ScanSessionRepository;
use App\Service\ImageStorage;
use App\Service\S3Settings;
use Symfony\Component\Console\Attribute\AsCommand;
use Symfony\Component\Console\Command\Command;
use Symfony\Component\Console\Input\InputArgument;
use Symfony\Component\Console\Input\InputInterface;
use Symfony\Component\Console\Output\OutputInterface;

/**
 * Plan de migration des photos d'une session vers S3 (utilitaire de la Phase 1).
 *   php bin/console app:s3:plan <sessionId>
 *
 * N'écrit RIEN : calcule le dossier S3 de la session (clé identique à ce que
 * l'app utilisera en lecture via S3Settings) et liste, pour chaque image,
 * son chemin local et sa clé d'objet S3. La sortie est parsée par le script
 * d'upload local (le serveur OVH ne peut pas joindre S3). Une fois les objets
 * uploadés, on pose scan_sessions.s3_prefix = <prefix> (SQL) pour basculer la
 * lecture sur S3.
 */
#[AsCommand(name: 'app:s3:plan', description: 'Calcule le plan de migration S3 des photos d\'une session (lecture seule)')]
final class S3PlanCommand extends Command
{
    public function __construct(
        private readonly ScanSessionRepository $sessions,
        private readonly ImageStorage $images,
        private readonly S3Settings $s3,
    ) {
        parent::__construct();
    }

    protected function configure(): void
    {
        $this->addArgument('sessionId', InputArgument::REQUIRED, 'UUID de la session à migrer');
    }

    protected function execute(InputInterface $input, OutputInterface $output): int
    {
        $id = (string) $input->getArgument('sessionId');
        $session = $this->sessions->findOneById($id);
        if (null === $session) {
            $output->writeln('ERROR\tsession introuvable');

            return Command::FAILURE;
        }

        $creator = $session->getUserEmail();
        $prefix = $this->s3->sessionPrefix($creator, $session->getCreatedAt(), $session->getLabel(), $session->getId());
        $output->writeln("PREFIX\t" . $prefix);

        foreach ($session->getResults() as $r) {
            if (!\is_array($r)) {
                continue;
            }
            foreach (['plateImageId', 'vinImageId'] as $field) {
                $imageId = $r[$field] ?? null;
                if (!\is_string($imageId) || '' === $imageId) {
                    continue;
                }
                $path = $this->images->pathFor($creator, $session->getId(), $imageId);
                $key = $this->s3->objectKey($prefix, $imageId);
                $output->writeln(sprintf("IMG\t%s\t%s\t%s", $imageId, $path ?? '(MANQUANT)', $key));
            }
        }

        return Command::SUCCESS;
    }
}
