<?php

namespace App\Filament\Pages;

use App\Models\Plant;
use Filament\Facades\Filament;
use Filament\Forms\Components\DatePicker;
use Filament\Pages\Page;
use Filament\Forms\Form;
use Filament\Forms\Components\Section;
use Filament\Forms\Components\Select;
use Filament\Forms\Components\TextInput;
use Filament\Notifications\Notification;
use Illuminate\Support\Facades\Auth;

class ProductionTarget extends Page
{
    protected static ?string $navigationIcon = 'heroicon-o-document-text';

    protected static string $view = 'filament.pages.production-target';

    protected static ?string $navigationGroup = 'Production';

    public array $filters = [];


    public function form(Form $form): Form
    {
        return $form
            ->statePath('filters')
            ->schema([
                Section::make('')
                    ->schema([
                        Select::make('year')
                            ->label('Year')
                            ->reactive()
                            // ->searchable()
                            ->options([
                                '2025' => '2025',
                                '2026' => '2026',
                                '2027' => '2027',
                                '2028' => '2028',
                                '2029' => '2029',
                                '2030' => '2030',
                                '2031' => '2031',
                                '2032' => '2032',
                                '2033' => '2033',
                                '2034' => '2034',
                                '2035' => '2035',
                                '2036' => '2036',
                                '2037' => '2037',
                                '2038' => '2038',
                                '2039' => '2039',
                                '2040' => '2040',
                            ])
                            ->required()
                            ->afterStateUpdated(function ($state, callable $get, $set) {
                                $set('month', null);
                                $set('plant_id', null);
                                $set('line_id', null);
                                $set('category', null);
                                $plantId = $get('plant_id');
                                $lineId = $get('line_id');
                                // $this->dispatch('loadData',$plantId, $lineId, $state, '');
                                $this->dispatch('loadData',$state, '', '', '', '');
                            }),

                        Select::make('month')
                            ->label('Month')
                            ->reactive()
                            // ->searchable()
                            ->options([
                                '01' => 'January',
                                '02' => 'February',
                                '03' => 'March',
                                '04' => 'April',
                                '05' => 'May',
                                '06' => 'June',
                                '07' => 'July',
                                '08' => 'August',
                                '09' => 'September',
                                '10' => 'October',
                                '11' => 'November',
                                '12' => 'December',
                            ])
                            ->required()
                            ->afterStateUpdated(function ($state, callable $get, $set) {

                                $set('plant_id', null);
                                $set('line_id', null);
                                $set('category', null);

                                $year = $get('year');

                                $this->dispatch('loadData',$year, $state, '', '', '');

                                // $plantId = $get('plant_id');
                                // $lineId = $get('line_id');
                                // // $month = $get('month');
                                // $year = $get('year');

                                // $month = (int) $get('month');

                                // if (!$month) {
                                //     return;
                                // }
                                // $this->dispatch('loadData', $plantId, $lineId, $month, $year);
                            }),
                        Select::make('plant_id')
                            ->label('Plant')
                            ->relationship('plant', 'name')
                            ->reactive()
                            // ->searchable()
                            ->options(function (callable $get) {
                                $userHas = Filament::auth()->user()->plant_id;
                                return ($userHas && strlen($userHas) > 0) ? Plant::where('id', $userHas)->pluck('name', 'id')->toArray() : Plant::pluck('name', 'id')->toArray();
                            })
                            ->required()
                            ->afterStateUpdated(function ($state, callable $get, $set) {
                                // dd($state);
                                $set('line_id', null);
                                $set('category', null);
                                $this->dispatch('loadData',$state, '', '', '', '');
                            }),
                        Select::make('line_id')
                            ->label('Line')
                            ->required()
                            ->relationship('line', 'name')
                            // ->searchable()
                            ->columnSpan(1)
                            ->options(function (callable $get) {
                                if (!$get('plant_id')) {
                                    return [];
                                }

                                return \App\Models\Line::where('plant_id', $get('plant_id'))
                                    ->pluck('name', 'id')
                                    ->toArray();
                            })
                            ->reactive()
                            ->afterStateUpdated(function ($state, callable $get, $set) {
                                $plantId = $get('plant_id');
                                $lineId = $get('line_id');
                                // $month = $get('month');
                                $year = $get('year');

                                $month = (int) $get('month');
                                $this->dispatch('loadData',$year, $month, $plantId, $lineId, '');
                            }),

                        TextInput::make('category')
                            ->label('Category')
                            ->reactive()
                            ->afterStateUpdated(function ($state, callable $get, $set) {
                                $plantId = $get('plant_id');
                                $lineId = $get('line_id');
                                // $month = $get('month');
                                $year = $get('year');

                                $month = (int) $get('month');
                                $category = $get('category');
                                $this->dispatch('loadData',$year, $month, $plantId, $lineId, $category);
                            }),

                    ])
                    ->columns(5)
            ]);
    }

    public function export(){

        $plantId = $this->filters['plant_id'] ?? null;
        $lineId = $this->filters['line_id'] ?? null;
        $year = $this->filters['year'] ?? null;
        $month = $this->filters['month'] ?? null;

        if (! $plantId) {
            Notification::make()
                ->title('Plant')
                ->body("please select plant to export data..!")
                ->danger()
                ->send();
            return;
        }
        else if (! $lineId) {
            Notification::make()
                ->title('Line')
                ->body("please select line to export data..!")
                ->danger()
                ->send();
            return;
        }
        else if (! $year) {
            Notification::make()
                ->title('Year')
                ->body("please select year to export data..!")
                ->danger()
                ->send();
            return;
        }
        else if (! $month) {
            Notification::make()
                ->title('Month')
                ->body("please select month to export data..!")
                ->danger()
                ->send();
            return;
        }

        $this->dispatch('loadData1' ,$plantId, $lineId, $year, $month);
    }

    public static function canAccess(): bool
    {
        return Auth::check() && Auth::user()->can('view production target page');
    }
}
