<?php

declare(strict_types=1);

namespace App\Administration\Infrastructure\Api\Resource;

use ApiPlatform\Metadata\ApiResource;
use ApiPlatform\Metadata\Post;
use App\Administration\Infrastructure\Api\Processor\ActivateAccountProcessor;
use Symfony\Component\Validator\Constraints as Assert;

/**
 * API Resource for account activation.
 *
 * This endpoint accepts a token value and new password to activate a user account.
 */
#[ApiResource(
    shortName: 'AccountActivation',
    operations: [
        new Post(
            uriTemplate: '/activate',
            processor: ActivateAccountProcessor::class,
            output: ActivateAccountOutput::class,
            validationContext: ['groups' => ['Default', 'activate']],
            name: 'activate_account',
        ),
    ],
)]
final class ActivateAccountInput
{
    #[Assert\NotBlank(message: 'Le token d\'activation est requis.')]
    #[Assert\Uuid(message: 'Le token d\'activation doit être un UUID valide.')]
    public string $tokenValue = '';

    #[Assert\NotBlank(message: 'Le mot de passe est requis.')]
    #[Assert\Length(
        min: 8,
        minMessage: 'Le mot de passe doit contenir au moins {{ limit }} caractères.',
    )]
    #[Assert\Regex(
        pattern: '/[A-Z]/',
        message: 'Le mot de passe doit contenir au moins une majuscule.',
    )]
    #[Assert\Regex(
        pattern: '/[a-z]/',
        message: 'Le mot de passe doit contenir au moins une minuscule.',
    )]
    #[Assert\Regex(
        pattern: '/[0-9]/',
        message: 'Le mot de passe doit contenir au moins un chiffre.',
    )]
    #[Assert\Regex(
        pattern: '/[^A-Za-z0-9]/',
        message: 'Le mot de passe doit contenir au moins un caractère spécial.',
    )]
    public string $password = '';
}
