<?php

declare(strict_types=1);

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

use Carbon\Carbon;
use Illuminate\Database\Eloquent\Collection;
use Seka\Portal\Modul\Statistiky\Tests\TestCase;
use Illuminate\Foundation\Testing\RefreshDatabase;
use Illuminate\Foundation\Testing\DatabaseMigrations;
use Seka\Portal\Modul\Statistiky\Entities\Zaznam\Zaznam;
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\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 ZaznamTest
 *
 * @package Seka\Portal\Modul\Statistiky\Tests\Unit\Entities\Zaznam
 */
class ZaznamTest extends TestCase
{
    use RefreshDatabase;
    use DatabaseMigrations;

    /**
     *
     */
    public function testCreateZaznamModelInstance()
    {
        $zaznam = new Zaznam();

        self::assertInstanceOf(Zaznam::class, $zaznam);
    }

    /**
     *
     */
    public function testFillZaznamModelInstance()
    {
        $zaznam = new Zaznam();
        $zaznam->subjekt = new Subjekt(DruhSubjektuZaznamuEnum::POUZIVATEL(), 'tester');
        $zaznam->datum = Carbon::today();
        $zaznam->udaje = new UdajePreTypZaznamuPouzivatel(
            ZoznamPoctuKontrolSObratom::createFromArray([
                [
                    'obrat' => 100.50,
                    'pocet' => 10,
                ]
            ]),
            ZoznamPoctuKontrolPodlaDruhu::createFromArray([
                [
                    'druh' => 'PRAVIDELNA',
                    'pocet' => 15,
                ],
            ]),
            ZoznamPoctuKontrolPodlaStavu::createFromArray([
                [
                    'stav' => 'ARCHIV',
                    'pocet' => 17,
                ],
            ]),
            ZoznamPoctuKontrolPodlaHodnotenia::createFromArray([
                [
                    'hodnotenie' => 'SPOSOBILE',
                    'pocet' => 12,
                ],
                [
                    'hodnotenie' => 'NESPOSOBILE',
                    'pocet' => 3,
                ],
            ]),
            ZoznamPoctuKontrolPodlaKategorieVozidla::createFromArray([
                [
                    'kategoria' => 'M1',
                    'pocet' => 15,
                ],
            ]),
            ZoznamPoctuKontrolPodlaDruhuPalivaAEmisnehoSystemuVozidla::createFromArray([[
                'druh_paliva' => DruhPalivaEnum::B()->value,
                'emisny_system' => EmisnySystemEnum::RKAT_OBD()->value,
                'pocet' => 7,
            ]])
        );
        $zaznam->pracovisko_id = 1;

        self::assertInstanceOf(Zaznam::class, $zaznam);
        self::assertInstanceOf(DruhSubjektuZaznamuEnum::class, $zaznam->subjekt->druh());
        self::assertTrue(DruhSubjektuZaznamuEnum::POUZIVATEL()->equals($zaznam->subjekt->druh()));
        self::assertInstanceOf(Carbon::class, $zaznam->datum);
        self::assertNotEmpty($zaznam->udaje);
        self::assertInstanceOf(UdajePreTypZaznamuPouzivatel::class, $zaznam->udaje);
    }

    /**
     *
     */
    public function testCreateFactories()
    {
        $collection = factory(Zaznam::class, 9)->create();

        self::assertInstanceOf(Collection::class, $collection);
        self::assertCount(9, $collection);
    }

    /**
     *
     */
    public function testUdajeAttributeInstance()
    {
        /** @var \Seka\Portal\Modul\Statistiky\Entities\Zaznam\Zaznam $zaznam */
        $zaznam = factory(Zaznam::class, 1)->create()->first();

        self::assertInstanceOf(UdajePreTypZaznamuPouzivatel::class, $zaznam->udaje);
        self::assertInstanceOf(ZoznamPoctuKontrolSObratom::class, $zaznam->udaje->ZoznamPoctuKontrolSObratom());
        self::assertInstanceOf(ZoznamPoctuKontrolPodlaDruhu::class, $zaznam->udaje->zoznamPoctuKontrolPodlaDruhu());
        self::assertInstanceOf(ZoznamPoctuKontrolPodlaStavu::class, $zaznam->udaje->zoznamPoctuKontrolPodlaStavu());
        self::assertInstanceOf(ZoznamPoctuKontrolPodlaHodnotenia::class, $zaznam->udaje->zoznamPoctuKontrolPodlaHodnotenia());
        self::assertInstanceOf(ZoznamPoctuKontrolPodlaKategorieVozidla::class, $zaznam->udaje->zoznamPoctuKontrolPodlaKategorieVozidla());
        self::assertInstanceOf(ZoznamPoctuKontrolPodlaDruhuPalivaAEmisnehoSystemuVozidla::class, $zaznam->udaje->zoznamPoctuKontrolPodlaDruhuPalivaAEmisnehoSystemuVozidla());
    }

    /**
     *
     */
    public function testSubjektAttributeInstance()
    {
        /** @var \Seka\Portal\Modul\Statistiky\Entities\Zaznam\Zaznam $zaznam */
        $zaznam = factory(Zaznam::class, 1)->create()->first();

        self::assertInstanceOf(Subjekt::class, $zaznam->subjekt);
        self::assertInstanceOf(DruhSubjektuZaznamuEnum::class, $zaznam->subjekt->druh());
        self::assertTrue($zaznam->subjekt->druh()->equals(DruhSubjektuZaznamuEnum::POUZIVATEL()));
    }
}
