<?php

namespace WMS\Controllers;

use WMS\Core\Request;
use WMS\Core\Response;
use WMS\Helpers\Validator;
use WMS\Middleware\AuthMiddleware;
use WMS\Repositories\MenuRepository;

/**
 * MenuController - Lectura del menu dinamico segun rol del usuario,
 * y administracion de la matriz de permisos (admin only).
 */
class MenuController
{
    /**
     * GET /api/menu
     * Devuelve el menu visible para el rol del usuario autenticado.
     */
    public static function index(array $params): void
    {
        $user = AuthMiddleware::user();
        $role = strtolower((string)($user['role'] ?? 'op_almacen'));
        try {
            $repo = new MenuRepository();
            $menu = $repo->getMenuForRole($role);
            Response::success($menu, 'OK');
        } catch (\Throwable $e) {
            Response::error('Error al cargar menu: ' . $e->getMessage(), 500);
        }
    }

    /**
     * GET /api/menu/matrix
     * Matriz completa rol -> item -> access. Solo admin (la policy lo gates).
     */
    public static function matrix(array $params): void
    {
        try {
            $repo = new MenuRepository();
            Response::success($repo->fullMatrix(), 'OK');
        } catch (\Throwable $e) {
            Response::error('Error al cargar matriz: ' . $e->getMessage(), 500);
        }
    }

    /**
     * PUT /api/menu/items/{id}/access
     * Reemplaza permisos para un item dado.
     * Body: { perms: [{role:'op_almacen', access_type:'FULL'}, ...] }
     */
    public static function setItemAccess(array $params): void
    {
        $itemId = (int)($params['id'] ?? 0);
        if ($itemId <= 0) {
            Response::error('id invalido', 422);
            return;
        }
        $body = Request::body();
        $v = (new Validator($body))->required(['perms']);
        if (!$v->passes()) {
            Response::error('Datos invalidos', 422, $v->errors());
            return;
        }
        if (!is_array($body['perms'])) {
            Response::error('perms debe ser array', 422);
            return;
        }
        try {
            $repo = new MenuRepository();
            $repo->replaceItemAccess($itemId, $body['perms']);
            Response::success(null, 'Permisos actualizados');
        } catch (\Throwable $e) {
            Response::error('Error al actualizar: ' . $e->getMessage(), 500);
        }
    }
}
