<?php
/**
 * WMS PRO - Politica de roles por endpoint (Xpert Menu v1.0)
 *
 * Reglas:
 *   - admin: bypass total (no requiere estar en allowed).
 *   - readonly_roles (auditor, viewer): solo se les permite GET.
 *   - legacy: roles legacy se mapean a equivalentes nuevos al chequear allowed.
 *   - rules[]: triplete [METHOD, PATH_PATTERN, allowed_roles]. Soporta {param}.
 *     - Si la regla matchea metodo+path y el rol del usuario no esta en
 *       allowed (tras aplicar legacy), se deniega 403.
 *   - Si ninguna regla matchea, default ALLOW (cualquier autenticado).
 *
 * Solo se enumeran las rutas sensibles del docx (sec. 4 matriz visibilidad).
 * El resto queda con el comportamiento previo (JWT-only).
 */
return [

    'readonly_roles' => ['auditor', 'viewer'],

    'legacy' => [
        'operator' => ['op_almacen', 'op_picking', 'op_recepcion'],
        'viewer'   => ['auditor'],
        // 'xpert' es superusuario: se trata como equivalente a admin en todas las reglas.
        'xpert'    => ['admin'],
    ],

    'rules' => [

        // Gestion de usuarios -- admin only (excepto /operators que se usa
        // para asignacion de tareas y debe ser accesible a Supervisor/Jefe/Ops)
        ['GET',    '/api/users/operators',                      ['supervisor', 'jefe', 'op_recepcion', 'op_almacen', 'op_picking', 'qa_liberador', 'qc_muestrista']],
        ['GET',    '/api/users',                                ['admin']],
        ['GET',    '/api/users/{id}',                           ['admin']],
        ['POST',   '/api/users',                                ['admin']],
        ['PUT',    '/api/users/{id}',                           ['admin']],
        ['DELETE', '/api/users/{id}',                           ['admin']],

        // Roles (CRUD) -- admin only
        ['GET',    '/api/roles',                                ['admin']],
        ['GET',    '/api/roles/{id}',                           ['admin']],
        ['POST',   '/api/roles',                                ['admin']],
        ['PUT',    '/api/roles/{id}',                           ['admin']],
        ['DELETE', '/api/roles/{id}',                           ['admin']],

        // Settings / password policy -- admin only
        ['POST',   '/api/settings/password-policy',             ['admin']],

        // QA aprobaciones de lote (firma electronica QA Liberador)
        ['POST',   '/api/qa/batches/{batch_id}/approve',        ['admin']],
        ['POST',   '/api/qa/batches/{batch_id}/reject',         ['admin']],
        ['POST',   '/api/qa/batches/{batch_id}/quarantine',     ['admin']],

        // Stock blocking -- QA o Jefe
        ['POST',   '/api/stock/batches/{batch_id}/block',       ['admin']],
        ['POST',   '/api/stock/batches/{batch_id}/release',     ['admin']],

        // Items: bloqueo de ingreso -- QA Liberador / Jefe
        ['POST',   '/api/items/block-entry',                    ['qa_liberador', 'jefe']],

        // Sincronizacion SAP -- Jefe / Admin
        ['POST',   '/api/sap/sync-items',                       ['jefe']],
        ['POST',   '/api/sap/sync-warehouses',                  ['jefe']],

        // Crear Solicitud de Traslado en SAP -- Op. Almacen / Supervisor / Jefe
        ['POST',   '/api/sap/transfer-requests',                ['op_almacen', 'supervisor', 'jefe']],

        // Recall (DINAVISA) -- QA Liberador / Jefe
        ['POST',   '/api/recalls',                              ['qa_liberador', 'jefe']],
        ['POST',   '/api/recalls/{id}/execute',                 ['qa_liberador', 'jefe']],
        ['POST',   '/api/recalls/{id}/complete',                ['qa_liberador', 'jefe']],

        // SOPs (DINAVISA) -- QA Liberador escribe; admin gestiona
        ['POST',   '/api/sops',                                 ['qa_liberador']],
        ['PUT',    '/api/sops/{id}',                            ['qa_liberador']],
        ['POST',   '/api/sops/{id}/approve',                    ['qa_liberador']],

        // Ajuste directo -- Supervisor solicita / Jefe aprueba
        ['POST',   '/api/adjustments/direct',                   ['supervisor', 'jefe']],

        // Conteo ciclico: aprobacion de diferencias -- Jefe
        ['POST',   '/api/cycle-counts/lines/{line_id}/approve', ['jefe']],

        // Expedicion: cierre de despacho -- Supervisor / Jefe (firma)
        ['POST',   '/api/dispatch/{id}/close',                  ['supervisor', 'jefe']],

        // Transferencias inter-almacen -- Supervisor / Jefe (firma);
        // create lo permitimos a Op. Almacen para que pueda iniciar el flujo,
        // pero el complete/sync queda restringido.
        ['POST',   '/api/transfers',                            ['op_almacen', 'supervisor', 'jefe']],
        ['POST',   '/api/transfers/{id}/complete',              ['supervisor', 'jefe']],
        ['POST',   '/api/transfers/{id}/sync-sap',              ['supervisor', 'jefe']],

        // Muestreo QA -- QC Muestrista / QA Liberador (firma en sample y complete)
        ['POST',   '/api/sampling',                             ['qc_muestrista', 'qa_liberador']],
        ['POST',   '/api/sampling/{id}/assign',                 ['qc_muestrista', 'qa_liberador']],
        ['POST',   '/api/sampling/{id}/deliver',                ['qc_muestrista', 'qa_liberador']],
        ['POST',   '/api/sampling/{id}/sample',                 ['qc_muestrista', 'qa_liberador']],
        ['POST',   '/api/sampling/{id}/complete',               ['qa_liberador']],
        ['POST',   '/api/sampling/{id}/cancel',                 ['qa_liberador', 'jefe']],

        // QC Externo -- QC Muestrista / QA Liberador
        ['POST',   '/api/qc/external/assign',                   ['qc_muestrista', 'qa_liberador']],
        ['POST',   '/api/qc/external/approve',                  ['qa_liberador']],
        ['POST',   '/api/qc/external/reject',                   ['qa_liberador']],
        ['POST',   '/api/qc/config',                            ['qa_liberador']],

        // Temperatura -- QA Liberador / Supervisor / Jefe
        ['POST',   '/api/temperature/zones',                    ['qa_liberador', 'jefe']],
        ['POST',   '/api/temperature/readings',                 ['qa_liberador', 'supervisor', 'jefe']],
        ['POST',   '/api/temperature/alerts/{id}/acknowledge',  ['qa_liberador', 'supervisor', 'jefe']],

        // Menu config (Sec. 5.2) -- matrix y edicion solo admin
        ['GET',    '/api/menu/matrix',                       ['admin']],
        ['PUT',    '/api/menu/items/{id}/access',            ['admin']],

        // Permisos RF -- matrix y edicion solo admin
        ['GET',    '/api/rf-matrix',                         ['admin']],
        ['PUT',    '/api/rf-access/{view_key}',              ['admin']],

        // Bins / Ubicaciones - escritura: admin / jefe; lectura: cualquier autenticado
        ['POST',   '/api/bins',                                 ['admin', 'jefe']],
        ['PUT',    '/api/bins/{id}',                            ['admin', 'jefe']],
        ['DELETE', '/api/bins/{id}',                            ['admin', 'jefe']],

        // Reglas de notificacion -- admin
        ['POST',   '/api/notifications/rules',                  ['admin']],

    ],
];
