<?php

namespace App\Services;

use App\Models\Area;
use App\Support\AreaPermission;
use Spatie\Permission\Models\Permission;
use Spatie\Permission\Models\Role;

/**
 * Crea permisos area.{code}.operate / .view y los asigna a roles según política documentada en AreaPermissionSeeder.
 *
 * Política (idempotente con givePermissionTo):
 * - Administrador: operate + view de todas las áreas.
 * - Operador: solo .operate por área.
 * - Recepcionista: .view en todas; además .operate en reception (recepción física / cobro).
 */
class AreaPermissionSyncService
{
    public function ensurePermissionsForArea(Area $area): void
    {
        $op = Permission::firstOrCreate(
            ['name' => AreaPermission::operatePermissionName($area->code), 'guard_name' => 'web']
        );
        $vw = Permission::firstOrCreate(
            ['name' => AreaPermission::viewPermissionName($area->code), 'guard_name' => 'web']
        );

        $admin = Role::query()->where('name', 'Administrador')->where('guard_name', 'web')->first();
        $operador = Role::query()->where('name', 'Operador')->where('guard_name', 'web')->first();
        $recepcionista = Role::query()->where('name', 'Recepcionista')->where('guard_name', 'web')->first();

        if ($admin !== null) {
            $admin->givePermissionTo([$op->name, $vw->name]);
        }

        if ($operador !== null) {
            $operador->givePermissionTo([$op->name]);
        }

        if ($recepcionista !== null) {
            $recepcionista->givePermissionTo([$vw->name]);
            if ($area->code === 'reception') {
                $recepcionista->givePermissionTo([$op->name]);
            }
        }
    }
}
