<?php

namespace App\DataTables;

use App\Models\Dispositivo;
use App\Models\Attivita;
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 PuntoVenditaDataTable extends DataTable
{
    public function __construct()
    {
        $this->dataTableVariable = 'dataTable_punto_vendita';
    }
    /**
     * Build the DataTable class.
     *
     * @param QueryBuilder<Dispositivo> $query Results from query() method.
     */
    public function dataTable(QueryBuilder $query): EloquentDataTable
    {
        return (new EloquentDataTable($query))
            ->addColumn('action', function($entity){
                return view('punto_vendita.menu', ['entity' => $entity]);
            })
            ->addColumn('is_attivo_display', function($entity){
                return view('_partials.available', ['available' => $entity->is_attivo]);
            })
            ->addColumn('attivita_id_display', function($entity){
                return $entity->attivita ? $entity->attivita->nome : 'ND';
            })
            // ->addColumn('punto_vendita_tipo_display', function($entity){
            //     return '<i class="'.Dispositivo::getTipoDispositivo()->get($entity->tipo)['icon'].'"></i> '.Dispositivo::getTipoDispositivo()->get($entity->tipo)['label'];
            // })
            ->addColumn('url_stampante_display', function($entity){
                return $entity->url_stampante ?? 'ND';
            })
            ->addColumn('abbinato_display', function($entity){
                $token = $entity->binding_token;
                $tu = ($entity->binding_token === request()->cookie('binding_token'))&& request()->cookie('binding_token') != null;

                switch(true){
                
                    case (isset($token) && $token != null && $tu == false && $entity->occupato == true):
                        return view('_partials.badge', ['success' => 'Abbinato']);
                        break;
                    case ($tu == true):
                        return view('_partials.badge', ['success' => 'Tu']);
                        break;

                    case ($token == null || $entity->occupato == false):
                        return view('_partials.badge', ['error' => 'Non abbinato']);
                        break;
                    default:
                        return view('_partials.badge', ['error' => 'Stato sconosciuto']);
                        break;
                }
                // $txt = '<span class="badge bg-label-success">*</span>';
                // $userToken = request()->cookie('binding_token');
                // if ($entity->binding_token && $userToken && \Illuminate\Support\Facades\Hash::check($entity->binding_token, $userToken)) {
                //     return str_replace('*','Tu', $txt);
                // }
                // return str_replace('*', $entity->binding_token ? 'Abbinato' : 'Non abbinato', $txt);
                // return $entity->binding_token ? 'Abbinato' : 'Non abbinato';
            })
            // ->rawColumns(['punto_vendita_tipo_display'])
            ->rawColumns(['abbinato_display'])
            ->setRowId('id');
    }

    /**
     * Get the query source of dataTable.
     *
     * @return QueryBuilder<Dispositivo>
     */
    public function query(Dispositivo $model): QueryBuilder
    {
        return $model->newQuery()
        ->whereIn('tipo', [Dispositivo::KIOSK, Dispositivo::CASSA , Dispositivo::CAMERIERE])
        ->where('attivita_id', session('attivita_attuale'));
    }

    /**
     * Optional method if you want to use the html builder.
     */
    public function html(): HtmlBuilder
    {
        $buttons = [];
        if(Auth::user()->can('create-punto_vendita')){
            array_push($buttons, Button::make('create')
                ->editor('editor')
                ->className('btn btn-sm btn-primary mb-4')
                ->formTitle('Crea nuovo punto di vendita')
                ->text('<i class="fas fa-plus"></i> Nuovo punto di vendita'));
        }
        return $this->builder()
                    ->setTableId($this->dataTableVariable)
                    ->columns($this->getColumns())
                    ->minifiedAjax()
                    ->responsive(true)
                    ->language(asset('assets/Italian.json'))
                    ->dom(count($buttons) == 0 ? 'rtip' : 'Bfrtip')
                    ->buttons($buttons)
                    ->orderBy(1)
                    ->editor(
                        Editor::make()
                            ->fields([
                                Fields\Text::make('nome')->label('Nome'),
                                Fields\Select::make('tipo')->label('Tipo')
                                ->options(Dispositivo::getTipoPuntiVendita()),
                                Fields\Select2::make('attivita_id')->label('Attività')->options(Attivita::where('is_attiva', true)->pluck('id', 'nome')),
                                Fields\Text::make('licenza')->label('Licenza'),
                                Fields\Select2::make('url_stampante')->label('URL della stampante')
                                ->options(Dispositivo::select2_stampante()),
                                Fields\Text::make('ubicazione')->label('Ubicazione'),
                                Fields\Text::make('note')->label('Note'),
                                Fields\Boolean::make('is_attivo')->label('Attivo')->default(true),
                                Fields\Text::make('pin_sblocco')->label('Pin di sblocco'),
                                Fields\DateTime::make('data_apertura_dispositivo')->label('Data di apertura del dispositivo'),
                                Fields\DateTime::make('data_chiusura_dispositivo')->label('Data di chiusura del dispositivo'),
                            ])
                    )
                    ->initComplete("function(settings, json){
                        initComplete_punto_vendita();
                    }")
                    ->selectStyleSingle();
    }

    /**
     * Get the dataTable columns definition.
     */
    public function getColumns(): array
    {
        return [
            Column::make('id')->visible(false),
            Column::make('is_attivo')->data('is_attivo_display')->title('Disponibile')->responsivePriority(1)->width('10%'),
            Column::make('nome')->title('Nome')->responsivePriority(1),
            Column::make('attivita_id')->title('Attività')->responsivePriority(2),
            Column::make('tipo')->title('Tipo')->visible(true)->responsivePriority(2),
            // Column::computed('punto_vendita_tipo_display')->title('Tipo'),
            Column::make('licenza')->title('Licenza')->responsivePriority(2),
            Column::make('url_stampante')->title('URL della stampante')->responsivePriority(2),
            Column::make('ubicazione')->title('Ubicazione')->responsivePriority(2),
            // Column::make('note')->title('Note'),
            Column::make('pin_sblocco')->title('Pin di sblocco')->responsivePriority(2),
            Column::computed('abbinato_display')->title('Abbinato')->responsivePriority(2),
            // Column::make('data_apertura_dispositivo')->title('Data di apertura del dispositivo'),
            // Column::make('data_chiusura_dispositivo')->title('Data di chiusura del dispositivo'),
            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 'PuntoVendita_' . date('YmdHis');
    }
}
