<?php

namespace App\Http\Controllers\Web;

use App\Http\Controllers\Controller;
use App\Models\Usuario;
use App\Models\Perfil;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Hash;
use Illuminate\Support\Facades\DB;
use Illuminate\Validation\Rule;

class UsuarioController extends Controller
{
    /**
     * Listado de usuarios
     */
    public function index(Request $request)
    {
        // Datos para filtros
        $perfiles = Perfil::activos()->orderBy('per_nombre')->get();

        // Query base
        $query = Usuario::with('perfil.rol');

        // Filtros
        if ($request->filled('buscar')) {
            $query->buscar($request->buscar);
        }

        if ($request->filled('perfil')) {
            $query->porPerfil($request->perfil);
        }

        if ($request->filled('estado')) {
            $query->where('usu_estado', $request->estado);
        }

        if ($request->filled('acceso')) {
            if ($request->acceso === 'web') {
                $query->whereHas('perfil', fn($q) => $q->where('per_acceso_web', 1));
            } elseif ($request->acceso === 'app') {
                $query->whereHas('perfil', fn($q) => $q->where('per_acceso_app', 1));
            }
        }

        // Ordenar
        $query->orderBy('usu_nombre')->orderBy('usu_apellido');

        // Estadísticas
        $estadisticas = [
            'total' => Usuario::count(),
            'activos' => Usuario::where('usu_estado', 1)->count(),
            'inactivos' => Usuario::where('usu_estado', 0)->count(),
            'bloqueados' => Usuario::whereNotNull('usu_bloqueado_hasta')
                ->where('usu_bloqueado_hasta', '>', now())
                ->count(),
            'por_perfil' => Perfil::activos()
                ->withCount(['usuarios' => fn($q) => $q->where('usu_estado', 1)])
                ->orderBy('per_nombre')
                ->get(),
        ];

        // Paginar
        $usuarios = $query->paginate(20)->appends($request->query());

        return view('modules.usuarios.index', compact(
            'usuarios',
            'perfiles',
            'estadisticas'
        ));
    }

    /**
     * Formulario para crear usuario
     */
    public function create()
    {
        $perfiles = Perfil::activos()->orderBy('per_nombre')->get();

        return view('modules.usuarios.create', compact('perfiles'));
    }

    /**
     * Guardar nuevo usuario
     */
    public function store(Request $request)
    {
        $request->validate([
            'usu_nombre' => 'required|string|max:50',
            'usu_apellido' => 'required|string|max:50',
            'usu_cedula' => 'required|string|max:13|unique:usuarios,usu_cedula',
            'usu_email' => 'required|email|max:100|unique:usuarios,usu_email',
            'usu_usuario' => 'required|string|max:50|unique:usuarios,usu_usuario',
            'password' => 'required|string|min:8|confirmed',
            'per_id' => 'required|exists:perfil,per_id',
            'usu_fecha_nac' => 'nullable|date|before:today',
        ]);

        Usuario::create([
            'usu_nombre' => $request->usu_nombre,
            'usu_apellido' => $request->usu_apellido,
            'usu_cedula' => $request->usu_cedula,
            'usu_email' => $request->usu_email,
            'usu_usuario' => $request->usu_usuario,
            'password_laravel' => Hash::make($request->password),
            'per_id' => $request->per_id,
            'usu_fecha_nac' => $request->usu_fecha_nac,
            'fecha_ingreso' => now(),
            'usu_estado' => 1,
            'usu_intentos_fallidos' => 0,
            'usu_cambio_password' => true,
        ]);

        return redirect()
            ->route('web.usuarios.index')
            ->with('success', 'Usuario creado exitosamente.');
    }

    /**
     * Detalle del usuario
     */
    public function show($id)
    {
        $usuario = Usuario::with(['perfil.rol'])->findOrFail($id);

        // Historial de actividad reciente (si existe la tabla)
        $historialActividad = collect();
        try {
            if (DB::getSchemaBuilder()->hasTable('audit_log')) {
                $historialActividad = DB::table('audit_log')
                    ->where('user_id', $id)
                    ->orderBy('created_at', 'desc')
                    ->limit(15)
                    ->get();
            }
        } catch (\Exception $e) {
            // La tabla no existe, dejamos la colección vacía
        }

        // Mantenimientos asignados (si es técnico)
        $mantenimientosAsignados = DB::table('mant_programacion as p')
            ->join('mant_estados as e', 'p.estado_id', '=', 'e.estado_id')
            ->leftJoin('peaje_centro as pc', 'p.id_centro', '=', 'pc.id_centro')
            ->where('p.tecnico_asignado', $id)
            ->select(
                'p.prog_id',
                'p.fecha_programada',
                'e.estado_nombre',
                'e.color_hex',
                'pc.nombre_centro'
            )
            ->orderBy('p.fecha_programada', 'desc')
            ->limit(10)
            ->get();

        return view('modules.usuarios.show', compact(
            'usuario',
            'historialActividad',
            'mantenimientosAsignados'
        ));
    }

    /**
     * Formulario de edición
     */
    public function edit($id)
    {
        $usuario = Usuario::with('perfil')->findOrFail($id);
        $perfiles = Perfil::activos()->orderBy('per_nombre')->get();

        return view('modules.usuarios.edit', compact('usuario', 'perfiles'));
    }

    /**
     * Actualizar usuario
     */
    public function update(Request $request, $id)
    {
        $usuario = Usuario::findOrFail($id);

        $request->validate([
            'usu_nombre' => 'required|string|max:50',
            'usu_apellido' => 'required|string|max:50',
            'usu_cedula' => ['required', 'string', 'max:13', Rule::unique('usuarios', 'usu_cedula')->ignore($id, 'usu_id')],
            'usu_email' => ['required', 'email', 'max:100', Rule::unique('usuarios', 'usu_email')->ignore($id, 'usu_id')],
            'usu_usuario' => ['required', 'string', 'max:50', Rule::unique('usuarios', 'usu_usuario')->ignore($id, 'usu_id')],
            'per_id' => 'required|exists:perfil,per_id',
            'usu_fecha_nac' => 'nullable|date|before:today',
            'usu_estado' => 'required|in:0,1',
        ]);

        $usuario->update([
            'usu_nombre' => $request->usu_nombre,
            'usu_apellido' => $request->usu_apellido,
            'usu_cedula' => $request->usu_cedula,
            'usu_email' => $request->usu_email,
            'usu_usuario' => $request->usu_usuario,
            'per_id' => $request->per_id,
            'usu_fecha_nac' => $request->usu_fecha_nac,
            'usu_estado' => $request->usu_estado,
        ]);

        return redirect()
            ->route('web.usuarios.index')
            ->with('success', 'Usuario actualizado exitosamente.');
    }

    /**
     * Cambiar contraseña
     */
    public function cambiarPassword(Request $request, $id)
    {
        $usuario = Usuario::findOrFail($id);

        $request->validate([
            'password' => 'required|string|min:8|confirmed',
        ]);

        $usuario->update([
            'password_laravel' => Hash::make($request->password),
            'usu_cambio_password' => false,
        ]);

        return back()->with('success', 'Contraseña actualizada exitosamente.');
    }

    /**
     * Desbloquear usuario
     */
    public function desbloquear($id)
    {
        $usuario = Usuario::findOrFail($id);

        $usuario->update([
            'usu_bloqueado_hasta' => null,
            'usu_intentos_fallidos' => 0,
        ]);

        return back()->with('success', 'Usuario desbloqueado exitosamente.');
    }

    /**
     * Activar/Desactivar usuario
     */
    public function toggleEstado($id)
    {
        $usuario = Usuario::findOrFail($id);

        $nuevoEstado = $usuario->usu_estado == 1 ? 0 : 1;
        $usuario->update(['usu_estado' => $nuevoEstado]);

        $mensaje = $nuevoEstado == 1 ? 'Usuario activado exitosamente.' : 'Usuario desactivado exitosamente.';

        return back()->with('success', $mensaje);
    }

    /**
     * Forzar cambio de contraseña
     */
    public function forzarCambioPassword($id)
    {
        $usuario = Usuario::findOrFail($id);

        $usuario->update(['usu_cambio_password' => true]);

        return back()->with('success', 'Se solicitará cambio de contraseña en el próximo inicio de sesión.');
    }
}
