<?php

namespace App\Filament\Pages;

use App\Models\LocatorInvoiceValidation;
use App\Models\PalletValidation;
use App\Models\Plant;
use Filament\Facades\Filament;
use Illuminate\Support\Facades\Auth;
use Filament\Forms\Contracts\HasForms;
use Filament\Forms\Concerns\InteractsWithForms;
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;

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

    protected static string $view = 'filament.pages.invoice-finder';

    protected static ?string $navigationGroup = 'Export Dispatch';

    protected static ?int $navigationSort = 6;

    //use InteractsWithForms;

    public $pId, $invoiceNumber;

    public array $invoiceOverviewData = [];

    public array $filters = [];

    public function form(Form $form): Form
    {
        return $form
            ->statePath('filters')
            ->schema([
                Section::make('') // You can give your section a title or leave it blank
                    ->schema([
                        Select::make('plant_id')
                            ->label('Plant')
                            //->options(Plant::pluck('name', 'id'))
                            ->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();
                            })
                            ->reactive()
                            ->required(),
                        TextInput::make('scan_invoice')
                            ->label('Scan Invoice')
                            ->required()
                            ->reactive()
                            ->extraAttributes([
                                'wire:keydown.enter' => 'processInvoiceNo($event.target.value)',
                            ]),
                        TextInput::make('scan_quantity')
                            ->label('Scanned Quantity ')
                            ->readOnly()
                            ->reactive(),
                        TextInput::make('pending_quantity')
                            ->label('Pending Quantity')
                            ->readOnly()
                            ->reactive(),
                        TextInput::make('total_sno_quantity')
                            ->label('Invoice Quantity')
                            ->readOnly()
                            ->reactive(),

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

    public function processInvoiceNo($invoiceNo)
    {
        $plantId = $this->form->getState()['plant_id'];

        if(!$invoiceNo)
        {
            Notification::make()
                ->title("Invoice number '$invoiceNo' can't be empty!")
                ->danger()
                ->duration(5000)
                ->send();
            $this->dispatch('loadData', '', [], [], [], [], $plantId);
            $this->form->fill([
                'plant_id'           => $plantId,
                'scan_invoice'       => $invoiceNo,
                'total_sno_quantity' => 0,
                'pending_quantity'   => 0,
                'scan_quantity'      => 0
            ]);
            return;
        }

        $invoiceExists = LocatorInvoiceValidation::where('plant_id', $plantId)
        ->where('invoice_number', $invoiceNo)
        ->first();

        if(!$invoiceExists)
        {
            Notification::make()
                ->title("Invoice number '$invoiceNo' does not exist in locator invoice table!")
                ->danger()
                ->duration(5000)
                ->send();
            $this->dispatch('loadData', '', [], [], [], [], $plantId);
            $this->form->fill([
                'plant_id'           => $plantId,
                'scan_invoice'       => null,//$invoiceNo,
                'total_sno_quantity' => 0,
                'pending_quantity'   => 0,
                'scan_quantity'      => 0
            ]);
            return;
        }

        $invoiceCompleted = LocatorInvoiceValidation::where('plant_id', $plantId)
        ->where('invoice_number', $invoiceNo)
        ->whereNull('scanned_status')
        ->orWhere('scanned_status', '=','')
        ->first();

        if(!$invoiceCompleted)
        {
            // $count = LocatorInvoiceValidation::where('invoice_number', $invoiceNo)
            // ->where('plant_id', $plantId)
            // ->count();
            Notification::make()
                ->title("Invoice number '$invoiceNo' already completed the scanning process..!")
                ->success()
                ->duration(5000)
                ->send();
            $this->dispatch('loadData', '', [], [], [], [], $plantId);

            $this->form->fill([
                'plant_id'           => $plantId,
                'scan_invoice'       => null,//$invoiceNo,
                'total_sno_quantity' => 0,//$count,
                'pending_quantity'   => 0,//0,
                'scan_quantity'      => 0//$count
            ]);
            return;
        }

        $serialNumbers = LocatorInvoiceValidation::where('plant_id', $plantId)
            ->where('invoice_number', $invoiceNo)
            ->pluck('serial_number');

        $notFoundSerials = [];
        $incompleteSerials = [];
        $scannedSerials = [];
        $foundSerials = [];

        foreach ($serialNumbers as $serial)
        {
            $locatorRecord = LocatorInvoiceValidation::where('serial_number', $serial)
                ->where('plant_id', $plantId)
                ->first();

            //$scannedStatus = $locatorRecord->scanned_status ?? null;

            if ($locatorRecord->scanned_status == 'Scanned')
            {
                $scannedSerials[] = $serial;
                continue;
            }

            $palletRecord = palletValidation::where('serial_number', $serial)
            ->where('plant_id', $plantId)
            ->first();

            if (!$palletRecord)
            {
                $notFoundSerials[] = $serial;
                continue;
            }

            $palletStatus = $palletRecord->pallet_status ?? null;

            if (strlen($palletRecord->pallet_number) > 1 && ($palletStatus == '' || $palletStatus == null))
            {
                $incompleteSerials[] = $serial;
                continue;
            }

            $foundSerials[] = $serial;
        }

        $count = LocatorInvoiceValidation::where('invoice_number', $invoiceNo)
            ->where('plant_id', $plantId)
            ->count();

        $pendingCount = LocatorInvoiceValidation::where('invoice_number', $invoiceNo)
            ->where('plant_id', $plantId)
            ->whereNull('scanned_status')
            ->orWhere('scanned_status', '=', '')
            ->count();

        $scannedCount = LocatorInvoiceValidation::where('invoice_number', $invoiceNo)
            ->where('plant_id', $plantId)
            ->where('scanned_status', '=', 'Scanned')
            ->count();

        $this->form->fill([
            'plant_id'           => $plantId,
            'scan_invoice'       => $invoiceNo,
            'total_sno_quantity' => $count,
            'pending_quantity'   => $pendingCount,
            'scan_quantity'      => $scannedCount,
        ]);

        $this->dispatch('loadData', $invoiceNo, $notFoundSerials, $incompleteSerials, $scannedSerials, $foundSerials, $plantId);
    }

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

}
