<?php

declare(strict_types=1);

namespace App\Support;

use App\Models\User;

/**
 * Construye la respuesta de autenticación de la PWA (rol efectivo, permisos,
 * payload de usuario y Bearer token) de forma canónica.
 *
 * La usa el login por formulario (`Api\Pwa\AuthController`) para producir un
 * shape de `user` y de permisos consistente y sin duplicar lógica.
 */
class PwaAuthResponse
{
    /** Roles permitidos para acceso a la PWA. */
    public const ALLOWED_ROLES = ['collector', 'supervisor', 'admin'];

    /** Rol PWA efectivo (prioridad admin > supervisor > collector). */
    public static function pwaRole(User $user): string
    {
        $roles = $user->getRoleNames();

        if ($roles->contains('admin')) {
            return 'admin';
        }
        if ($roles->contains('supervisor')) {
            return 'supervisor';
        }

        return 'collector';
    }

    /** Permisos derivados del rol. */
    public static function permissions(string $role): array
    {
        return [
            'can_register_payments' => in_array($role, ['collector', 'admin'], true),
            'can_void_payments' => $role === 'admin',
            'can_register_visits' => in_array($role, ['collector', 'supervisor', 'admin'], true),
            'can_create_clients' => in_array($role, ['admin', 'supervisor', 'collector'], true),
            'can_edit_clients' => in_array($role, ['admin', 'supervisor', 'collector'], true),
            'can_create_credits' => in_array($role, ['admin', 'supervisor', 'collector'], true),
            'can_view_all_credits' => in_array($role, ['supervisor', 'admin'], true),
            'can_filter_by_collector' => in_array($role, ['supervisor', 'admin'], true),
        ];
    }

    /** Payload del usuario (mismo shape que devuelve `/api/pwa/auth/login`). */
    public static function userPayload(User $user, string $role): array
    {
        return [
            'id' => $user->id,
            'name' => $user->name,
            'email' => $user->email,
            'phone' => $user->phone,
            'role' => $role,
            'permissions' => self::permissions($role),
            'company' => [
                'id' => $user->company_id,
                'name' => $user->company->name,
            ],
        ];
    }
}
