<?php

declare(strict_types=1);

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

use Illuminate\Support\Str;
use League\Fractal\TransformerAbstract;
use Seka\Portal\Modul\Statistiky\Entities\Zaznam\ValueObjects\UdajePreTypZaznamuPouzivatel;
use Seka\Portal\Modul\Statistiky\Entities\Zaznam\Zaznam;
use Seka\Portal\Modul\Statistiky\Repositories\Eloquent\Transformers\Summary\DataTables\DataTableRowContract;
use Seka\Portal\Modul\Statistiky\Repositories\Eloquent\Transformers\Summary\DataTables\Technik\PocetKontrolPodlaDruhu\PocetKontrolPodlaDruhuDataTableRow;
use Seka\Portal\Modul\Statistiky\Repositories\Eloquent\Transformers\Summary\DataTables\Technik\PocetKontrolPodlaDruhuPalivaAEmisnehoSystemuVozidla\PocetKontrolPodlaDruhuPalivaAEmisnehoSystemuVozidlaDataTableRow;
use Seka\Portal\Modul\Statistiky\Repositories\Eloquent\Transformers\Summary\DataTables\Technik\PocetKontrolPodlaHodnotenia\PocetKontrolPodlaHodnoteniaDataTableRow;
use Seka\Portal\Modul\Statistiky\Repositories\Eloquent\Transformers\Summary\DataTables\Technik\PocetKontrolPodlaKategorieVozidla\PocetKontrolPodlaKategorieVozidlaDataTableRow;
use Seka\Portal\Modul\Statistiky\Repositories\Eloquent\Transformers\Summary\DataTables\Technik\PocetKontrolPodlaStavu\PocetKontrolPodlaStavuDataTableRow;
use Seka\Portal\Modul\Statistiky\Repositories\Eloquent\Transformers\Summary\DataTables\Technik\PocetKontrolSObratom\PocetKontrolSObratomDataTableRow;
use Seka\Portal\Modul\Statistiky\Repositories\Eloquent\Transformers\TransformerContract;
use Seka\Portal\Modul\Statistiky\Repositories\Eloquent\Transformers\TransformerTrait;

/**
 * Class ZaznamTechnikSummaryDataTableTransformer
 *
 * @package Seka\Portal\Modul\Statistiky\Repositories\Eloquent\Transformers\Summary
 */
final class ZaznamTechnikSummaryDataTableTransformer extends TransformerAbstract implements TransformerContract
{
    use TransformerTrait;

    /**
     * @param \Seka\Portal\Modul\Statistiky\Entities\Zaznam\Zaznam $model
     *
     * @return array
     * @throws \Seka\Portal\Modul\Statistiky\Exceptions\NeznamiDruhUdajovZaznamuException
     */
    public function transform(Zaznam $model): array
    {
        $this->checkUdajeType($model, UdajePreTypZaznamuPouzivatel::class);

        $out = [];

        foreach (get_class_methods($this) as $method) {
            if (Str::startsWith($method, 'transformUdaje')) {
                $dt = $this->$method($model);
                $out[class_basename($dt)][] = $dt;
            }
        }

        return $out;
    }

    /**
     * @param \Seka\Portal\Modul\Statistiky\Entities\Zaznam\Zaznam $model
     *
     * @return \Seka\Portal\Modul\Statistiky\Repositories\Eloquent\Transformers\Summary\DataTables\DataTableRowContract
     */
    protected function transformUdajeTekZoznamPoctuKontrolSObratom(Zaznam $model): DataTableRowContract
    {
        $row = new PocetKontrolSObratomDataTableRow($model->subjekt->nazov());

        foreach ($model->udaje->zoznamPoctuKontrolSObratom() as $item) {
            $row->add($item);
        }

        return $row;
    }

    /**
     * @param \Seka\Portal\Modul\Statistiky\Entities\Zaznam\Zaznam $model
     *
     * @return \Seka\Portal\Modul\Statistiky\Repositories\Eloquent\Transformers\Summary\DataTables\Technik\PocetKontrolPodlaDruhu\PocetKontrolPodlaDruhuDataTableRow
     */
    protected function transformUdajeTekZoznamPoctuKontrolPodlaDruhu(Zaznam $model): DataTableRowContract
    {
        $row = new PocetKontrolPodlaDruhuDataTableRow($model->subjekt->nazov());

        foreach ($model->udaje->zoznamPoctuKontrolPodlaDruhu() as $item) {
            $row->add($item);
        }

        return $row;
    }

    /**
     * @param \Seka\Portal\Modul\Statistiky\Entities\Zaznam\Zaznam $model
     *
     * @return \Seka\Portal\Modul\Statistiky\Repositories\Eloquent\Transformers\Summary\DataTables\DataTableRowContract
     */
    protected function transformUdajeTekZoznamPoctuKontrolPodlaStavu(Zaznam $model): DataTableRowContract
    {
        $row = new PocetKontrolPodlaStavuDataTableRow($model->subjekt->nazov());

        foreach ($model->udaje->zoznamPoctuKontrolPodlaStavu() as $item) {
            $row->add($item);
        }

        return $row;
    }

    /**
     * @param \Seka\Portal\Modul\Statistiky\Entities\Zaznam\Zaznam $model
     *
     * @return \Seka\Portal\Modul\Statistiky\Repositories\Eloquent\Transformers\Summary\DataTables\DataTableRowContract
     */
    protected function transformUdajeTekZoznamPoctuKontrolPodlaHodnotenia(Zaznam $model): DataTableRowContract
    {
        $row = new PocetKontrolPodlaHodnoteniaDataTableRow($model->subjekt->nazov());

        foreach ($model->udaje->zoznamPoctuKontrolPodlaHodnotenia() as $item) {
            $row->add($item);
        }

        return $row;
    }

    /**
     * @param \Seka\Portal\Modul\Statistiky\Entities\Zaznam\Zaznam $model
     *
     * @return \Seka\Portal\Modul\Statistiky\Repositories\Eloquent\Transformers\Summary\DataTables\DataTableRowContract
     */
    protected function transformUdajeTekZoznamPoctuKontrolPodlaKategorieVozidla(Zaznam $model): DataTableRowContract
    {
        $row = new PocetKontrolPodlaKategorieVozidlaDataTableRow($model->subjekt->nazov());

        foreach ($model->udaje->zoznamPoctuKontrolPodlaKategorieVozidla() as $item) {
            $row->add($item);
        }

        return $row;
    }

    /**
     * @param \Seka\Portal\Modul\Statistiky\Entities\Zaznam\Zaznam $model
     *
     * @return \Seka\Portal\Modul\Statistiky\Repositories\Eloquent\Transformers\Summary\DataTables\DataTableRowContract
     */
    protected function transformUdajeTekZoznamPoctuKontrolPodlaDruhuPalivaAEmisnehoSystemuVozidla(Zaznam $model): DataTableRowContract
    {
        $row = new PocetKontrolPodlaDruhuPalivaAEmisnehoSystemuVozidlaDataTableRow($model->subjekt->nazov());

        foreach ($model->udaje->zoznamPoctuKontrolPodlaDruhuPalivaAEmisnehoSystemuVozidla() as $item) {
            $row->add($item);
        }

        return $row;
    }
}
