<?php

declare(strict_types=1);

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

use InvalidArgumentException;
use Seka\Portal\Modul\Statistiky\Entities\Zaznam\Enums\DruhEmisnejKontrolyEnum;
use Seka\Portal\Modul\Statistiky\Entities\Zaznam\ValueObjects\PocetKontrolPodlaDruhu;
use Seka\Portal\Modul\Statistiky\Entities\Zaznam\ValueObjects\PocetKontrolPodlaObratuASubjektuFakturacie;
use Seka\Portal\Modul\Statistiky\Entities\Zaznam\ValueObjects\ZoznamPoctuKontrolAObratuPodlaSubjektuFakturacie;
use Seka\Portal\Modul\Statistiky\Tests\TestCase;

/**
 * Class ZoznamPoctuKontrolAObratuPodlaSubjektuFakturacieTest
 *
 * @package Seka\Portal\Modul\Statistiky\Tests\Unit\Entities\Zaznam\ValueObjects
 */
class ZoznamPoctuKontrolAObratuPodlaSubjektuFakturacieTest extends TestCase
{
    /**
     *
     */
    public function testInstance()
    {
        $zoznam = new ZoznamPoctuKontrolAObratuPodlaSubjektuFakturacie();

        self::assertInstanceOf(ZoznamPoctuKontrolAObratuPodlaSubjektuFakturacie::class, $zoznam);
    }

    /**
     *
     */
    public function testAddInstanciaInejTriedy()
    {
        $zoznam = new ZoznamPoctuKontrolAObratuPodlaSubjektuFakturacie();

        self::expectException(InvalidArgumentException::class);

        $zoznam->add(new PocetKontrolPodlaDruhu(
            DruhEmisnejKontrolyEnum::PRAVIDELNA,
            11
        ));
    }

    /**
     *
     */
    public function testAddSubjektFakturacie()
    {
        $zoznam = new ZoznamPoctuKontrolAObratuPodlaSubjektuFakturacie();

        $pocetKontrolPodlaDruhuAHodnotenia = new PocetKontrolPodlaObratuASubjektuFakturacie(
            'elceka IT',
            78.99,
            1
        );

        $zoznam->add($pocetKontrolPodlaDruhuAHodnotenia);

        self::assertCount(1, $zoznam);
    }

    /**
     *
     */
    public function testAddRovnakySubjektFakturacie3x()
    {
        $pocet = 3;
        $obrat = 12.34;
        $zoznam = new ZoznamPoctuKontrolAObratuPodlaSubjektuFakturacie();

        for ($a = 0; $a < $pocet; ++$a) {
            $pocetKontrolPodlaDruhuAHodnotenia = new PocetKontrolPodlaObratuASubjektuFakturacie(
                'elceka IT',
                $obrat,
                1
            );

            $zoznam->add($pocetKontrolPodlaDruhuAHodnotenia);
        }

        self::assertCount(1, $zoznam);
        self::assertEquals($pocet, $zoznam->current()->pocet());
        self::assertEquals($obrat * $pocet, $zoznam->current()->obrat());
    }

    /**
     *
     */
    public function testAddIneSubjektyFakturacie()
    {
        $pocet = 3;
        $obrat = 12.34;
        $zoznamSubjektov = new ZoznamPoctuKontrolAObratuPodlaSubjektuFakturacie();

        for ($a = 0; $a < $pocet; ++$a) {
            $pocetKontrolPodlaDruhuAHodnotenia = new PocetKontrolPodlaObratuASubjektuFakturacie(
                'elceka IT c.' . $a,
                (float)$obrat + $a,
                1
            );

            $zoznamSubjektov->add($pocetKontrolPodlaDruhuAHodnotenia);
        }

        self::assertCount(3, $zoznamSubjektov);

        foreach ($zoznamSubjektov as $subjekt) {
            self::assertEquals((float)$obrat + $zoznamSubjektov->key(), $subjekt->obrat());
        }
    }
}
