<?php

use Illuminate\Support\Facades\Route;

use App\Http\Controllers\AuthController;
use App\Http\Controllers\Roles\RolController;
use App\Http\Controllers\Roles\PermissionController;
use App\Http\Controllers\GradoController;
use App\Http\Controllers\ArmaController;
use App\Http\Controllers\EspecialidadeController;
use App\Http\Controllers\PersonaController;
use App\Http\Controllers\UnidadController;
use App\Http\Controllers\PushController;
use App\Http\Controllers\UsuarioController;
use App\Http\Controllers\MisionController;
use App\Http\Controllers\ReporteController;
use App\Http\Controllers\ReporteOperativoController;
use App\Http\Controllers\NotificacionOperativaController;

/*
|--------------------------------------------------------------------------
| AUTENTICACIÓN
|--------------------------------------------------------------------------
*/

Route::group(['prefix' => 'auth'], function ($router) {
    Route::post('/register', [AuthController::class, 'register'])->name('register');
    Route::post('/login', [AuthController::class, 'login'])->name('login');

    Route::post('/logout', [AuthController::class, 'logout'])
        ->middleware(['auth:api', 'jwt.csrf'])
        ->name('logout');

    Route::post('/refresh', [AuthController::class, 'refresh'])
        ->middleware(['auth:api', 'jwt.csrf'])
        ->name('refresh');

    Route::post('/me', [AuthController::class, 'me'])
        ->middleware(['auth:api', 'jwt.csrf'])
        ->name('me');

    Route::post('/change-password', [AuthController::class, 'changePassword'])
        ->middleware(['auth:api', 'jwt.csrf'])
        ->name('change-password');

    Route::post('/savemonitoreo', [AuthController::class, 'savemonitoreo'])
        ->middleware(['auth:api', 'jwt.csrf'])
        ->name('savemonitoreo');

    /*
|--------------------------------------------------------------------------
| OPERACIONES ASIGNADAS AL PERSONAL - APLICACIÓN ANDROID
|--------------------------------------------------------------------------
*/
    Route::get('/mis-operaciones', [AuthController::class, 'misOperacionesMovil'])
        ->middleware(['auth:api', 'jwt.csrf'])
        ->name('mis-operaciones');
});

/*
|--------------------------------------------------------------------------
| RUTAS PROTEGIDAS
|--------------------------------------------------------------------------
*/
Route::group(['middleware' => ['auth:api', 'jwt.csrf']], function ($router) {

    /*
    |----------------------------------------------------------------------
    | P-3 - REPORTES DIARIOS DE UNIDAD
    |----------------------------------------------------------------------
    */
    Route::post('/reporte-operativo/preview-unidad', [ReporteOperativoController::class, 'previewUnidad']);
    Route::post('/reporte-operativo/guardar-borrador-unidad', [ReporteOperativoController::class, 'guardarBorradorUnidad']);
    Route::post('/reporte-operativo/{id}/enviar-g3', [ReporteOperativoController::class, 'enviarUnidadAG3']);

    /*
    |----------------------------------------------------------------------
    | ROLES Y PERMISOS
    |----------------------------------------------------------------------
    */
    Route::resource('roles', RolController::class);
    Route::resource('permissions', PermissionController::class);

    /*
    |----------------------------------------------------------------------
    | GRADOS / ARMAS / ESPECIALIDADES
    |----------------------------------------------------------------------
    */
    Route::resource('grados', GradoController::class);
    Route::resource('armas', ArmaController::class);
    Route::resource('especialidades', EspecialidadeController::class);

    /*
    |----------------------------------------------------------------------
    | PERSONAL
    |----------------------------------------------------------------------
    */
    Route::post('personalist', [PersonaController::class, 'index']);
    Route::resource('personas', PersonaController::class);
    Route::post('getgrados', [PersonaController::class, 'getgrados']);
    Route::post('getespecialidades', [PersonaController::class, 'getespecialidades']);
    Route::post('getarmas', [PersonaController::class, 'getarmas']);

    /*
    |----------------------------------------------------------------------
    | USUARIOS
    |----------------------------------------------------------------------
    */
    Route::resource('users', UsuarioController::class);
    Route::get('getunidades', [UsuarioController::class, 'getunidades']);
    Route::get('getroles', [UsuarioController::class, 'getroles']);
    Route::post('getpersonal', [UsuarioController::class, 'getpersonal']);

    /*
    |----------------------------------------------------------------------
    | UNIDADES
    |----------------------------------------------------------------------
    */
    Route::resource('unidades', UnidadController::class);

    Route::post('unidades/{id}/logo', [UnidadController::class, 'updateLogo'])
        ->middleware('permission:edit_unidad');

    Route::patch('unidades/{id}/estado', [UnidadController::class, 'toggleEstado'])
        ->middleware('permission:edit_unidad');

    Route::post('getunidades', [UnidadController::class, 'getunidades']);
    Route::get('mapaunisups', [UnidadController::class, 'mapaunisups']);
    Route::get('mapadivision', [UnidadController::class, 'mapadivision']);
    Route::get('markers', [UnidadController::class, 'markers']);
    Route::get('markersunidad', [UnidadController::class, 'markersunidad']);

    /*
    |----------------------------------------------------------------------
    | MISIONES Y PERSONAL ASIGNADO
    |----------------------------------------------------------------------
    */
    Route::resource('misiones', MisionController::class);
    Route::get('listmisionesunidades', [MisionController::class, 'listmisionesunidades']);
    Route::get('listmisionesunidad/{uni_cod}', [MisionController::class, 'listmisionesunidad']);
    Route::get('listmisionespersonal/{mision_cod}', [MisionController::class, 'listmisionespersonal']);
    Route::post('storemisionespersonal', [MisionController::class, 'storemisionespersonal']);

    // P-3: actualizar la fecha de relevo de una asignación de su unidad.
    // El controlador valida el rol, la unidad y el estado de la asignación.
    Route::patch('actualizar-fecha-relevo/{mitem_cod}', [MisionController::class, 'actualizarFechaRelevo']);

    Route::delete('destroymisionespersonal/{mitem_cod}', [MisionController::class, 'destroymisionespersonal']);
    Route::get('listmisionesdivisiones', [MisionController::class, 'listmisionesdivisiones']);

    /*
    |----------------------------------------------------------------------
    | CONSULTAS DE UNIDADES
    |----------------------------------------------------------------------
    */
    Route::get('get-unidades-padre', [UnidadController::class, 'getUnidadesPadre']);
    Route::get('get-unidades-hijas', [UnidadController::class, 'getUnidadesHijas']);
    Route::get('get-unidad/{codigo}', [UnidadController::class, 'getUnidadById']);
    Route::get('divisiones', [UnidadController::class, 'divisiones']);
    Route::get('unidependientes/{uni_cod}', [UnidadController::class, 'unidependientes']);

    /*
    |----------------------------------------------------------------------
    | PUESTOS
    |----------------------------------------------------------------------
    */
    Route::get('listpuestos/{uni_cod}', [UnidadController::class, 'listpuestos']);
    Route::post('storepuesto', [UnidadController::class, 'storepuesto']);
    Route::get('showpuesto/{uni_cod}', [UnidadController::class, 'showpuesto']);
    Route::put('updatepuesto/{puesto_cod}', [UnidadController::class, 'updatepuesto']);
    Route::delete('destroypuesto/{puesto_cod}', [UnidadController::class, 'destroypuesto']);

    /*
    |----------------------------------------------------------------------
    | MONITOREO POR PUESTOS Y MISIONES
    |----------------------------------------------------------------------
    */
    Route::get('getpuestosunidad/{uni_cod}', [UnidadController::class, 'getpuestosunidad']);
    Route::get('getmisionespuestos/{puesto_cod}', [UnidadController::class, 'getmisionespuestos']);
    Route::get('getpersonalmision/{mision_cod}', [UnidadController::class, 'getpersonalmision']);
    Route::get('markers-por-mision/{mision_cod}', [UnidadController::class, 'getMarkersPorMision']);
    Route::get('control-monitoreo-diario/{mision_cod}', [UnidadController::class, 'controlMonitoreoDiario']);
    Route::get('puestogeojson/{puesto_cod}', [UnidadController::class, 'puestogeojson']);
    Route::get('listunidadesdependientes/{uni_cod}', [UnidadController::class, 'listunidadesdependientes']);
    Route::get('dashboard', [UnidadController::class, 'dashboard']);

    /*
    |----------------------------------------------------------------------
    | REPORTES GENERALES
    |----------------------------------------------------------------------
    */
    Route::match(['get', 'post'], '/reportes', [ReporteController::class, 'reportes']);
    Route::get('/listparamreportes', [ReporteController::class, 'listparamreportes']);

    /*
    |----------------------------------------------------------------------
    | REPORTES OPERATIVOS: G-3 - CONSULTAS
    |----------------------------------------------------------------------
    */
    Route::get('/reporte-operativo/reportes-recibidos-g3', [ReporteOperativoController::class, 'reportesRecibidosG3']);
    Route::get('/reporte-operativo/consultar-consolidado-diario', [ReporteOperativoController::class, 'consultarConsolidadoDiario']);

    /*
    |----------------------------------------------------------------------
    | G-3 - ACCIONES SOBRE REPORTES DE UNIDAD
    |----------------------------------------------------------------------
    */
    Route::post('/reporte-operativo/{id}/recibir-g3', [ReporteOperativoController::class, 'recibirReporteG3']);
    Route::post('/reporte-operativo/{id}/observar-g3', [ReporteOperativoController::class, 'observarReporteG3']);
    Route::post('/reporte-operativo/{id}/aprobar-g3', [ReporteOperativoController::class, 'aprobarReporteG3']);

    /*
    |----------------------------------------------------------------------
    | G-3 - CONSOLIDADO DE DIVISIÓN
    |----------------------------------------------------------------------
    */
    Route::post('/reporte-operativo/crear-consolidado-division', [ReporteOperativoController::class, 'crearConsolidadoDivision']);
    Route::post('/reporte-operativo/{id}/enviar-consolidado-admin', [ReporteOperativoController::class, 'enviarConsolidadoAdmin']);

    /*
    |----------------------------------------------------------------------
    | ADMINISTRADOR DPTO. III
    |----------------------------------------------------------------------
    */
    Route::post('/reporte-operativo/{id}/recibir-consolidado-admin', [ReporteOperativoController::class, 'recibirConsolidadoAdmin']);
    Route::post('/reporte-operativo/{id}/observar-consolidado-admin', [ReporteOperativoController::class, 'observarConsolidadoAdmin']);
    Route::post('/reporte-operativo/{id}/aprobar-consolidado-admin', [ReporteOperativoController::class, 'aprobarConsolidadoAdmin']);

    /*
    |----------------------------------------------------------------------
    | G-3 - CONTROL Y NOTIFICACIONES DE REPORTES DIARIOS
    |----------------------------------------------------------------------
    */
    Route::get('/reporte-operativo/control-diario-g3', [ReporteOperativoController::class, 'controlDiarioReportesG3']);
    Route::post('/reporte-operativo/notificar-pendientes-g3', [ReporteOperativoController::class, 'notificarReportesPendientesG3']);

    /*
    |----------------------------------------------------------------------
    | CONSULTAR UN REPORTE OPERATIVO
    |----------------------------------------------------------------------
    | Esta ruta dinámica GET debe permanecer después de las rutas GET
    | estáticas de reporte-operativo.
    */
    Route::get('/reporte-operativo/{id}', [ReporteOperativoController::class, 'verReporteOperativo']);

    /*
    |----------------------------------------------------------------------
    | NOTIFICACIONES OPERATIVAS
    |----------------------------------------------------------------------
    */
    Route::get('/notificaciones-operativas', [NotificacionOperativaController::class, 'index']);
    Route::get('/notificaciones-operativas/contador', [NotificacionOperativaController::class, 'contador']);
    Route::patch('/notificaciones-operativas/{id}/leida', [NotificacionOperativaController::class, 'marcarLeida']);
    Route::patch('/notificaciones-operativas/{id}/nueva', [NotificacionOperativaController::class, 'marcarNueva']);
    Route::patch('/notificaciones-operativas/{id}/archivar', [NotificacionOperativaController::class, 'archivar']);
});

/*
|--------------------------------------------------------------------------
| PUSH
|--------------------------------------------------------------------------
*/
Route::post('/token', [PushController::class, 'saveToken']);
Route::get('/send', [PushController::class, 'send']);
