<?php

declare(strict_types=1);

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

use InvalidArgumentException;
use Seka\Portal\Modul\Statistiky\Entities\Zaznam\Enums\DruhPalivaEnum;
use Seka\Portal\Modul\Statistiky\Entities\Zaznam\Enums\EmisnySystemEnum;

/**
 * Class PocetKontrolPodlaDruhuPalivaAEmisnehoSystemuVozidla
 *
 * @package Seka\Portal\Modul\Statistiky\Entities\Zaznam\ValueObjects
 */
class PocetKontrolPodlaDruhuPalivaAEmisnehoSystemuVozidla implements PocetKontrol
{
    /**
     * @var \Seka\Portal\Modul\Statistiky\Entities\Zaznam\Enums\DruhPalivaEnum
     */
    private DruhPalivaEnum $druhPaliva;

    /**
     * @var \Seka\Portal\Modul\Statistiky\Entities\Zaznam\Enums\EmisnySystemEnum
     */
    private EmisnySystemEnum $emisnySystem;

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

    /**
     * PocetKontrolPodlaDruhuPalivaAEmisnehoSystemuVozidla constructor.
     *
     * @param \Seka\Portal\Modul\Statistiky\Entities\Zaznam\Enums\DruhPalivaEnum   $druhPaliva
     * @param \Seka\Portal\Modul\Statistiky\Entities\Zaznam\Enums\EmisnySystemEnum $emisnySystem
     * @param int                                                                  $pocet
     */
    public function __construct(DruhPalivaEnum $druhPaliva, EmisnySystemEnum $emisnySystem, int $pocet)
    {
        $this->druhPaliva = $druhPaliva;
        $this->emisnySystem = $emisnySystem;
        $this->pocet = $pocet;
    }

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

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

    /**
     * @param \Seka\Portal\Modul\Statistiky\Entities\Zaznam\ValueObjects\PocetKontrolPodlaDruhuPalivaAEmisnehoSystemuVozidla $pocetKontrolPodlaDruhuPalivaAEmisnehoSystemuVozidla
     *
     * @return $this
     */
    public function navysitPocet(self $pocetKontrolPodlaDruhuPalivaAEmisnehoSystemuVozidla): self
    {
        if (false === $this->equalsDruhPalivaAEmisnehoSystemu($pocetKontrolPodlaDruhuPalivaAEmisnehoSystemuVozidla)) {
            throw new InvalidArgumentException('Navysenie poctu kontrol podla ineho druhu paliva alebo emisneho systemu nie je mozne.');
        }

        return new self(
            $this->druhPaliva,
            $this->emisnySystem,
            $this->pocet + $pocetKontrolPodlaDruhuPalivaAEmisnehoSystemuVozidla->pocet()
        );
    }

    /**
     * @param \Seka\Portal\Modul\Statistiky\Entities\Zaznam\ValueObjects\PocetKontrolPodlaDruhuPalivaAEmisnehoSystemuVozidla $pocetKontrolPodlaDruhuPalivaAEmisnehoSystemuVozidla
     *
     * @return bool
     */
    public function equalsDruhPalivaAEmisnehoSystemu(self $pocetKontrolPodlaDruhuPalivaAEmisnehoSystemuVozidla): bool
    {
        return $pocetKontrolPodlaDruhuPalivaAEmisnehoSystemuVozidla->druhPaliva->equal($this->druhPaliva)
            && $pocetKontrolPodlaDruhuPalivaAEmisnehoSystemuVozidla->emisnySystem->equal($this->emisnySystem);
    }

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

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

    /**
     * @inheritDoc
     */
    public function toArray(): array
    {
        return [
            'druh_paliva' => $this->druhPaliva->value,
            'emisny_system' => $this->emisnySystem->value,
            'pocet' => $this->pocet,
        ];
    }
}
