<?php

declare(strict_types=1);

namespace App\Controller;

use App\Repository\AuditLogRepository;
use App\Repository\ComposantRepository;
use App\Repository\ProfileRepository;
use Symfony\Component\HttpFoundation\JsonResponse;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\Routing\Attribute\Route;

final class ComposantHistoryController
{
    public function __construct(
        private readonly ComposantRepository $components,
        private readonly AuditLogRepository $auditLogs,
        private readonly ProfileRepository $profiles,
    ) {
    }

    #[Route('/api/composants/{id}/history', name: 'api_composant_history', methods: ['GET'])]
    public function __invoke(string $id): JsonResponse
    {
        $component = $this->components->find($id);
        if (!$component) {
            return new JsonResponse(
                ['message' => 'Composant introuvable.'],
                Response::HTTP_NOT_FOUND,
            );
        }

        $logs = $this->auditLogs->findEntityHistory('composant', $id, 200);

        $actorIds = array_values(array_unique(array_filter(array_map(
            static fn ($log) => $log->getActorProfileId(),
            $logs,
        ))));

        $actorMap = [];
        if ($actorIds !== []) {
            $profiles = $this->profiles->findBy(['id' => $actorIds]);
            foreach ($profiles as $profile) {
                $label = trim(sprintf('%s %s', $profile->getFirstName(), $profile->getLastName()));
                if ($label === '') {
                    $label = $profile->getEmail() ?? $profile->getId();
                }
                $actorMap[$profile->getId()] = $label;
            }
        }

        $items = array_map(
            static function ($log) use ($actorMap) {
                $actorId = $log->getActorProfileId();

                return [
                    'id' => $log->getId(),
                    'action' => $log->getAction(),
                    'createdAt' => $log->getCreatedAt()->format(\DateTimeInterface::ATOM),
                    'actor' => $actorId
                        ? [
                            'id' => $actorId,
                            'label' => $actorMap[$actorId] ?? $actorId,
                        ]
                        : null,
                    'diff' => $log->getDiff(),
                    'snapshot' => $log->getSnapshot(),
                ];
            },
            $logs,
        );

        return new JsonResponse([
            'items' => array_values($items),
            'total' => count($items),
        ]);
    }
}

