<?php

use Illuminate\Support\Facades\Password;
use Livewire\Attributes\{Validate, Title};
use Livewire\Component;

new
#[Title('Mot de passe oublié')]
class extends Component {

    #[Validate('required|email')]
    public string $email = '';

    public function sendPasswordResetLink(): void
    {
        $this->validate();

        // 1. Protection contre le spam (Rate Limiting)
        // On limite à 3 demandes toutes les 10 minutes par e-mail + IP
        $throttleKey = Str::lower($this->email).'|'.request()->ip();
        if (RateLimiter::tooManyAttempts($throttleKey, 3)) {
            $seconds = RateLimiter::availableIn($throttleKey);
            $this->addError('email', __('Veuillez patienter : trop de demandes. Réessayez dans ' . ceil($seconds / 60) . ' min.'));
            return;
        }

        $status = Password::sendResetLink(
            $this->only('email')
        );

        if ($status !== Password::RESET_LINK_SENT) {
            RateLimiter::hit($throttleKey, 600); // On marque une tentative

            // 2. Sécurité : On ne révèle pas si l'utilisateur existe ou non
            // On affiche un message générique même en cas d'erreur
            session()->flash('status', __('Un lien de réinitialisation vous a été envoyé si votre adresse e-mail est enregistrée.'));

            return;
        }

        RateLimiter::clear($throttleKey);
        $this->reset('email');
        session()->flash('status', __($status));
    }
}; ?>

<div class="flex items-center justify-center min-h-[calc(100vh-16rem)] py-12 px-4">
    <div class="w-full max-w-md">
        <x-card
            title="{{ __('Mot de passe oublié') }}"
            subtitle="{{ __('Saisissez votre e-mail pour recevoir un lien de réinitialisation') }}"
            class="shadow-xl bg-base-100"
            separator
            progress-indicator
        >
            {{-- Message de confirmation d'envoi du mail --}}
            @if (session('status'))
                <x-alert icon="o-check-circle" class="alert-success text-xs mb-4">
                    {{ session('status') }}
                </x-alert>
            @endif

            <x-form wire:submit="sendPasswordResetLink" class="space-y-4">
                <x-input
                    label="{{ __('Adresse e-mail') }}"
                    wire:model="email"
                    icon="o-envelope"
                    type="email"
                    required
                />

                <p class="text-xs text-base-content/60 pt-1">
                    <span class="text-error">*</span> @lang('Champ obligatoire')
                </p>

                <x-slot:actions>
                    <div class="flex flex-col sm:flex-row items-center justify-between gap-3 w-full pt-2">
                        <x-button
                            label="{{ __('Retour') }}"
                            type="button"
                            icon="o-arrow-left"
                            class="btn-ghost btn-sm w-full sm:w-auto order-2 sm:order-1"
                            link="{{ route('login') }}"
                        />

                        <x-button
                            label="{{ __('Envoyer le lien') }}"
                            type="submit"
                            icon-right="o-paper-airplane"
                            class="btn-primary btn-sm w-full sm:w-auto order-1 sm:order-2"
                            spinner="sendPasswordResetLink"
                        />
                    </div>
                </x-slot:actions>
            </x-form>
        </x-card>
    </div>
</div>
