<?php

use App\Http\Controllers\ProfileController;
use App\Http\Controllers\AsignacionController;
use App\Http\Controllers\ConformacionController;
use App\Http\Controllers\DashboardController;
use App\Http\Controllers\EjecucionController;
use App\Http\Controllers\SolicitudController;
use Illuminate\Support\Facades\Route;

Route::get('/', function () {
    return redirect()->route('login');
});

Route::get('/dashboard', [DashboardController::class, 'index'])
    ->middleware(['auth', 'verified'])
    ->name('dashboard');

Route::post('/notifications/read', [DashboardController::class, 'markNotificationsAsRead'])
    ->middleware('auth')
    ->name('notifications.read');

Route::post('/modulo/cambiar', [DashboardController::class, 'cambiarModulo'])
    ->middleware('auth')
    ->name('modulo.cambiar');

Route::middleware('auth')->group(function () {
    Route::get('/profile', [ProfileController::class, 'edit'])->name('profile.edit');
    Route::patch('/profile', [ProfileController::class, 'update'])->name('profile.update');
    //Route::delete('/profile', [ProfileController::class, 'destroy'])->name('profile.destroy');

    // Modulo Solicitudes
    // M-04: Se agregan las rutas edit/update para la modificación de solicitudes ingresadas
    Route::resource('solicitudes', SolicitudController::class)->only(['index', 'create', 'store', 'destroy', 'edit', 'update']);
    Route::post('solicitudes/{solicitude}/cerrar', [SolicitudController::class, 'cerrar'])->name('solicitudes.cerrar');

    // Modulo Asignaciones (Recepción)
    Route::resource('asignaciones', AsignacionController::class)->only(['index', 'update', 'show']);

    // Modulo Ejecuciones (Atención de Ticket)
    Route::resource('ejecuciones', EjecucionController::class)->only(['index', 'update', 'show']);
    Route::post('ejecuciones/{ejecucione}/cerrar', [EjecucionController::class, 'cerrar'])->name('ejecuciones.cerrar');

    // Modulo Conformaciones (Cierre por el Solicitante)
    Route::resource('conformaciones', ConformacionController::class)->only(['index', 'show', 'update']);

    // API: Gerencias por Dirección (para selects dinámicos)
    Route::get('/api/direcciones/{direccion}/gerencias', function (\App\Models\Direccion $direccion) {
        return response()->json($direccion->gerencias()->where('activo', true)->get(['id', 'nombre']));
    });

    // API: Departamentos por Gerencia (para selects dinámicos)
    Route::get('/api/gerencias/{gerencia}/departamentos', function (\App\Models\Gerencia $gerencia) {
        return response()->json($gerencia->departamentos()->where('activo', true)->get(['id', 'nombre']));
    });

    // API: Analistas asignables por Departamento (para selects en cascada en Recepción)
    // #10: Filtrar por cargo en SQL en lugar de cargar todos y filtrar en PHP
    // P-04: Filtrar también por gerencia del módulo activo para evitar asignaciones cruzadas
    Route::get('/api/departamentos/{id}/analistas', function (string $id) {
        $gerenciaIds = \App\Models\Departamento::gerenciaIdsDelModuloActivo();
        $usuarios = \App\Models\User::where('departamento_id', $id)
            ->whereIn('cargo', ['Admin', 'Administrador', 'Técnico', 'Jefe de Área'])
            ->where(function ($q) use ($gerenciaIds) {
                $q->whereHas('departamento', fn($d) => $d->whereIn('gerencia_id', $gerenciaIds))
                  ->orWhereIn('cargo', ['Admin', 'Administrador']); // Admins siempre visibles
            })
            ->orderBy('name')
            ->get()
            ->map(fn($u) => [
                'id' => $u->id,
                'name' => trim($u->name . ' ' . $u->apellido),
            ]);
        return response()->json($usuarios);
    });
});

Route::middleware(['auth', 'admin'])->prefix('admin')->name('admin.')->group(function () {
    Route::resource('departamentos', App\Http\Controllers\Admin\DepartamentoController::class);
    Route::resource('area_trabajos', App\Http\Controllers\Admin\AreaTrabajoController::class);
    // IMPORTANTE: buscar-cedula debe ir ANTES del resource para evitar conflicto con {user}
    Route::get('users/buscar-cedula', [App\Http\Controllers\Admin\UserController::class, 'buscarPorCedula'])->name('users.buscar-cedula');
    Route::resource('users', App\Http\Controllers\Admin\UserController::class);
});

Route::middleware('auth')->group(function () {
    Route::get('/reportes', [App\Http\Controllers\ReportesController::class, 'index'])->name('reportes.index');
    Route::get('/reportes/generate', [App\Http\Controllers\ReportesController::class, 'generate'])->name('reportes.generate');
});

require __DIR__ . '/auth.php';
