<?php

namespace App\Values;

use App\Models\License;
use Webmozart\Assert\Assert;

final class LicenseStatus
{
    public const STATUS_VALID = 1;
    public const STATUS_INVALID = 2;
    public const STATUS_NO_LICENSE = 3;
    public const STATUS_UNKNOWN = 4;

    private function __construct(public int $status, public ?License $license)
    {
        Assert::oneOf($this->status, [
            self::STATUS_NO_LICENSE,
            self::STATUS_INVALID,
            self::STATUS_VALID,
            self::STATUS_UNKNOWN,
        ]);
    }

    public function isValid(): bool
    {
        return $this->status === self::STATUS_VALID;
    }

    public function hasNoLicense(): bool
    {
        return $this->status === self::STATUS_NO_LICENSE;
    }

    public static function noLicense(): self
    {
        return new self(self::STATUS_NO_LICENSE, null);
    }

    public static function valid(License $license): self
    {
        return new self(self::STATUS_VALID, $license);
    }

    public static function invalid(License $license): self
    {
        return new self(self::STATUS_INVALID, $license);
    }

    public static function unknown(License $license): self
    {
        return new self(self::STATUS_UNKNOWN, $license);
    }
}