<?php

namespace Xentral\Widgets\DataTable\Request;

use Xentral\Components\Http\Request;

/**
 * @see https://datatables.net/manual/server-side
 */
final class DataTableRequestParameter
{
    /** @var string|null $tableName */
    private $tableName;

    /** @var int $draw Draw counter */
    private $draw;

    /** @var int $start Paging first record offset */
    private $start;

    /** @var int $length Number of records returned */
    private $length;

    /** @var array $columns Column settings and search queries */
    private $columns;

    /** @var array $search Global search query */
    private $search;

    /** @var array $order Ordering settings */
    private $order;

    /** @var array $filter Custom parameter for filter feature */
    private $filter;

    /** @var array $export Custom parameter for export feature */
    private $export;

    /**
     * @param string $tableName
     * @param int    $draw
     * @param int    $start
     * @param int    $length
     * @param array  $columns
     * @param array  $search
     * @param array  $order
     * @param array  $filter
     * @param array  $export
     */
    public function __construct(
        $tableName = null,
        $draw = 1,
        $start = 0,
        $length = 10,
        $columns = [],
        $search = [],
        $order = [],
        $filter = [],
        $export = []
    ) {
        $this->tableName = $tableName;
        $this->draw = (int)$draw;
        $this->start = (int)$start;
        $this->length = (int)$length;
        $this->columns = (array)$columns;
        $this->search = (array)$search;
        $this->order = (array)$order;
        $this->filter = (array)$filter;
        $this->export = (array)$export;
    }

    /**
     * @param Request $request
     *
     * @return self
     */
    public static function fromRequest(Request $request)
    {
        $params = $request->getMethod() === 'GET' ? $request->get : $request->post;

        $tableName = $params->getAlphaNumWithDashes('tablename', null);
        $draw = $params->getInt('draw', 1);
        $start = $params->getInt('start', 0);
        $length = $params->getInt('length', 10);
        $columns = (array)$params->get('columns', []);
        $search = (array)$params->get('search', []);
        $order = (array)$params->get('order', []);
        $filter = (array)$params->get('filter', []);
        $export = (array)$params->get('export', []);

        return new self($tableName, $draw, $start, $length, $columns, $search, $order, $filter, $export);
    }

    /**
     * @return string|null
     */
    public function getTableName()
    {
        return $this->tableName;
    }

    /**
     * @return int
     */
    public function getDraw()
    {
        return $this->draw;
    }

    /**
     * @return int
     */
    public function getStart()
    {
        return $this->start;
    }

    /**
     * @return int
     */
    public function getLength()
    {
        return $this->length;
    }

    /**
     * @return array
     */
    public function getSearchValues()
    {
        return $this->search;
    }

    /**
     * @return array
     */
    public function getOrderValues()
    {
        return $this->order;
    }

    /**
     * @return array
     */
    public function getColumnsValues()
    {
        return $this->columns;
    }

    /**
     * @return array
     */
    public function getFilterValues()
    {
        return $this->filter;
    }

    /**
     * @return array
     */
    public function getExportValues()
    {
        return $this->export;
    }
}