<?php

declare(strict_types=1);

namespace App\Module\Sites\Infrastructure\ApiPlatform\Resource;

use ApiPlatform\Metadata\ApiResource;
use ApiPlatform\Metadata\Patch;
use App\Module\Sites\Domain\Entity\Site;
use App\Module\Sites\Infrastructure\ApiPlatform\State\Processor\CurrentSiteProcessor;
use Symfony\Component\Serializer\Attribute\Groups;

/**
 * Ressource API Platform virtuelle (non mappee Doctrine) qui porte
 * l'operation `PATCH /api/me/current-site` : basculement du site courant
 * de l'utilisateur authentifie.
 *
 * `read: false` informe API Platform qu'il ne doit pas tenter de charger
 * une entite existante via un Provider — l'operation denormalise le payload
 * directement dans cette ressource, puis CurrentSiteProcessor prend le relais.
 *
 * `shortName: 'CurrentSite'` : evite toute collision avec l'entite `Site`
 * dans le routage et la documentation OpenAPI.
 *
 * Securite : l'autorisation "ROLE_USER" suffit au niveau voter — la verification
 * fine (le site demande fait-il partie des sites autorises de l'user ?)
 * est faite par CurrentSiteProcessor, car elle dependence de l'user
 * authentifie, pas d'une permission statique.
 */
#[ApiResource(
    shortName: 'CurrentSite',
    operations: [
        new Patch(
            uriTemplate: '/me/current-site',
            security: "is_granted('ROLE_USER')",
            normalizationContext: ['groups' => ['me:read']],
            denormalizationContext: ['groups' => ['current-site:write']],
            processor: CurrentSiteProcessor::class,
            read: false,
            priority: 1,
        ),
    ],
)]
final class CurrentSiteResource
{
    /**
     * Site cible du switch, denormalise depuis l'IRI envoye dans le body :
     * `{ "site": "/api/sites/{id}" }`. Resolu automatiquement par
     * l'IriConverter d'API Platform en instance de `Site`.
     */
    #[Groups(['current-site:write'])]
    public ?Site $site = null;
}
