<?php

declare(strict_types=1);

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

use Seka\Portal\Modul\Statistiky\Entities\Factory;
use Seka\Portal\Modul\Statistiky\Entities\Zaznam\DTOs\ZaznamDTO;
use Seka\Portal\Modul\Statistiky\Entities\Zaznam\Enums\DruhSubjektuZaznamuEnum;
use Seka\Portal\Modul\Statistiky\Exceptions\NeznamiDruhZaznamuException;

/**
 * Class ZaznamFactory
 *
 * @package Seka\Portal\Modul\Statistiky\Entities\Zaznam
 */
class ZaznamFactory implements Factory
{
    /**
     * @param \Seka\Portal\Modul\Statistiky\Entities\Zaznam\DTOs\ZaznamDTO|null $zaznamDTO
     *
     * @return \Seka\Portal\Modul\Statistiky\Entities\Zaznam\Zaznam
     * @throws \Seka\Portal\Modul\Statistiky\Exceptions\NeznamiDruhZaznamuException
     * @throws \Throwable
     */
    public function make(ZaznamDTO $zaznamDTO = null): Zaznam
    {
        if (collect(DruhSubjektuZaznamuEnum::cases())->map(fn($case) => $case->value)->doesntContain($zaznamDTO->subjekt->druh()->value)) {
            throw new NeznamiDruhZaznamuException(
                sprintf('Neznama hodnota (%s) pre druh zaznamu.', $zaznamDTO->subjekt->druh()->value)
            );
        }

        $zaznam = new Zaznam();
        // !!! nastavenie subjektu musi byt prve v poradi !!!
        $zaznam->subjekt = $zaznamDTO->subjekt;
        // !!! nastavenie subjektu musi byt prve v poradi !!!
        $zaznam->datum = $zaznamDTO->datum;
        $zaznam->udaje = $zaznamDTO->udaje;

        return $zaznam;
    }
}
