<?php

namespace Tests\Unit;

use App\Models\Usuario;
use PHPUnit\Framework\TestCase;

class UsuarioRoleTest extends TestCase
{
    public function test_it_normalizes_legacy_cargos_to_canonical_roles(): void
    {
        $this->assertSame(Usuario::ROLE_SUPERUSUARIO, Usuario::resolveRoleKey('Superusuario', 8));
        $this->assertSame(Usuario::ROLE_ADMINISTRADOR, Usuario::resolveRoleKey('Administrador del Sistema', null));
        $this->assertSame(Usuario::ROLE_ADMINISTRADOR, Usuario::resolveRoleKey('JEFE DE ALMACEN', 1));
        $this->assertSame(Usuario::ROLE_SUPERVISOR, Usuario::resolveRoleKey('SUPERVISOR', 5));
        $this->assertSame(Usuario::ROLE_DESPACHADOR, Usuario::resolveRoleKey('DESPACHADOR', 6));
        $this->assertSame(Usuario::ROLE_ALMACENISTA, Usuario::resolveRoleKey('OPERADOR DE GRUA DE 1RA', 4));
        $this->assertSame(Usuario::ROLE_SOLICITANTE, Usuario::resolveRoleKey('Solicitante', 7));
    }

    public function test_it_exposes_module_access_from_canonical_role(): void
    {
        $superusuario = new Usuario(['cargo' => 'Superusuario', 'tipo' => 8]);
        $admin = new Usuario(['cargo' => 'Administrador', 'tipo' => 1]);
        $almacenista = new Usuario(['cargo' => 'Almacenista', 'tipo' => 2]);
        $supervisor = new Usuario(['cargo' => 'Supervisor', 'tipo' => 5]);
        $despachador = new Usuario(['cargo' => 'Despachador', 'tipo' => 6]);
        $gestor = new Usuario(['cargo' => 'Gestor', 'tipo' => 3]);
        $solicitante = new Usuario(['cargo' => 'Solicitante', 'tipo' => 7]);
        $desconocido = new Usuario(['cargo' => 'Invitado', 'tipo' => null]);

        $this->assertTrue($superusuario->isSuperusuario());
        $this->assertTrue($superusuario->isAdmin());
        $this->assertTrue($superusuario->canAccessAdministracion());
        $this->assertTrue($superusuario->canAccessAlmacen());
        $this->assertTrue($superusuario->canAccessAsignacion());
        $this->assertTrue($superusuario->canAccessManualAdministrador());
        $this->assertTrue($superusuario->canAccessShipMarket());
        $this->assertTrue($superusuario->canAccessReportes());
        $this->assertTrue($superusuario->canAccessGraficas());
        $this->assertTrue($superusuario->hasAnyRole([Usuario::ROLE_GESTOR]));

        $this->assertTrue($admin->canAccessAdministracion());
        $this->assertTrue($admin->canAccessAlmacen());
        $this->assertTrue($admin->canAccessAsignacion());
        $this->assertTrue($admin->canAccessManualAdministrador());

        $this->assertTrue($almacenista->canAccessAdministracion());
        $this->assertTrue($almacenista->canAccessAlmacen());
        $this->assertFalse($almacenista->canAccessAsignacion());
        $this->assertTrue($almacenista->canAccessManualAdministrador());

        $this->assertTrue($supervisor->canAccessAdministracion());
        $this->assertTrue($supervisor->canAccessAlmacen());
        $this->assertFalse($supervisor->canAccessAsignacion());
        $this->assertTrue($supervisor->canAccessManualAdministrador());
        $this->assertTrue($supervisor->hasAnyRole([Usuario::ROLE_ALMACENISTA]));

        $this->assertTrue($despachador->canAccessAdministracion());
        $this->assertTrue($despachador->canAccessAlmacen());
        $this->assertFalse($despachador->canAccessAsignacion());
        $this->assertTrue($despachador->canAccessManualAdministrador());
        $this->assertTrue($despachador->hasAnyRole([Usuario::ROLE_ALMACENISTA]));

        $this->assertTrue($gestor->canAccessAdministracion());
        $this->assertFalse($gestor->canAccessAlmacen());
        $this->assertTrue($gestor->canAccessAsignacion());
        $this->assertTrue($gestor->canAccessManualAdministrador());

        $this->assertFalse($solicitante->canAccessAdministracion());
        $this->assertFalse($solicitante->canAccessAlmacen());
        $this->assertFalse($solicitante->canAccessAsignacion());
        $this->assertFalse($solicitante->canAccessManualAdministrador());
        $this->assertTrue($solicitante->canAccessShipMarket());
        $this->assertFalse($solicitante->canAccessReportes());
        $this->assertFalse($solicitante->canAccessGraficas());

        $this->assertFalse($desconocido->canAccessManualAdministrador());
    }
}