<?php

namespace App\Http\Controllers;

use App\Models\Solicitud;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Auth;

class DashboardController extends Controller
{
    public function index()
    {
        $user = Auth::user();

        $esAdmin = $user->isAdmin();
        $esJefe = $user->isRole(['lider', 'jefe de área']);
        $esTecnico = $user->isRole(['técnico']);
        $esDePartamento = $esJefe || $esTecnico; // ve su propio departamento

        // Solicitudes Personales (las que generó el usuario, independientemente de su rol)
        $personalCounts = Solicitud::where('usuario_id', $user->id)
            ->selectRaw('estado, count(*) as count')
            ->groupBy('estado')
            ->pluck('count', 'estado')
            ->toArray();

        $misSolicitudesPersonales = [
            'total'      => array_sum($personalCounts),
            'ingresadas' => $personalCounts['I'] ?? 0,
            'asignadas'  => ($personalCounts['A'] ?? 0) + ($personalCounts['EJ'] ?? 0),
            'en_espera'  => $personalCounts['EE'] ?? 0,
            'conformar'  => $personalCounts['CO'] ?? 0,
            'conformadas'=> $personalCounts['CF'] ?? 0,
            'cerradas'   => $personalCounts['CE'] ?? 0,
        ];

        // Solicitudes Técnicas (Bandeja de trabajo para Admin/Jefe/Técnico)
        $misSolicitudesTecnicas = null;
        
        if ($esAdmin) {
            $adminCounts = Solicitud::selectRaw('estado, count(*) as count')
                ->groupBy('estado')
                ->pluck('count', 'estado')
                ->toArray();

            $misSolicitudesTecnicas = [
                'total'      => array_sum($adminCounts),
                'ingresadas' => $adminCounts['I'] ?? 0,
                'asignadas'  => ($adminCounts['A'] ?? 0) + ($adminCounts['EJ'] ?? 0),
                'en_espera'  => $adminCounts['EE'] ?? 0,
                'conformar'  => $adminCounts['CO'] ?? 0,
                'conformadas'=> $adminCounts['CF'] ?? 0,
                'cerradas'   => $adminCounts['CE'] ?? 0,
            ];
        } elseif ($esDePartamento && $user->canOperateInCurrentModule()) {
            $deptoCounts = Solicitud::where(function ($q) use ($user) {
                    // #9: Filtrar solo asignaciones ACTIVAS (patrón A-04)
                    $q->whereHas('asignaciones', fn($a) => $a->where('analista_id', $user->id)->where('activa', true))
                      ->orWhere(function ($q2) use ($user) {
                          $q2->where('departamento_id', $user->departamento_id)->where('estado', 'I');
                      });
                })
                ->selectRaw('estado, count(*) as count')
                ->groupBy('estado')
                ->pluck('count', 'estado')
                ->toArray();

            $misSolicitudesTecnicas = [
                'total'      => array_sum($deptoCounts),
                'ingresadas' => $deptoCounts['I'] ?? 0,
                'asignadas'  => ($deptoCounts['A'] ?? 0) + ($deptoCounts['EJ'] ?? 0),
                'en_espera'  => $deptoCounts['EE'] ?? 0,
                'conformar'  => $deptoCounts['CO'] ?? 0,
                'conformadas'=> $deptoCounts['CF'] ?? 0,
                'cerradas'   => $deptoCounts['CE'] ?? 0,
            ];
        }

        // === Estadísticas COMO TÉCNICO/ANALISTA (bandeja de trabajo) ===
        $misTareas = [];
        if ($esAdmin || ($esDePartamento && $user->canOperateInCurrentModule())) {
            $misTareas = [
                'pendientes_asignar' => $misSolicitudesTecnicas['ingresadas'] ?? 0,
                // #8: Filtrar solo asignaciones ACTIVAS (patrón A-04)
                'en_mis_manos' => Solicitud::whereIn('estado', ['A', 'EJ'])
                    ->whereHas('asignaciones', fn($q) => $q->where('analista_id', $user->id)->where('activa', true))
                    ->count(),
                'cerradas_por_mi' => Solicitud::where('estado', 'CE')
                    ->whereHas('asignaciones', fn($q) => $q->where('analista_id', $user->id)->where('activa', true))
                    ->count(),
            ];
        }

        // === Actividad reciente ===
        if ($esAdmin || $esJefe || $esTecnico) {
            // Muestra las solicitudes más recientes de su departamento o asignadas ACTIVAMENTE
            $actividadReciente = Solicitud::with([
                    'departamento', 'areaTrabajo', 'usuario',
                    // Cargar solo la asignación activa del usuario actual para verificar acceso en la vista
                    'asignaciones' => fn($q) => $q->where('analista_id', $user->id)->where('activa', true),
                ])
                ->where(function ($q) use ($user, $esAdmin) {
                    if ($esAdmin)
                        return; // sin filtro adicional
                    // A-04: Solo asignaciones ACTIVAS (excluye reasignadas a otro técnico)
                    $q->whereHas('asignaciones', fn($a) => $a->where('analista_id', $user->id)->where('activa', true))
                        ->orWhere(function ($q2) use ($user) {
                            $q2->where('departamento_id', $user->departamento_id)
                               ->where('estado', 'I');
                        });
                })
                ->orderBy('updated_at', 'desc')
                ->limit(5)
                ->get();

            if ($actividadReciente->isEmpty()) {
                $actividadReciente = Solicitud::with(['departamento', 'areaTrabajo', 'asignaciones'])
                    ->where('usuario_id', $user->id)
                    ->orderBy('updated_at', 'desc')
                    ->limit(5)
                    ->get();
            }
        } else {
            $actividadReciente = Solicitud::with(['departamento', 'areaTrabajo'])
                ->where('usuario_id', $user->id)
                ->orderBy('updated_at', 'desc')
                ->limit(5)
                ->get();
        }

        // === Solicitudes que requieren acción inmediata (conformar) ===
        $accionesRequeridas = Solicitud::where('usuario_id', $user->id)
            ->where('estado', 'CO')
            ->orderBy('updated_at', 'desc')
            ->limit(3)
            ->get();

        // $isTecnico se mantiene para compatibilidad con la vista (labels, etc.)
        $isTecnico = $esTecnico || $esJefe;

        $moduloActivo = session('modulo_activo', 'tecnologia');

        return view('dashboard', compact(
            'misSolicitudesPersonales',
            'misSolicitudesTecnicas',
            'misTareas',
            'actividadReciente',
            'accionesRequeridas',
            'isTecnico',
            'moduloActivo'
        ));
    }

    public function markNotificationsAsRead()
    {
        Auth::user()->unreadNotifications->markAsRead();
        return back()->with('success', 'Notificaciones marcadas como leídas.');
    }

    /**
     * Cambiar el módulo activo (Tecnología ↔ Mantenimiento).
     * Actualiza la sesión y redirige al dashboard del módulo seleccionado.
     */
    public function cambiarModulo(\Illuminate\Http\Request $request)
    {
        $request->validate(['modulo' => 'required|in:tecnologia,mantenimiento']);
        $modulo = $request->modulo;
        session(['modulo_activo' => $modulo]);

        // P-06: Advertir si el usuario no pertenece a la gerencia del módulo destino
        $user = auth()->user();
        $tieneAccesoTecnico = true;
        if (!$user->isAdmin()) {
            if ($modulo === 'mantenimiento' && !$user->perteneceAGerenciaMantenimiento()) {
                $tieneAccesoTecnico = false;
            } elseif ($modulo === 'tecnologia' && !$user->perteneceAGerenciaTecnologia()) {
                $tieneAccesoTecnico = false;
            }
        }

        $msg = 'Módulo cambiado a: ' . ucfirst($modulo);
        if (!$tieneAccesoTecnico) {
            $msg .= '. Nota: Puede crear solicitudes, pero no tendrá acceso a funciones técnicas (recepción, ejecución, reportes) en este módulo.';
        }

        return redirect()->route('dashboard')->with('success', $msg);
    }
}
