<?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 ZoznamPoctuKontrolPodlaDruhuAHodnotenia
 *
 * @package Seka\Portal\Modul\Statistiky\Entities\Zaznam\ValueObjects
 */
final class ZoznamPoctuKontrolPodlaDruhuAHodnotenia extends ZoznamPoctuKontrolAbstract implements ZoznamPoctuKontrol
{
    /**
     * @param array $udaje
     *
     * @return self
     */
    public static function createFromArray(array $udaje): self
    {
        $zoznam = new self();

        foreach ($udaje as $udaj) {
            $zoznam->add(new PocetKontrolPodlaDruhuAHodnotenia(
                DruhEmisnejKontrolyEnum::from(mb_strtoupper($udaj['druh'])),
                HodnotenieEmisnejKontrolyEnum::from(mb_strtoupper($udaj['hodnotenie'])),
                (int)$udaj['pocet']
            ));
        }

        return $zoznam;
    }

    /**
     * @param \Seka\Portal\Modul\Statistiky\Entities\Zaznam\ValueObjects\PocetKontrol $pocetKontrol
     *
     * @return \Seka\Portal\Modul\Statistiky\Entities\Zaznam\ValueObjects\ZoznamPoctuKontrolPodlaDruhuAHodnotenia
     */
    public function add(PocetKontrol $pocetKontrol): self
    {
        $addNewRecord = true;

        if (!$pocetKontrol instanceof PocetKontrolPodlaDruhuAHodnotenia) {
            throw new InvalidArgumentException(
                sprintf(
                    'Ocakava sa instancia triedy %s, vtupny atribut je instancie %s',
                    PocetKontrolPodlaDruhuAHodnotenia::class,
                    get_class($pocetKontrol)
                )
            );
        }

        array_walk(
            $this->items,
            function (?PocetKontrolPodlaDruhuAHodnotenia &$pocetKontrolPodlaDruhuAHodnotenia, int $index) use ($pocetKontrol, &$addNewRecord) {
                if ($pocetKontrolPodlaDruhuAHodnotenia->equalsDruhAHodnotenie($pocetKontrol)) {
                    $pocetKontrolPodlaDruhuAHodnotenia = $pocetKontrolPodlaDruhuAHodnotenia->navysitPocet($pocetKontrol);
                    $addNewRecord = false;
                }
            }
        );

        if ($addNewRecord) {
            $this->items[] = $pocetKontrol;
        }

        return new self($this->items);
    }
}
