<?php

declare(strict_types=1);

final class MyronTierPolicy
{
    public const UNLIMITED = 'unlimited';

    /**
     * @return array<string, int|string|bool|null>
     */
    public static function limitsFor(string $tier): array
    {
        $tier = MyronLicenseTier::normalize($tier);

        return [
            'sites' => self::siteLimit($tier) ?? self::UNLIMITED,
            'operators' => self::operatorLimit($tier) ?? self::UNLIMITED,
            'deployment_environments' => self::deploymentEnvironmentLimit($tier) ?? self::UNLIMITED,
            'white_label' => $tier === MyronLicenseTier::ENTERPRISE,
            'cmsaas_rights' => $tier === MyronLicenseTier::ENTERPRISE,
            'custom_contract_sla' => $tier === MyronLicenseTier::ENTERPRISE,
            'partner_assignment' => $tier === MyronLicenseTier::PARTNER,
        ];
    }

    public static function siteLimit(string $tier): ?int
    {
        return match (MyronLicenseTier::normalize($tier)) {
            MyronLicenseTier::PRO => 10,
            MyronLicenseTier::AGENCY => 50,
            MyronLicenseTier::ENTERPRISE => null,
            default => 1,
        };
    }

    public static function operatorLimit(string $tier): ?int
    {
        return MyronLicenseTier::normalize($tier) === MyronLicenseTier::CORE ? 3 : null;
    }

    public static function deploymentEnvironmentLimit(string $tier): ?int
    {
        return match (MyronLicenseTier::normalize($tier)) {
            MyronLicenseTier::PRO,
            MyronLicenseTier::AGENCY,
            MyronLicenseTier::PARTNER => 4,
            MyronLicenseTier::ENTERPRISE => null,
            default => 1,
        };
    }

    public static function requiresDeploymentKey(string $tier): bool
    {
        return in_array(MyronLicenseTier::normalize($tier), [MyronLicenseTier::PRO, MyronLicenseTier::AGENCY, MyronLicenseTier::PARTNER], true);
    }
}
