<?php

namespace App\DataTables;

use App\Models\PrenotazioneTavolo;
use Illuminate\Database\Eloquent\Builder as QueryBuilder;
use Yajra\DataTables\EloquentDataTable;
use Yajra\DataTables\Html\Builder as HtmlBuilder;
use Yajra\DataTables\Html\Button;
use Yajra\DataTables\Html\Column;
use Yajra\DataTables\Html\Editor\Editor;
use Yajra\DataTables\Html\Editor\Fields;
use Yajra\DataTables\Services\DataTable;
use Illuminate\Support\Facades\Auth;

class PrenotazioneTavoloDataTable extends DataTable
{
    public function __construct()
    {
        $this->dataTableVariable = 'dataTable_prenotazione_tavolo';
    }
    /**
     * Build the DataTable class.
     *
     * @param QueryBuilder<PrenotazioneTavolo> $query Results from query() method.
     */
    public function dataTable(QueryBuilder $query): EloquentDataTable
    {
        return (new EloquentDataTable($query))
            ->addColumn('action', function($entity){
                return view('prenotazione_tavolo.menu', ['entity' => $entity]);
            })
            ->addColumn('stato_display', function($entity){
                return view('prenotazione_tavolo._partials.stato_prenotazione', ['stato' => $entity->stato]);
            })
            ->setRowId('id');
    }

    /**
     * Get the query source of dataTable.
     *
     * @return QueryBuilder<PrenotazioneTavolo>
     */
    public function query(PrenotazioneTavolo $model): QueryBuilder
    {
        if(isset($this->attivita_id)){
            return $model->newQuery()->where('attivita_id', $this->attivita_id);

            if(isset($this->oggi) && $this->oggi == true){
                return $query->whereDate('data_prenotazione', Carbon::today());
            }
        }
        return $model->newQuery()->whereRaw('1 = 0');
    }

    /**
     * Optional method if you want to use the html builder.
     */
    public function html(): HtmlBuilder
    {
        $buttons = [];
        if(Auth::user()->can('create-prenotazione_tavolo')){
            array_push($buttons, Button::make('create')
                ->editor('editor')
                ->formTitle('Crea nuova prenotazione')
                ->className('btn btn-sm btn-primary mb-4')
                ->text('<i class="fas fa-plus"></i> Nuova prenotazione'));
        }

        if(isset($this->oggi) && $this->oggi == true){
            array_push($buttons, Button::raw('Appello prenotazioni')
                ->className('btn btn-sm btn-primary mb-4')
                ->action('appelloPrenotazioniTavoli()')
                ->text('<i class="bx bx-notification"></i> Appello prenotazioni'));
        }
        return $this->builder()
                    ->setTableId($this->dataTableVariable)
                    ->columns($this->getColumns())
                    ->minifiedAjax()
                    ->ajax(route('prenotazione-tavolo.store', ['attivita_id' => $this->attivita_id]))
                    ->language(asset('assets/Italian.json'))
                    ->dom(count($buttons) == 0 ? 'rtip' : 'Bfrtip')
                    ->buttons($buttons)
                    ->orderBy(1)
                    ->selectStyleSingle()
                    ->responsive(true)
                    ->editor(
                        Editor::make()
                            ->fields([
                                Fields\Hidden::make('attivita_id')->label('Attività')->default($this->attivita_id),
                                Fields\Text::make('nome')->label('Nome'),
                                Fields\Text::make('email')->label('Email'),
                                Fields\Text::make('telefono')->label('Telefono'),
                                Fields\Select2::make('tavolo_id')->label('Tavolo')->options(\App\Models\Tavolo::where('attivita_id', $this->attivita_id)->where('is_attivo', true)->pluck('label', 'id')),
                                Fields\Date::make('data_prenotazione')->label('Data prenotazione')->default(date('Y-m-d')),
                                Fields\Time::make('ora_prenotazione')->label('Ora prenotazione')->default(date('H:i')),
                                Fields\Text::make('note')->label('Note'),
                                Fields\Select2::make('stato')->label('Stato')->options(PrenotazioneTavolo::getStati()->pluck('value', 'label'))->default(PrenotazioneTavolo::STATO_INVIATA),
                            ])
                    )
                    ->initComplete("function(settings, json){
                        initComplete_prenotazione_tavolo();
                    }");
    }

    /**
     * Get the dataTable columns definition.
     */
    public function getColumns(): array
    {
        return [
            Column::make('id')->visible(false)->responsivePriority(1),
            Column::make('stato')->data('stato_display')->title('Stato')->searchable(true)->filter(true)->responsivePriority(1),
            Column::make('nome')->title('Nome'),
            Column::make('email')->title('Email'),
            Column::make('telefono')->title('Telefono'),
            Column::make('tavolo_id')->title('Tavolo'),
            Column::make('data_prenotazione')->title('Data prenotazione'),
            Column::make('ora_prenotazione')->title('Ora prenotazione'),
            Column::make('note')->title('Note'),
            Column::computed('action')
                  ->title('')
                  ->exportable(false)
                  ->printable(false)
                  ->width(60)
                  ->addClass('text-center')
                  ->responsivePriority(1),
        ];
    }

    /**
     * Get the filename for export.
     */
    protected function filename(): string
    {
        return 'PrenotazioneTavolo_' . date('YmdHis');
    }
}
