<?php

declare(strict_types=1);

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

use Seka\Portal\Modul\Statistiky\Tests\TestCase;
use Seka\Portal\Modul\Statistiky\Entities\Zaznam\ValueObjects\Subjekt;
use Seka\Portal\Modul\Statistiky\Entities\Zaznam\Enums\DruhSubjektuZaznamuEnum;

/**
 * Class SubjektTest
 *
 * @package Seka\Portal\Modul\Statistiky\Tests\Unit\Entities\Zaznam\ValueObjects
 */
class SubjektTest extends TestCase
{
    /**
     * @var \Seka\Portal\Modul\Statistiky\Entities\Zaznam\ValueObjects\Subjekt
     */
    private Subjekt $subjekt;

    /**
     * @var \Seka\Portal\Modul\Statistiky\Entities\Zaznam\Enums\DruhSubjektuZaznamuEnum
     */
    private DruhSubjektuZaznamuEnum $druh;

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

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

        $this->nazov = 'tester';
        $this->druh = DruhSubjektuZaznamuEnum::POUZIVATEL();

        $this->subjekt = new Subjekt($this->druh, $this->nazov);
    }

    /**
     *
     */
    public function testInstance()
    {
        $subjekt = new Subjekt(DruhSubjektuZaznamuEnum::POUZIVATEL(), 'tester');

        self::assertInstanceOf(Subjekt::class, $subjekt);
    }

    /**
     *
     */
    public function testDruh()
    {
        self::assertEquals(DruhSubjektuZaznamuEnum::POUZIVATEL(), $this->subjekt->druh());
    }

    /**
     *
     */
    public function testNazov()
    {
        self::assertEquals('tester', $this->subjekt->nazov());
    }

    /**
     *
     */
    public function testNazovNullable()
    {
        $subjekt = new Subjekt(DruhSubjektuZaznamuEnum::PRACOVISKO());

        self::assertNull($subjekt->nazov());
    }

    /**
     *
     */
    public function testEquals()
    {
        $clone = clone $this->subjekt;

        self::assertTrue($this->subjekt->equals($clone));
    }

    /**
     *
     */
    public function testEqualsWithNullableNazov()
    {
        $subjekt = new Subjekt(DruhSubjektuZaznamuEnum::PRACOVISKO());
        $clone = clone $subjekt;

        self::assertTrue($subjekt->equals($clone));
    }

    /**
     *
     */
    public function testIsNotEqual()
    {
        $subjekt = new Subjekt(DruhSubjektuZaznamuEnum::PRACOVISKO());
        $notEqualSubjekt = new Subjekt(DruhSubjektuZaznamuEnum::POUZIVATEL(), 'tester');

        self::assertFalse($subjekt->equals($notEqualSubjekt));
    }

    /**
     *
     */
    public function testIsNotEqualWithNullableNazov()
    {
        $subjekt = new Subjekt(DruhSubjektuZaznamuEnum::PRACOVISKO());
        $notEqualSubjekt = new Subjekt(DruhSubjektuZaznamuEnum::POUZIVATEL(), 'tester');

        self::assertFalse($subjekt->equals($notEqualSubjekt));
    }

    /**
     *
     */
    public function testToArray()
    {
        $arr = $this->subjekt->toArray();

        self::assertIsArray($arr);
        self::assertArrayHasKey('druh', $arr);
        self::assertArrayHasKey('nazov', $arr);
    }

    /**
     *
     */
    public function testJsonSerialize()
    {
        $json = '{"druh":"POUZIVATEL","nazov":"tester"}';
        self::assertJsonStringEqualsJsonString($json, $this->subjekt->jsonSerialize());
    }
}
