<?php

namespace Xentral\Modules\Resubmission\DataTable;

use Aura\SqlQuery\Exception as AuraSqlQueryException;
use Xentral\Components\Database\SqlQuery\SelectQuery;
use Xentral\Widgets\DataTable\Column\Column;
use Xentral\Widgets\DataTable\Column\ColumnCollection;
use Xentral\Widgets\DataTable\Feature\FeatureCollection;
use Xentral\Widgets\DataTable\Feature\TableControlFeature;
use Xentral\Widgets\DataTable\Filter\CustomFilter;
use Xentral\Widgets\DataTable\Filter\FilterCollection;
use Xentral\Widgets\DataTable\Options\DataTableOptions;
use Xentral\Widgets\DataTable\Request\DataTableRequest;
use Xentral\Widgets\DataTable\Type\AbstractDataTableType;

final class ResubmissionTasksDataTable extends AbstractDataTableType
{
    /**
     * @param SelectQuery $query
     *
     * @throws AuraSqlQueryException
     *
     * @return void
     */
    public function configureQuery(SelectQuery $query)
    {
        $query
            ->cols([
                'a.id',
                'a.aufgabe'             => 'title',
                'adr.name'              => 'employee_name',
                'adr.mitarbeiternummer' => 'employee_number',
                'a.abgabe_bis'          => 'completion_date',
                'a.startdatum'          => 'start_date',
                'a.startzeit'           => 'start_time',
                'a.prio'                => 'priority',
                'a.status'              => 'state',
            ])
            ->from('aufgabe AS a')
            ->innerJoin('wiedervorlage_aufgabe AS wa', 'wa.task_id = a.id')
            ->leftJoin('adresse AS adr', 'a.adresse = adr.id');
    }

    /**
     * @param ColumnCollection $columns
     *
     * @return void
     */
    public function configureColumns(ColumnCollection $columns)
    {
        $priority = Column::searchable('priority', 'Priorität', Column::ALIGN_CENTER);
        $priority->setFormatter(static function ($value) {
            $prio = (int)$value;
            if ($prio === 1) {
                return 'hoch';
            }
            if ($prio === -1) {
                return 'niedrig';
            }

            return 'mittel';
        });

        $employee = Column::searchable('employee', 'Mitarbeiter');
        $employee->setFormatter(function ($value, $row) {
            if (!empty($row['employee_number'])) {
                return sprintf('%s %s', $row['employee_number'], $row['employee_name']);
            }

            return (string)$row['employee_name'];
        });

        $menu = Column::fixed('menu', 'Menü', 'center', '1%');
        $menu->setFormatter(function ($value, $row) {
            $stateText = $row['state'] === 'abgeschlossen' ? 'completed' : 'open';
            $stateIcon = $row['state'] === 'abgeschlossen' ? 'check_circle_filled.svg' : 'check_circle_outlined.svg';
            $html =
                '<table class="datatable-menu" align="center" border="0" cellpadding="0" cellspacing="0"><tr>' .
                '<td><a href="#" class="resubmissiontask-state-button" data-task-id="{ID}" ' .
                'data-task-state="{STATE_TEXT}" title="Status ändern">' .
                '<img src="themes/new/images/{STATE_ICON}" alt="Status ändern" border="0" align="center">' .
                '</a></td>' .
                '<td><a href="#" class="resubmissiontask-edit-button" data-task-id="{ID}" title="Aufgabe bearbeiten">' .
                '<img src="themes/new/images/edit.svg" alt="Aufgabe bearbeiten" border="0" align="center">' .
                '</a></td>' .
                '<td><a href="#" class="resubmissiontask-delete-button" data-task-id="{ID}"  title="Aufgabe löschen">' .
                '<img src="themes/new/images/delete.svg" alt="Aufgabe löschen" border="0" align="center">' .
                '</a></td>' .
                '</tr></table>';

            $html = str_replace('{ID}', $row['id'], $html);
            $html = str_replace('{STATE_TEXT}', $stateText, $html);
            $html = str_replace('{STATE_ICON}', $stateIcon, $html);

            return $html;
        });

        $columns->add(Column::searchable('title', 'Aufgabe'));
        $columns->add($employee);
        $columns->add(Column::searchable('completion_date', 'Abgabe bis'));
        $columns->add($priority);
        $columns->add($menu);
    }

    /**
     * @param DataTableOptions $options
     *
     * @return void
     */
    public function configureOptions(DataTableOptions $options)
    {
        $options->setDefaultSorting(['completion_date' => 'ASC', 'title' => 'ASC']);
    }

    /**
     * @param FeatureCollection $features
     *
     * @return void
     */
    public function configureFeatures(FeatureCollection $features)
    {
        parent::configureFeatures($features);

        /** @var TableControlFeature $control */
        $control = $features->get(TableControlFeature::class);
        $control->disablePaging();
        $control->disableSearching();
        $control->hideLengthChange();
        $control->hideButtons();
        $control->hideInfo();
    }

    /**
     * @param FilterCollection $filters
     *
     * @return void
     */
    public function configureFilters(FilterCollection $filters)
    {
        $closure = static function (SelectQuery $query, DataTableRequest $request) {
            $resubmissionId = (int)$request->getOriginalRequest()->getParam('id');
            if ($resubmissionId > 0) {
                $query->where('wa.resubmission_id = ?', $resubmissionId);
            }
        };
        $filters->add(new CustomFilter($closure));
    }
}