<?php

namespace Dcat\Admin\Grid\Concerns;

use Closure;
use Dcat\Admin\Actions\Action;
use Dcat\Admin\Grid\BatchAction;
use Dcat\Admin\Grid\Tools;
use Illuminate\Contracts\Support\Htmlable;
use Illuminate\Contracts\Support\Renderable;

trait HasTools
{
    /**
     * Header tools.
     *
     * @var Tools
     */
    protected $tools;

    /**
     * Setup grid tools.
     */
    public function setupTools()
    {
        $this->tools = new Tools($this);
    }

    /**
     * @param bool $value
     *
     * @return $this
     */
    public function toolsWithOutline(bool $value = true)
    {
        $this->tools->withOutline($value);

        return $this;
    }

    /**
     * Get or setup grid tools.
     *
     * @param Closure|array|Action|Tools\AbstractTool|Renderable|Htmlable|string $value
     *
     * @return $this|Tools
     */
    public function tools($value = null)
    {
        if ($value === null) {
            return $this->tools;
        }

        if ($value instanceof Closure) {
            $value($this->tools);

            return $this;
        }

        if (! is_array($value)) {
            $value = [$value];
        }

        foreach ($value as $tool) {
            $this->tools->append($tool);
        }

        return $this;
    }

    /**
     * Set grid batch-action callback.
     *
     * @param Closure|BatchAction|BatchAction[] $value
     *
     * @return $this
     */
    public function batchActions($value)
    {
        $this->tools(function (Tools $tools) use ($value) {
            $tools->batch($value);
        });

        return $this;
    }

    /**
     * Render custom tools.
     *
     * @return string
     */
    public function renderTools()
    {
        return $this->tools->render();
    }

    /**
     * @param bool $val
     *
     * @return mixed
     */
    public function disableToolbar(bool $val = true)
    {
        return $this->option('show_toolbar', ! $val);
    }

    /**
     * @param bool $val
     *
     * @return mixed
     */
    public function showToolbar(bool $val = true)
    {
        return $this->disableToolbar(! $val);
    }

    /**
     * Disable batch actions.
     *
     * @param bool $disable
     *
     * @return $this
     */
    public function disableBatchActions(bool $disable = true)
    {
        $this->tools->disableBatchActions($disable);

        return $this;
    }

    /**
     * Show batch actions.
     *
     * @param bool $val
     *
     * @return $this
     */
    public function showBatchActions(bool $val = true)
    {
        return $this->disableBatchActions(! $val);
    }

    /**
     * Disable batch delete.
     *
     * @param bool $disable
     *
     * @return $this
     */
    public function disableBatchDelete(bool $disable = true)
    {
        $this->tools->batch(function ($action) use ($disable) {
            $action->disableDelete($disable);
        });

        return $this;
    }

    /**
     * Show batch delete.
     *
     * @param bool $val
     *
     * @return $this
     */
    public function showBatchDelete(bool $val = true)
    {
        return $this->disableBatchDelete(! $val);
    }

    /**
     * Disable refresh button.
     *
     * @param bool $disable
     *
     * @return $this
     */
    public function disableRefreshButton(bool $disable = true)
    {
        $this->tools->disableRefreshButton($disable);

        return $this;
    }

    /**
     * Show refresh button.
     *
     * @param bool $val
     *
     * @return $this
     */
    public function showRefreshButton(bool $val = true)
    {
        return $this->disableRefreshButton(! $val);
    }

    /**
     * If grid show toolbar.
     *
     * @return bool
     */
    public function allowToolbar()
    {
        if (
            $this->option('show_toolbar')
            && (
                $this->tools()->has()
                || $this->allowExporter()
                || $this->allowCreateButton()
                || $this->allowResponsive()
                || ! empty($this->variables['title'])
            )
        ) {
            return true;
        }

        return false;
    }
}
