<?php

namespace App\Http\Controllers\Web;

use App\Http\Controllers\Controller;
use App\Models\User;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Auth;
use Illuminate\Support\Facades\Hash;
use Illuminate\Support\Facades\RateLimiter;

class AuthController extends Controller
{
    /**
     * Mostrar formulario de login
     */
    public function showLoginForm()
    {
        if (Auth::check()) {
            return redirect()->route('dashboard');
        }

        return view('auth.login');
    }

    /**
     * Procesar login por cédula
     */
    public function login(Request $request)
    {
        $request->validate([
            'cedula' => 'required|string|max:13',
            'password' => 'required|string|min:4',
        ], [
            'cedula.required' => 'La cédula es obligatoria',
            'password.required' => 'La contraseña es obligatoria',
            'password.min' => 'La contraseña debe tener al menos 4 caracteres',
        ]);

        // Rate limiting por IP
        $key = 'login:' . $request->ip();
        if (RateLimiter::tooManyAttempts($key, 5)) {
            $seconds = RateLimiter::availableIn($key);
            return back()
                ->withInput($request->only('cedula'))
                ->with('error', "Demasiados intentos. Intente en {$seconds} segundos.");
        }

        // Buscar usuario por cédula
        $user = User::where('cedula', $request->cedula)
            ->where('estado', 1)
            ->first();

        if (!$user) {
            RateLimiter::hit($key, 60);
            return back()
                ->withInput($request->only('cedula'))
                ->with('error', 'Credenciales inválidas');
        }

        // Verificar si está bloqueado
        if ($user->estaBloqueado()) {
            $minutos = now()->diffInMinutes($user->bloqueado_hasta);
            return back()
                ->withInput($request->only('cedula'))
                ->with('error', "Usuario bloqueado. Intente en {$minutos} minutos.");
        }

        // Verificar acceso web
        if (!$user->tieneAccesoWeb()) {
            return back()
                ->withInput($request->only('cedula'))
                ->with('error', 'Su perfil no tiene acceso al sistema web');
        }

        // Verificar password
        if (!Hash::check($request->password, $user->password)) {
            $user->incrementarIntentosFallidos();
            RateLimiter::hit($key, 60);

            $intentosRestantes = 5 - $user->intentos_fallidos;
            return back()
                ->withInput($request->only('cedula'))
                ->with('error', "Credenciales inválidas. {$intentosRestantes} intentos restantes.");
        }

        // Login exitoso
        RateLimiter::clear($key);
        $user->registrarLogin();

        Auth::login($user, $request->boolean('remember'));

        $request->session()->regenerate();

        // Verificar si requiere cambio de contraseña
        if ($user->requiere_cambio_password) {
            return redirect()->route('web.cambiar-password')
                ->with('warning', 'Debe cambiar su contraseña para continuar');
        }

        return redirect()->intended(route('dashboard'));
    }

    /**
     * Cerrar sesión
     */
    public function logout(Request $request)
    {
        Auth::logout();

        $request->session()->invalidate();
        $request->session()->regenerateToken();

        return redirect()->route('web.login');
    }

    /**
     * Mostrar formulario de recuperar contraseña
     */
    public function showForgotPasswordForm()
    {
        return view('auth.forgot-password');
    }

    /**
     * Procesar solicitud de recuperación
     */
    public function forgotPassword(Request $request)
    {
        $request->validate([
            'cedula' => 'required|string|max:13',
        ]);

        // TODO: Implementar lógica de envío de email
        return back()->with('success', 'Si la cédula está registrada, recibirá instrucciones para recuperar su contraseña.');
    }

    /**
     * Mostrar perfil del usuario
     */
    public function perfil()
    {
        $user = Auth::user();

        return view('auth.perfil', [
            'usuario' => $user,
        ]);
    }

    /**
     * Mostrar formulario cambiar contraseña
     */
    public function showCambiarPasswordForm()
    {
        return view('auth.cambiar-password');
    }

    /**
     * Procesar cambio de contraseña
     */
    public function cambiarPassword(Request $request)
    {
        $request->validate([
            'password_actual' => 'required|string',
            'password' => 'required|string|min:8|confirmed',
        ], [
            'password_actual.required' => 'La contraseña actual es obligatoria',
            'password.required' => 'La nueva contraseña es obligatoria',
            'password.min' => 'La contraseña debe tener al menos 8 caracteres',
            'password.confirmed' => 'Las contraseñas no coinciden',
        ]);

        $user = Auth::user();

        if (!Hash::check($request->password_actual, $user->password)) {
            return back()->with('error', 'La contraseña actual es incorrecta');
        }

        $user->password = Hash::make($request->password);
        $user->requiere_cambio_password = false;
        $user->save();

        return redirect()->route('dashboard')->with('success', 'Contraseña actualizada correctamente');
    }
}
