<?php

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

use Seka\Portal\Modul\Statistiky\Entities\Zaznam\Casts\UdajeCast;
use Seka\Portal\Modul\Statistiky\Entities\Zaznam\Enums\DruhSubjektuZaznamuEnum;
use Seka\Portal\Modul\Statistiky\Entities\Zaznam\ValueObjects\UdajePreTypZaznamuPouzivatel as UdajeVO;
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\Entities\Zaznam\Zaznam;
use Seka\Portal\Modul\Statistiky\Tests\TestCase;

/**
 * Class UdajeCastTest
 *
 * @package Seka\Portal\Modul\Statistiky\Tests\Unit\Entities\Zaznam\Casts
 */
class UdajeCastTest extends TestCase
{
    /**
     * @var \Seka\Portal\Modul\Statistiky\Entities\Zaznam\Casts\UdajeCast
     */
    private UdajeCast $udaje;

    /**
     * @var \Seka\Portal\Modul\Statistiky\Entities\Zaznam\ValueObjects\UdajePreTypZaznamuPouzivatel
     */
    private UdajeVO $udajeVO;

    /**
     * @var string
     */
    private string $jsonString;

    /**
     *
     */
    public function setUp(): void
    {
        parent::setUp();

        $this->udaje = new UdajeCast();
        $this->udajeVO = new UdajeVO(
            ZoznamPoctuKontrolSObratom::createFromArray([
                [
                    'obrat' => 123.45,
                    'pocet' => 1,
                ],
            ]),
            ZoznamPoctuKontrolPodlaDruhu::createFromArray([
                [
                    'druh' => 'PRAVIDELNA',
                    'pocet' => 3,
                ],
            ]),
            ZoznamPoctuKontrolPodlaStavu::createFromArray([
                [
                    'stav' => 'ARCHIV',
                    'pocet' => 4,
                ],
            ]),
            ZoznamPoctuKontrolPodlaHodnotenia::createFromArray([
                [
                    'hodnotenie' => 'SPOSOBILE',
                    'pocet' => 5,
                ],
            ]),
            ZoznamPoctuKontrolPodlaKategorieVozidla::createFromArray([
                [
                    'kategoria' => 'M1',
                    'pocet' => 7,
                ],
            ]),
            ZoznamPoctuKontrolPodlaDruhuPalivaAEmisnehoSystemuVozidla::createFromArray([
                [
                    'druh_paliva' => 'B',
                    'emisny_system' => 'RKAT_OBD',
                    'pocet' => 9,
                ]
            ])
        );
        $this->jsonString = '{"zoznamPoctuKontrolSObratom":[{"obrat":123.45,"pocet":1}],"zoznamPoctuKontrolPodlaDruhu":[{"druh":"PRAVIDELNA","pocet":3}],"zoznamPoctuKontrolPodlaStavu":[{"stav":"ARCHIV","pocet":4}],"zoznamPoctuKontrolPodlaHodnotenia":[{"hodnotenie":"SPOSOBILE","pocet":5}],"zoznamPoctuKontrolPodlaKategorieVozidla":[{"kategoria":"M1","pocet":7}],"zoznamPoctuKontrolPodlaDruhuPalivaAEmisnehoSystemuVozidla":[{"druh_paliva":"B","emisny_system":"RKAT_OBD","pocet":9}]}';
    }

    /**
     *
     */
    public function testGet()
    {
        $udaje = $this->udaje->get(new Zaznam([
            'subjekt_druh' => DruhSubjektuZaznamuEnum::POUZIVATEL,
        ]), 'udaje', $this->jsonString, [
            'subjekt_druh' => DruhSubjektuZaznamuEnum::POUZIVATEL->value,
        ]);

        self::assertInstanceOf(UdajeVO::class, $udaje);
    }

    /**
     *
     */
    public function testSet()
    {
        $jsonString = $this->udaje->set(new Zaznam([
            'subjekt_druh' => DruhSubjektuZaznamuEnum::POUZIVATEL,
        ]), 'udaje', $this->udajeVO, [
            'subjekt_druh' => DruhSubjektuZaznamuEnum::POUZIVATEL->value,
        ]);

        self::assertJsonStringEqualsJsonString(
            $this->jsonString,
            $jsonString
        );
    }
}
