<?php

namespace App\Policies;

use App\Models\User;

/**
 * Gestión de usuarios desde /admin (#124):
 * - super_admin: gestiona a todos.
 * - admin de empresa: gestiona ÚNICAMENTE usuarios de su propia empresa.
 * - supervisor/collector/client: no gestionan usuarios (además ya no acceden al
 *   panel por `canAccessPanel`). Cierra la escalación (antes `canCreate`/`canEdit`
 *   caían a default-allow → un supervisor por URL podía crear un admin).
 */
class UserPolicy
{
    /**
     * super_admin: todo. Roles sin gestión de usuarios: denegado en todo.
     * admin: se evalúa por método (con scope de empresa).
     */
    public function before(User $user, string $ability): ?bool
    {
        if ($user->isSuperAdmin()) {
            return true;
        }

        if (! $user->hasRole('admin')) {
            return false;
        }

        return null;
    }

    public function viewAny(User $user): bool
    {
        return true; // admin (llega por before=null)
    }

    public function view(User $user, User $target): bool
    {
        return $this->sameCompany($user, $target);
    }

    public function create(User $user): bool
    {
        // El UserForm fuerza company_id a la del admin y oculta el rol super_admin.
        return true;
    }

    public function update(User $user, User $target): bool
    {
        return $this->sameCompany($user, $target);
    }

    public function delete(User $user, User $target): bool
    {
        // Solo de su empresa y nunca a sí mismo.
        return $this->sameCompany($user, $target) && $user->id !== $target->id;
    }

    public function deleteAny(User $user): bool
    {
        // El borrado masivo opera sobre la tabla, ya scoped a la empresa del admin.
        return true; // admin (llega por before=null); super_admin ya pasó por before=true
    }

    public function restore(User $user, User $target): bool
    {
        return $this->sameCompany($user, $target);
    }

    public function forceDelete(User $user, User $target): bool
    {
        return $this->sameCompany($user, $target) && $user->id !== $target->id;
    }

    private function sameCompany(User $user, User $target): bool
    {
        return $user->company_id !== null && $user->company_id === $target->company_id;
    }
}
