<?php

declare(strict_types=1);

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

use InvalidArgumentException;
use Seka\Portal\Modul\Statistiky\Entities\Zaznam\Enums\DruhEmisnejKontrolyEnum;
use Seka\Portal\Modul\Statistiky\Entities\Zaznam\Enums\HodnotenieEmisnejKontrolyEnum;

/**
 * Class PocetKontrolPodlaDruhuAHodnotenia
 *
 * @package Seka\Portal\Modul\Statistiky\Entities\Zaznam\ValueObjects
 */
final class PocetKontrolPodlaDruhuAHodnotenia implements PocetKontrol
{
    /**
     * @var \Seka\Portal\Modul\Statistiky\Entities\Zaznam\Enums\DruhEmisnejKontrolyEnum
     */
    private DruhEmisnejKontrolyEnum $druh;

    /**
     * @var \Seka\Portal\Modul\Statistiky\Entities\Zaznam\Enums\HodnotenieEmisnejKontrolyEnum
     */
    private HodnotenieEmisnejKontrolyEnum $hodnotenie;

    /**
     * @var int
     */
    private int $pocet;

    /**
     * PocetKontrolPodlaDruhuAHodnotenia constructor.
     *
     * @param \Seka\Portal\Modul\Statistiky\Entities\Zaznam\Enums\DruhEmisnejKontrolyEnum       $druh
     * @param \Seka\Portal\Modul\Statistiky\Entities\Zaznam\Enums\HodnotenieEmisnejKontrolyEnum $hodnotenie
     * @param int                                                                               $pocet
     */
    public function __construct(DruhEmisnejKontrolyEnum $druh, HodnotenieEmisnejKontrolyEnum $hodnotenie, int $pocet)
    {
        $this->druh = $druh;
        $this->pocet = $pocet;
        $this->hodnotenie = $hodnotenie;
    }

    /**
     * @param \Seka\Portal\Modul\Statistiky\Entities\Zaznam\ValueObjects\PocetKontrolPodlaDruhuAHodnotenia $pocetKontrolPodlaDruhuAHodnotenia
     *
     * @return $this
     */
    public function navysitPocet(self $pocetKontrolPodlaDruhuAHodnotenia): self
    {
        if (
            false === $pocetKontrolPodlaDruhuAHodnotenia->druh->equal($this->druh)
            || false === $pocetKontrolPodlaDruhuAHodnotenia->hodnotenie->equal($this->hodnotenie)
        ) {
            throw new InvalidArgumentException('Navysenie poctu kontrol podla ineho druhu alebo hodnotenia kontroly nie je mozne.');
        }

        return new self(
            $this->druh,
            $this->hodnotenie,
            $this->pocet + $pocetKontrolPodlaDruhuAHodnotenia->pocet()
        );
    }

    /**
     * @return int
     */
    public function pocet(): int
    {
        return $this->pocet;
    }

    /**
     * @param \Seka\Portal\Modul\Statistiky\Entities\Zaznam\ValueObjects\PocetKontrolPodlaDruhuAHodnotenia $pocetKontrolPodlaDruhuAHodnotenia
     *
     * @return bool
     */
    public function equalsDruhAHodnotenie(self $pocetKontrolPodlaDruhuAHodnotenia): bool
    {
        return $this->druh()->equal($pocetKontrolPodlaDruhuAHodnotenia->druh())
            && $this->hodnotenie()->equal($pocetKontrolPodlaDruhuAHodnotenia->hodnotenie());
    }

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

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

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

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