<?php

declare(strict_types=1);

namespace Seka\Portal\Modul\Statistiky\Tests\Unit\Entities\Zaznam\DTOs;

use DateTime;
use Seka\Portal\Modul\Statistiky\Tests\TestCase;
use Seka\Portal\Modul\Statistiky\Entities\Zaznam\DTOs\ZaznamDTO;
use Seka\Portal\Modul\Statistiky\Entities\Zaznam\ValueObjects\Subjekt;
use Seka\Portal\Modul\Statistiky\Entities\Zaznam\Enums\DruhPalivaEnum;
use Seka\Portal\Modul\Statistiky\Entities\Zaznam\Enums\EmisnySystemEnum;
use Seka\Portal\Modul\Statistiky\Entities\Zaznam\Enums\DruhSubjektuZaznamuEnum;
use Seka\Portal\Modul\Statistiky\Entities\Zaznam\Enums\DruhEmisnejKontrolyEnum;
use Seka\Portal\Modul\Statistiky\Entities\Zaznam\Enums\StavEmisnejKontrolyEnum;
use Seka\Portal\Modul\Statistiky\Entities\Zaznam\Enums\HodnotenieEmisnejKontrolyEnum;
use Seka\Portal\Modul\Statistiky\Entities\Zaznam\ValueObjects\ZoznamPoctuKontrolSObratom;
use Seka\Portal\Modul\Statistiky\Entities\Zaznam\ValueObjects\UdajePreTypZaznamuPouzivatel;
use Seka\Portal\Modul\Statistiky\Entities\Zaznam\ValueObjects\ZoznamPoctuKontrolPodlaDruhu;
use Seka\Portal\Modul\Statistiky\Entities\Zaznam\ValueObjects\ZoznamPoctuKontrolPodlaStavu;
use Seka\Portal\Modul\Statistiky\Entities\Zaznam\ValueObjects\ZoznamPoctuKontrolPodlaHodnotenia;
use Seka\Portal\Modul\Statistiky\Entities\Zaznam\ValueObjects\ZoznamPoctuKontrolPodlaKategorieVozidla;
use Seka\Portal\Modul\Statistiky\Entities\Zaznam\ValueObjects\ZoznamPoctuKontrolPodlaDruhuPalivaAEmisnehoSystemuVozidla;

/**
 * Class ZaznamDTOTest
 *
 * @package Seka\Portal\Modul\Statistiky\Tests\Unit\Entities\Zaznam\DTOs
 */
class ZaznamDTOTest extends TestCase
{
    /**
     *
     */
    public function testCreate()
    {
        $kodPracoviska = '0000';
        $datum = new DateTime('now');

        $zaznamDTO = ZaznamDTO::create(
            new Subjekt(DruhSubjektuZaznamuEnum::POUZIVATEL(), 'tester'),
            $kodPracoviska,
            $datum,
            new UdajePreTypZaznamuPouzivatel(
                ZoznamPoctuKontrolSObratom::createFromArray([
                    [
                        'obrat' => 123.45,
                        'pocet' => 1,
                    ],
                ]),
                ZoznamPoctuKontrolPodlaDruhu::createFromArray([[
                    'druh' => DruhEmisnejKontrolyEnum::PRAVIDELNA()->value,
                    'pocet' => 333,
                ]]),
                ZoznamPoctuKontrolPodlaStavu::createFromArray([[
                    'stav' => StavEmisnejKontrolyEnum::ARCHIV()->value,
                    'pocet' => 393,
                ]]),
                ZoznamPoctuKontrolPodlaHodnotenia::createFromArray([[
                    'hodnotenie' => HodnotenieEmisnejKontrolyEnum::SPOSOBILE()->value,
                    'pocet' => 444,
                ]]),
                ZoznamPoctuKontrolPodlaKategorieVozidla::createFromArray([[
                    'kategoria' => 'M1',
                    'pocet' => 555,
                ]]),
                ZoznamPoctuKontrolPodlaDruhuPalivaAEmisnehoSystemuVozidla::createFromArray([[
                    'druh_paliva' => DruhPalivaEnum::B()->value,
                    'emisny_system' => EmisnySystemEnum::RKAT_OBD()->value,
                    'pocet' => 987,
                ]])
            )
        );

        self::assertInstanceOf(ZaznamDTO::class, $zaznamDTO);
        self::assertInstanceOf(DateTime::class, $zaznamDTO->datum);
        self::assertEquals($datum->getTimestamp(), $zaznamDTO->datum->getTimestamp());
        self::assertIsString($zaznamDTO->kodPracoviska);
        self::assertEquals($kodPracoviska, $zaznamDTO->kodPracoviska);
        self::assertInstanceOf(DruhSubjektuZaznamuEnum::class, $zaznamDTO->subjekt->druh());
        self::assertEquals(DruhSubjektuZaznamuEnum::POUZIVATEL(), $zaznamDTO->subjekt->druh()->value);
        self::assertInstanceOf(UdajePreTypZaznamuPouzivatel::class, $zaznamDTO->udaje);
    }
}
