<?php

declare(strict_types=1);

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

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

/**
 * Class ZaznamTechnikSummaryPresenter
 *
 * @package Seka\Portal\Modul\Statistiky\Repositories\Eloquent\Presenters\Summary
 */
final class ZaznamTechnikSummaryPresenter extends ZaznamSummaryPresenterAbstract
{
    /**
     * @param $data
     *
     * @return \League\Fractal\Resource\Collection|\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 UdajePreTypZaznamuPouzivatel) {
            $out = [];
            $zaznamyPodlaPouzivatela = $data->groupBy('subjekt_nazov');

            foreach ($zaznamyPodlaPouzivatela as $menoPouzivatela => $zaznamyPouzivatela) {
                $_zaznam = new Zaznam();
                $_zaznam->subjekt = new Subjekt(DruhSubjektuZaznamuEnum::POUZIVATEL, $menoPouzivatela);

                $this->sumarizaciaUdajov($_zaznam, $zaznamyPouzivatela);

                $out[] = $_zaznam;
            }

            return parent::transformCollection($out);
        }

        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, Collection $data)
    {
        $data->each(function (Zaznam $item) use (&$zaznam) {
            foreach ($item->udaje->zoznamPoctuKontrolPodlaDruhu() as $pocet) {
                $zaznam->udaje->zoznamPoctuKontrolPodlaDruhu()->add($pocet);
            }

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

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

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

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

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