<?php

declare(strict_types=1);

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

use InvalidArgumentException;

/**
 * Class PocetKontrolPodlaObratuASubjektuFakturacie
 *
 * @package Seka\Portal\Modul\Statistiky\Entities\Zaznam\ValueObjects
 */
final class PocetKontrolPodlaObratuASubjektuFakturacie implements PocetKontrol
{
    /**
     * @var string
     */
    private string $nazovSubjektu;

    /**
     * @var float
     */
    private float $obrat;

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

    /**
     * PocetKontrolPodlaObratuASubjektuFakturacie constructor.
     *
     * @param string $nazovSubjektu
     * @param float  $obrat
     * @param int    $pocet
     */
    public function __construct(string $nazovSubjektu, float $obrat, int $pocet)
    {
        $this->obrat = $obrat;
        $this->pocet = $pocet;
        $this->nazovSubjektu = $nazovSubjektu;
    }

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

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

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

    /**
     * @param \Seka\Portal\Modul\Statistiky\Entities\Zaznam\ValueObjects\PocetKontrolPodlaObratuASubjektuFakturacie $zdroj
     *
     * @return $this
     */
    public function navysitPocetAObrat(PocetKontrolPodlaObratuASubjektuFakturacie $zdroj): self
    {
        if (false === $zdroj->equalsNazovSubjektu($this)) {
            throw new InvalidArgumentException('Navysenie poctu kontrol podla ineho subjektu fakturacie nie je mozne.');
        }

        return new self(
            $this->nazovSubjektu,
            (float) $this->obrat + $zdroj->obrat,
            (int) $this->pocet + $zdroj->pocet
        );
    }

    /**
     * @param \Seka\Portal\Modul\Statistiky\Entities\Zaznam\ValueObjects\PocetKontrolPodlaObratuASubjektuFakturacie $zdroj
     *
     * @return bool
     */
    public function equalsNazovSubjektu(PocetKontrolPodlaObratuASubjektuFakturacie $zdroj): bool
    {
        return $this->nazovSubjektu() === $zdroj->nazovSubjektu();
    }

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

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