<?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\Column\ColumnFormatter;
use Xentral\Widgets\DataTable\Feature\FeatureCollection;
use Xentral\Widgets\DataTable\Feature\TableControlFeature;
use Xentral\Widgets\DataTable\Options\DataTableOptions;
use Xentral\Widgets\DataTable\Type\AbstractDataTableType;

final class ResubmissionTextFieldDataTable extends AbstractDataTableType
{
    /**
     * @param SelectQuery $query
     *
     * @throws AuraSqlQueryException
     *
     * @return void
     */
    public function configureQuery(SelectQuery $query)
    {
        $query
            ->cols([
                'wfk.id',
                'wfk.title',
                'wsa.name' => 'available_from_stage',
                'wsr.name' => 'required_from_stage',
                'wfk.show_in_pipeline',
                'wfk.show_in_tables',
            ])
            ->from('wiedervorlage_freifeld_konfiguration AS wfk')
            ->leftJoin('wiedervorlage_stages AS wsa', 'wsa.id = wfk.available_from_stage_id')
            ->leftJoin('wiedervorlage_stages AS wsr', 'wsr.id = wfk.required_from_stage_id');
    }

    /**
     * @param ColumnCollection $columns
     *
     * @return void
     */
    public function configureColumns(ColumnCollection $columns)
    {
        $menu = Column::fixed('menu', 'Menü', 'center', '1%');
        $menu->setFormatter(static function ($value, $row) {
            $html =
                '<table class="datatable-menu" align="center" border="0" cellpadding="0" cellspacing="0"><tr>' .
                '<td><a href="#" class="resubmissiontextfield-edit-button" data-textfield-config-id="{ID}" ' .
                'title="Freifeld bearbeiten">' .
                '<img src="themes/new/images/edit.svg" alt="Freifeld bearbeiten" border="0" align="center">' .
                '</a></td>' .
                '<td><a href="#" class="resubmissiontextfield-delete-button" data-textfield-config-id="{ID}" ' .
                'title="Freifeld löschen">' .
                '<img src="themes/new/images/delete.svg" alt="Freifeld löschen" border="0" align="center">' .
                '</a></td>' .
                '</tr></table>';

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

            return $html;
        });

        $availableFromStage = Column::searchable('available_from_stage', 'Verfügbar ab Stage');
        $availableFromStage->setFormatter(ColumnFormatter::ifEmpty('- Immer -'));

        $requiredFromStage = Column::searchable('required_from_stage', 'Pflichtfeld ab Stage');
        $requiredFromStage->setFormatter(ColumnFormatter::ifEmpty('- Nie -'));

        $showInPipeline = Column::sortable('show_in_pipeline', 'Anzeigen in Pipeline');
        $showInPipeline->setFormatter(static function ($value) {
            return (int)$value === 1 ? 'Ja' : 'Nein';
        });

        $showInTables = Column::sortable('show_in_tables', 'Anzeigen in Tabellen');
        $showInTables->setFormatter(static function ($value) {
            return (int)$value === 1 ? 'Ja' : 'Nein';
        });

        $columns->add(Column::searchable('title', 'Bezeichnung'));
        $columns->add($availableFromStage);
        $columns->add($requiredFromStage);
        $columns->add($showInPipeline);
        $columns->add($showInTables);
        $columns->add($menu);
    }

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

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

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