<?php

namespace App\Support;

use App\Models\Area;
use App\Models\User;

/**
 * C5 — Política de negocio TIBU (`base.md`):
 * - **1 usuario = 1 área** de trabajo en planta (`users.area_id`), no tabla pivote N:N.
 * - Recepcionista puede tener `area_id` null (solo POS/caja); si escanean en recepción física sin área,
 *   se permite solo el área `reception` (permiso area.reception.operate).
 * - Administrador puede escanear en cualquier área (override documentado en LaundryWorkflowService).
 *
 * El permiso Spatie `area.{code}.operate` sigue siendo necesario; esta clase refuerza la estación física.
 */
class UserAreaAssignment
{
    /**
     * @return string|null Mensaje de error para el cliente, o null si puede escanear en $area.
     */
    public static function scanDeniedMessage(User $user, Area $area): ?string
    {
        if ($user->hasRole('Administrador')) {
            return null;
        }

        if ($user->area_id !== null) {
            if ((int) $user->area_id !== (int) $area->id) {
                return 'El área del escaneo no coincide con su área asignada.';
            }

            return null;
        }

        if ($user->hasRole('Recepcionista') && $area->code === 'reception') {
            return null;
        }

        return 'Su usuario no tiene área asignada; no puede registrar escaneos en esta estación.';
    }
}
