<?php

namespace App\Support;

use App\Models\Area;
use App\Models\User;
use Spatie\Permission\Models\Permission;

/**
 * Autorización por área (Spatie). Convención: area.{code}.operate | area.{code}.view
 *
 * C5: la **asignación física** (`users.area_id` ↔ área escaneada) se valida en
 * {@see \App\Support\UserAreaAssignment} dentro de {@see \App\Services\LaundryWorkflowService::registerScan}.
 *
 * Cómo añadir un área nueva (sin tocar este archivo):
 * 1) Migración o AreaSeeder: insertar fila en `areas` + `area_settings` (is_enabled).
 * 2) Ejecutar `AreaPermissionSeeder` (o `php artisan db:seed --class=AreaPermissionSeeder`): crea los permisos
 *    y los asigna a roles según reglas del seeder.
 * 3) Opcional: ajustar asignación a roles en ese mismo seeder (idempotente con givePermissionTo).
 *
 * Fallback legacy: usuarios con solo `lavanderia.operador` / `lavanderia.consultar` siguen funcionando
 * hasta migrar permisos por área en producción.
 */
class AreaPermission
{
    public static function operatePermissionName(string $areaCode): string
    {
        return 'area.'.$areaCode.'.operate';
    }

    public static function viewPermissionName(string $areaCode): string
    {
        return 'area.'.$areaCode.'.view';
    }

    public static function canOperate(User $user, Area $area): bool
    {
        if (method_exists($user, 'hasRole') && $user->hasRole('Administrador')) {
            return true;
        }

        $name = self::operatePermissionName($area->code);
        if (Permission::query()->where('name', $name)->exists() && $user->can($name)) {
            return true;
        }

        return $user->can('lavanderia.operador');
    }

    public static function canView(User $user, Area $area): bool
    {
        if (method_exists($user, 'hasRole') && $user->hasRole('Administrador')) {
            return true;
        }

        $name = self::viewPermissionName($area->code);
        if (Permission::query()->where('name', $name)->exists() && $user->can($name)) {
            return true;
        }

        return $user->can('lavanderia.consultar');
    }
}
