<?php

namespace App\Filament\Pages\Auth;

// Importaciones base de Filament y Laravel
use App\Models\User;
use Filament\Auth\Http\Responses\Contracts\LoginResponse;
use Filament\Auth\Pages\Login as BaseLogin;
use Filament\Facades\Filament;
use Filament\Forms\Components\TextInput;
use Filament\Models\Contracts\FilamentUser;
// Usar Component de Schemas para la firma del método
use Filament\Schemas\Components\Component;
// Las clases de componentes del formulario SÍ suelen venir de Forms\Components
use Illuminate\Contracts\Auth\Authenticatable;
// Importar el modelo User
use Illuminate\Validation\ValidationException;
// ✅ Importar la clase Notification
use Symfony\Component\HttpKernel\Exception\TooManyRequestsHttpException;

class Login extends BaseLogin
{
    // ... (El método authenticate() se mantiene igual que en la versión anterior)
    public function authenticate(): ?LoginResponse
    {
        // 1. Rate Limiting
        try {
            $this->rateLimit(5);
        } catch (TooManyRequestsHttpException $exception) {
            $this->getRateLimitedNotification($exception)?->send();

            return null;
        }

        $data = $this->form->getState();
        $authGuard = Filament::auth();
        $authProvider = $authGuard->getProvider();
        $credentials = $this->getCredentialsFromFormData($data);
        $loginField = array_key_exists('email', $credentials) ? 'email' : 'phone';
        $loginValue = $credentials[$loginField];

        $user = User::where($loginField, $loginValue)->first();

        // 2. Validar credenciales ANTES de revelar cualquier estado de la cuenta.
        //    (Antes se comprobaba la suscripción primero, filtrando que un email
        //    existía y que su suscripción estaba expirada aun con contraseña errónea.)
        if (! $user || ! $authProvider->validateCredentials($user, ['password' => $credentials['password']])) {
            $this->userUndertakingMultiFactorAuthentication = null;
            $this->fireFailedEvent($authGuard, $user, $credentials);
            $this->throwFailureValidationException();
        }

        // 3. Suscripción expirada/inactiva: si es admin, lo dejamos entrar pero a la
        //    pantalla de reactivación (Fase 3), no al panel. Otros roles usan la PWA.
        if (! $user->hasActiveSubscription()) {
            if ($user->hasAnyRole(['super_admin', 'admin'])) {
                $authGuard->login($user, $data['remember'] ?? false);
                session()->regenerate();
                $this->redirect(route('subscription.locked'));

                return null;
            }

            $this->fireFailedEvent($authGuard, $user, $credentials);
            $this->throwFailureValidationException();
        }

        // 4. Ruta normal: intentar login y comprobar acceso al panel.
        if (! $authGuard->attemptWhen($credentials, function (Authenticatable $user): bool {
            if (! ($user instanceof FilamentUser)) {
                return true;
            }

            return $user->canAccessPanel(Filament::getCurrentOrDefaultPanel());
        }, $data['remember'] ?? false)) {
            $this->userUndertakingMultiFactorAuthentication = null;
            $this->fireFailedEvent($authGuard, $user, $credentials);
            $this->throwFailureValidationException();
        }

        // 5. Login exitoso
        session()->regenerate();

        return app(LoginResponse::class);
    }
    // FIN authenticate()

    /**
     * La firma del método ahora retorna Component de Schemas
     */
    protected function getEmailFormComponent(): Component // <-- CORREGIDO AQUÍ
    {
        // Se sigue usando TextInput de Forms\Components
        return TextInput::make('login_identifier')
            ->label(__('Email o Teléfono'))
            ->required()
            ->autocomplete()
            ->autofocus()
            ->extraInputAttributes(['tabindex' => 1]);
    }

    // El método getCredentialsFromFormData() se mantiene igual
    protected function getCredentialsFromFormData(array $data): array
    {
        $login = $data['login_identifier'];
        $fieldType = filter_var($login, FILTER_VALIDATE_EMAIL) ? 'email' : 'phone';

        return [
            $fieldType => $login,
            'password' => $data['password'],
        ];
    }

    // El método throwFailureValidationException() se mantiene igual
    protected function throwFailureValidationException(): never
    {
        throw ValidationException::withMessages([
            'data.login_identifier' => __('filament-panels::pages/auth/login.messages.failed'),
        ]);
    }

    // Puedes mantener o eliminar los métodos getPasswordFormComponent y getRememberFormComponent
    // si no los has modificado. Si los mantienes, asegúrate de que sus firmas
    // también retornen Component de Schemas si es necesario.
    // protected function getPasswordFormComponent(): Component { ... }
    // protected function getRememberFormComponent(): Component { ... }
}
