<?php

declare(strict_types=1);

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

use DateTime;
use Seka\Portal\Modul\Statistiky\Entities\Zaznam\DTOs\ZaznamDTO;
use Seka\Portal\Modul\Statistiky\Entities\Zaznam\Enums\DruhEmisnejKontrolyEnum;
use Seka\Portal\Modul\Statistiky\Entities\Zaznam\Enums\DruhPalivaEnum;
use Seka\Portal\Modul\Statistiky\Entities\Zaznam\Enums\DruhSubjektuZaznamuEnum;
use Seka\Portal\Modul\Statistiky\Entities\Zaznam\Enums\EmisnySystemEnum;
use Seka\Portal\Modul\Statistiky\Entities\Zaznam\Enums\HodnotenieEmisnejKontrolyEnum;
use Seka\Portal\Modul\Statistiky\Entities\Zaznam\Enums\StavEmisnejKontrolyEnum;
use Seka\Portal\Modul\Statistiky\Entities\Zaznam\ValueObjects\Subjekt;
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\ZoznamPoctuKontrolPodlaDruhuPalivaAEmisnehoSystemuVozidla;
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\ZoznamPoctuKontrolPodlaStavu;
use Seka\Portal\Modul\Statistiky\Entities\Zaznam\ValueObjects\ZoznamPoctuKontrolSObratom;
use Seka\Portal\Modul\Statistiky\Tests\TestCase;

/**
 * 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::from([
                'subjekt' => new Subjekt(DruhSubjektuZaznamuEnum::POUZIVATEL, 'tester'),
                'kodPracoviska' => $kodPracoviska,
                'datum' => $datum,
                'udaje' => 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());
        self::assertInstanceOf(UdajePreTypZaznamuPouzivatel::class, $zaznamDTO->udaje);
    }
}
