<?php

namespace Xentral\Widgets\DataTable\Feature;

use Xentral\Widgets\DataTable\Column\Column;
use Xentral\Widgets\DataTable\Column\ColumnFormatter;
use Xentral\Widgets\DataTable\DataTableInterface;
use Xentral\Widgets\DataTable\Exception\DataTableExceptionInterface;
use Xentral\Widgets\DataTable\Exception\InvalidArgumentException;

final class RowDetailsFeature implements DataTableFeatureInterface
{
    /** @var string $ajaxUrl */
    private $ajaxUrl;

    /** @var string $ajaxMethod */
    private $ajaxMethod;

    /** @var array $ajaxParams @todo Additional AJAX parameter */
    private $ajaxParams = [];

    /**
     * Der Wert aus der id-Spalte wird als POST-Parameter `id` übergeben
     *
     * @param string        $ajaxUrl         `./index.php?module=foo&action=bar`
     * @param string        $ajaxMethod      [GET|POST]
     * @param callable|null $customFormatter @todo
     */
    public function __construct($ajaxUrl, $ajaxMethod = 'POST', $customFormatter = null)
    {
        $ajaxMethod = strtoupper($ajaxMethod);
        if (!in_array($ajaxMethod, ['GET', 'POST'])) {
            throw new InvalidArgumentException(sprintf('Invalid method "%s".', $ajaxMethod));
        }

        $this->ajaxUrl = $ajaxUrl;
        $this->ajaxMethod = $ajaxMethod;
    }

    /**
     * @param DataTableInterface $table
     *
     * @throws DataTableExceptionInterface
     *
     * @return void
     */
    public function modifyTable(DataTableInterface $table)
    {
        $table->getOptions()->setOption('rowDetails', [
            'ajax' => [
                'url'    => $this->ajaxUrl,
                'method' => $this->ajaxMethod,
                'data'   => $this->ajaxParams,
            ],
        ]);

        // Detail-Spalte erzeugen
        $newCol = Column::fixed('details', '', 'center', '20px');
        $newCol->setFormatter(ColumnFormatter::template('<span class="details" data-id="{ID}"></span>'));
        $newCol->addCssClass('dt-details');

        // Detail-Spalte vor erste Spalte einfügen
        /** @var Column $firstCol */
        $firstCol = $table->getColumns()->getByIndex(0);
        $table->getColumns()->addBefore($newCol, $firstCol->getName());
    }
}