<?php

declare(strict_types=1);

namespace Seka\Portal\Modul\Statistiky\Entities\Zaznam\ValueObjects;

use JsonSerializable;
use Illuminate\Contracts\Support\Arrayable;
use Seka\Portal\Modul\Statistiky\Entities\Zaznam\Enums\DruhSubjektuZaznamuEnum;

/**
 * Class Subjekt
 *
 * @package Seka\Portal\Modul\Statistiky\Entities\Zaznam\ValueObjects
 */
final class Subjekt implements Arrayable, JsonSerializable
{
    /**
     * @var \Seka\Portal\Modul\Statistiky\Entities\Zaznam\Enums\DruhSubjektuZaznamuEnum
     */
    private DruhSubjektuZaznamuEnum $druh;

    /**
     * @var string|null
     */
    private ?string $nazov;

    /**
     * Subjekt constructor.
     *
     * @param \Seka\Portal\Modul\Statistiky\Entities\Zaznam\Enums\DruhSubjektuZaznamuEnum $druh
     * @param string|null                                                                 $nazov
     */
    public function __construct(DruhSubjektuZaznamuEnum $druh, string $nazov = null)
    {
        $this->druh = $druh;
        $this->nazov = $nazov;
    }

    /**
     * @return \Seka\Portal\Modul\Statistiky\Entities\Zaznam\Enums\DruhSubjektuZaznamuEnum
     */
    public function druh(): DruhSubjektuZaznamuEnum
    {
        return $this->druh;
    }

    /**
     * @return string|null
     */
    public function nazov(): ?string
    {
        return $this->nazov;
    }

    /**
     * @param \Seka\Portal\Modul\Statistiky\Entities\Zaznam\ValueObjects\Subjekt $subjekt
     *
     * @return bool
     */
    public function equals(Subjekt $subjekt): bool
    {
        return $this->druh()->equals($subjekt->druh())
            && (!is_null($this->nazov()) && !is_null($subjekt->nazov())) ? (substr_compare($this->nazov(), $subjekt->nazov(), 0) === 0) : (is_null($this->nazov()) && is_null($subjekt->nazov())) ?? false;
    }

    /**
     * @return string
     */
    public function jsonSerialize(): string
    {
        return json_encode($this->toArray());
    }

    /**
     * @return array
     */
    public function toArray(): array
    {
        return [
            'druh' => $this->druh->value,
            'nazov' => $this->nazov,
        ];
    }
}
