<?php

declare(strict_types=1);

namespace Seka\Portal\Modul\Statistiky\Repositories\Eloquent\Presenters\Summary;

use Illuminate\Database\Eloquent\Collection as EloquentCollection;
use League\Fractal\Resource\NullResource;
use Seka\Portal\Modul\Statistiky\Entities\Zaznam\Enums\DruhSubjektuZaznamuEnum;
use Seka\Portal\Modul\Statistiky\Entities\Zaznam\ValueObjects\UdajePreTypZaznamuPracovisko;
use Seka\Portal\Modul\Statistiky\Entities\Zaznam\Zaznam;
use Seka\Portal\Modul\Statistiky\Exceptions\NeznamiDruhUdajovZaznamuException;

/**
 * Class ZaznamPracoviskoSummaryPresenter
 *
 * @package Seka\Portal\Modul\Statistiky\Repositories\Eloquent\Presenters\Summary
 */
final class ZaznamPracoviskoSummaryPresenter extends ZaznamSummaryPresenterAbstract
{
    /**
     * @param $data
     *
     * @return \League\Fractal\Resource\Item|\League\Fractal\Resource\NullResource
     * @throws \Seka\Portal\Modul\Statistiky\Exceptions\NeznamiDruhUdajovZaznamuException
     */
    protected function transformCollection($data)
    {
        if (is_null($data) || $data->isEmpty()) {
            return new NullResource();
        }

        /** @var \Seka\Portal\Modul\Statistiky\Entities\Zaznam\Zaznam $zaznam */
        $zaznam = $data->first();

        if ($zaznam->udaje instanceof UdajePreTypZaznamuPracovisko) {
            if ($data->count() === 1) {
                $_zaznam = clone $zaznam;
            } else {
                $_zaznam = new Zaznam([
                    'subjekt_druh' => DruhSubjektuZaznamuEnum::PRACOVISKO->value,
                ]);
                $this->sumarizaciaUdajov($_zaznam, $data);
            }

            return parent::transformItem($_zaznam);
        }

        throw new NeznamiDruhUdajovZaznamuException('Neznami druh udajov zaznamu pre transformaciu.');
    }

    /**
     * @param \Seka\Portal\Modul\Statistiky\Entities\Zaznam\Zaznam $zaznam
     * @param \Illuminate\Database\Eloquent\Collection             $data
     */
    private function sumarizaciaUdajov(Zaznam &$zaznam, EloquentCollection $data)
    {
        $data->each(function (Zaznam $item) use (&$zaznam) {
            foreach ($item->udaje->zoznamPoctuKontrolPodlaStavu() as $pocet) {
                $zaznam->udaje->zoznamPoctuKontrolpodlaStavu()->add($pocet);
            }

            foreach ($item->udaje->zoznamPoctuKontrolPodlaDruhuAHodnotenia() as $pocet) {
                $zaznam->udaje->zoznamPoctuKontrolPodlaDruhuAHodnotenia()->add($pocet);
            }

            foreach ($item->udaje->zoznamPoctuKontrolPodlaKategorieVozidla() as $pocet) {
                $zaznam->udaje->zoznamPoctuKontrolPodlaKategorieVozidla()->add($pocet);
            }

            foreach ($item->udaje->zoznamPoctuKontrolAObratuPodlaSubjektuFakturacie() as $pocet) {
                $zaznam->udaje->zoznamPoctuKontrolAObratuPodlaSubjektuFakturacie()->add($pocet);
            }

            foreach ($item->udaje->zoznamPoctuKontrolPodlaDruhuPalivaAEmisnehoSystemuVozidla() as $pocet) {
                $zaznam->udaje->zoznamPoctuKontrolPodlaDruhuPalivaAEmisnehoSystemuVozidla()->add($pocet);
            }
        });
    }
}
