<?php

declare(strict_types=1);

namespace App\Exceptions;

use RuntimeException;

/**
 * Se lanza cuando una acción excedería un límite del plan de la empresa
 * (usuarios, cobradores, clientes, créditos activos o volumen mensual).
 *
 * Los flujos de creación (panel Filament y API PWA) la capturan para mostrar
 * un mensaje accionable en vez de un 500.
 */
class PlanLimitExceededException extends RuntimeException
{
    public function __construct(
        public readonly string $resource,
        public readonly int|float $limit,
        public readonly ?string $planName,
        string $message,
    ) {
        parent::__construct($message);
    }

    /**
     * @param  string  $resource  etiqueta en plural, p.ej. "clientes", "usuarios", "créditos activos"
     */
    public static function for(string $resource, int|float $limit, ?string $planName): self
    {
        $plan = $planName !== null && $planName !== '' ? " ({$planName})" : '';

        return new self(
            $resource,
            $limit,
            $planName,
            "Alcanzaste el límite de tu plan{$plan}: {$limit} {$resource}. "
                .'Solicita una ampliación del plan para agregar más.',
        );
    }

    public static function forMonthlyVolume(float $limit, ?string $planName): self
    {
        $plan = $planName !== null && $planName !== '' ? " ({$planName})" : '';
        $formatted = '$'.number_format($limit, 0, ',', '.');

        return new self(
            'volumen mensual',
            $limit,
            $planName,
            "Alcanzaste el límite de volumen mensual de tu plan{$plan}: {$formatted}. "
                .'Solicita una ampliación del plan.',
        );
    }

    public static function noActiveSubscription(): self
    {
        return new self(
            'suscripción',
            0,
            null,
            'La empresa no tiene una suscripción activa. Activa un plan para poder crear registros.',
        );
    }
}
