<?php

namespace App\Filament\Resources;

use AlperenErsoy\FilamentExport\Actions\FilamentExportBulkAction;
use App\Filament\Exports\AxnExporter;
use App\Filament\Exports\InvoiceValidationExporter;
use App\Filament\Exports\MaterialInvoiceValidationExporter;
use App\Filament\Imports\InvoiceValidationImporter;
use App\Filament\Imports\SapInvoiceValidationImporter;
use App\Filament\Resources\InvoiceValidationResource\Pages;
use App\Mail\InvoiceNotification;
use App\Models\InvoiceValidation;
use App\Models\Item;
use App\Models\Plant;
use App\Models\StickerMaster;
use Filament\Facades\Filament;
use Filament\Forms;
use Filament\Forms\Components\DateTimePicker;
use Filament\Forms\Components\FileUpload;
use Filament\Forms\Components\Radio;
use Filament\Forms\Components\Section;
use Filament\Forms\Components\Select;
use Filament\Forms\Components\TextInput;
use Filament\Forms\Components\ToggleButtons;
use Filament\Forms\Components\View;
use Filament\Forms\Form;
use Filament\Forms\Get;
use Filament\Notifications\Notification;
use Filament\Resources\Resource;
use Filament\Tables;
use Filament\Tables\Actions\Action;
use Filament\Tables\Actions\ExportAction;
use Filament\Tables\Actions\ImportAction;
use Filament\Tables\Filters\Filter;
use Filament\Tables\Table;
use Illuminate\Database\Eloquent\Builder;
use Illuminate\Database\Eloquent\SoftDeletingScope;
use Illuminate\Support\Facades\Session;
use Illuminate\Support\Facades\Storage;
use Livewire\Livewire;
use Maatwebsite\Excel\Facades\Excel;
use Str;

class InvoiceValidationResource extends Resource
{
    protected static ?string $model = InvoiceValidation::class;

    protected static ?string $navigationIcon = 'heroicon-o-rectangle-stack';

    protected static ?string $navigationGroup = 'Invoice';

    public $invoiceNumber;

    public static function form(Form $form): Form
    {
        return $form
            ->schema([
                // Forms\Components\Hidden::make('sticker_master_id')
                //  //->relationship('stickerMaster', 'id')
                //  ->required(),

                Section::make('')
                    ->schema([
                        Forms\Components\Select::make('plant_id')
                            ->label('Plant Name')
                            ->relationship('plant', 'name')
                            ->required()
                            // ->preload()
                            // ->nullable(),
                            ->reactive()
                            ->columnSpan(1)
                            ->options(function (callable $get) {
                                $userHas = Filament::auth()->user()->plant_id;

                                return ($userHas && strlen($userHas) > 0) ? Plant::where('id', $userHas)->pluck('name', 'id')->toArray() : Plant::orderBy('code')->pluck('name', 'id')->toArray();
                            })
                            ->default(function () {
                                $userHas = Filament::auth()->user()->plant_id;

                                return ($userHas && strlen($userHas) > 0) ? $userHas : optional(InvoiceValidation::latest()->first())->plant_id;
                                // return optional(InvoiceValidation::latest()->first())->plant_id;
                            })
                            ->disabled(fn (Get $get) => ! empty($get('id')))
                            // ->afterStateUpdated(fn ($set) => $set('block_id', null) & $set('name', null) & $set('start_time', null) & $set('duration', null) & $set('end_time', null))
                            ->afterStateUpdated(function ($state, callable $set, callable $get) {
                                $plantId = $get('plant_id');
                                $set('update_invoice', null);

                                if (! $plantId) {
                                    $set('invoice_number', null);
                                    $set('serial_number', null);
                                    $set('total_quantity', null);
                                    $set('scanned_quantity', null);
                                    $set('ivPlantError', 'Please select a plant first.');

                                    return;
                                } else {
                                    $plantCode = Plant::find($plantId)?->code ?? null;
                                    $directory = "uploads/temp/{$plantCode}";
                                    if (! Storage::disk('local')->exists($directory)) {
                                        Storage::disk('local')->makeDirectory($directory);
                                    }
                                    $set('ivPlantError', null);
                                }
                            })
                            ->extraAttributes(fn ($get) => [
                                'class' => $get('ivPlantError') ? 'border-red-500' : '',
                            ])
                            ->hint(fn ($get) => $get('ivPlantError') ? $get('ivPlantError') : null)
                            ->hintColor('danger'),

                        Forms\Components\TextInput::make('invoice_number')
                            ->label('Invoice Number')
                            ->required()
                            ->reactive()
                            ->columnSpan(1)
                            ->readOnly(fn (callable $get) => ! empty($get('serial_number')))
                            // ->disabled(fn (Get $get) => !empty($get('serial_number')))
                            ->extraAttributes([
                                'id' => 'invoice_number_input',
                                'x-data' => '{ value: "" }',
                                'x-model' => 'value',
                                'wire:keydown.enter.prevent' => 'processInvoice(value)',
                                // 'x-on:keydown.enter.prevent' => '$wire.processInvoice(value)',
                            ])
                            // ->afterStateHydrated(function (TextInput $component, string $state) {
                            //     $component->state(ucwords($state));
                            // })
                            ->autofocus(function ($state, callable $set, callable $get) {
                                $plantId = $get('plant_id');
                                $sNo = $get('serial_number');
                                if (! $plantId || $sNo) {
                                    return false;
                                } elseif ($plantId && ! $sNo) {
                                    return true;
                                } else {
                                    return false;
                                }
                            })
                            ->afterStateUpdated(function ($state, callable $set, callable $get) {
                                // $invNo = $get('invoice_number');
                                $set('serial_number', null);
                                $set('update_invoice', null);
                                if (strlen($state) <= 15) {
                                    $set('invoice_number', strtoupper($state));
                                    session(['invoice_number' => strtoupper($state)]);
                                } else {
                                    // Session::put('invoice_number', $state);
                                    session(['invoice_number' => $state]);

                                    // if (!$invNo) { return; } else { }
                                }
                            }),

                        Forms\Components\TextInput::make('serial_number')
                            ->label('Serial Number')
                            ->reactive()
                            ->readOnly(fn (callable $get) => empty($get('invoice_number')))
                            ->disabled(fn (Get $get) => empty($get('invoice_number')))
                            // ->extraAttributes([
                            //     'id' => 'serial_number_input',
                            //     'x-data' => '{ value: "" }',
                            //     'x-model' => 'value',
                            //     'wire:keydown.enter.prevent' => 'processSerial(value)',  // Using wire:keydown
                            // ])
                            ->dehydrated(false) // Do not trigger Livewire syncing
                            ->extraAttributes([
                                'id' => 'serial_number_input',
                                'x-on:keydown.enter.prevent' => "
                            let serial = \$event.target.value;
                            if (serial.trim() != '') {
                                \$wire.dispatch('process-scan', serial);
                                \$event.target.value = '';
                            }
                        ",
                            ])
                            ->afterStateUpdated(function ($state, callable $set, callable $get, callable $livewire) {
                                $set('update_invoice', 0);
                                // $this->dispatch('focus-serial-number');
                                // if (!$invNo) { return; } else { }
                                // if ($state) {
                                //     $livewire('process-scan', $state);
                                //     $set('serial_number', null);
                                // }
                            })
                            ->columnSpan(1),
                        Forms\Components\TextInput::make('total_quantity')
                            ->label('Total Quantity')
                            ->readOnly(true)
                            ->columnSpan(1),
                        Forms\Components\TextInput::make('scanned_quantity')
                            ->label('Scanned Quantity')
                            ->readOnly(true)
                            ->columnSpan(1),
                        ToggleButtons::make('update_invoice')
                            ->label('Update Invoice?')
                            ->boolean()
                            ->grouped()
                            ->reactive()
                            ->hidden(fn (callable $get) => ($get('invoice_number') == null || $get('update_invoice') == '0') || ! empty($get('serial_number')))
                            ->afterStateUpdated(function ($state, callable $set, callable $get) {
                                if (! $get('plant_id')) {
                                    $set('update_invoice', null);

                                    return;
                                }
                                $invoiceNumber = $get('invoice_number');
                                if ($get('update_invoice') == '1') {
                                    $totQuan = InvoiceValidation::where('invoice_number', $invoiceNumber)->where('plant_id', $get('plant_id'))->count();
                                    if ($totQuan <= 0) {
                                        $set('update_invoice', null);

                                        return;
                                    }

                                    $totMQuan = InvoiceValidation::where('invoice_number', $invoiceNumber)->whereNotNull('quantity')->where('plant_id', $get('plant_id'))->count();
                                    $scanMQuan = InvoiceValidation::where('invoice_number', $invoiceNumber)->whereNotNull('serial_number')->where('serial_number', '!=', '')->where('plant_id', $get('plant_id'))->count();
                                    $scanSQuan = InvoiceValidation::where('invoice_number', $invoiceNumber)->where('scanned_status', 'Scanned')->where('plant_id', $get('plant_id'))->count();

                                    if ($totMQuan > 0) {
                                        if ($totQuan == $scanMQuan) {
                                            $set('update_invoice', null);

                                            return;
                                        }
                                    } else {
                                        if ($totQuan == $scanSQuan) {
                                            $set('update_invoice', null);

                                            return;
                                        }
                                    }
                                }
                            })
                            ->disabled(fn (Get $get) => empty($get('invoice_number'))),
                        Forms\Components\TextInput::make('id')
                            ->hidden()
                            ->readOnly(true),
                        // Forms\Components\Hidden::make('created_by')
                        //     ->label('Created By')
                        //     ->default(Filament::auth()->user()?->name)
                        //     ->reactive(),
                        // Forms\Components\Hidden::make('updated_by')
                        //     ->label('Updated By')
                        //     ->default(Filament::auth()->user()?->name)
                        //     ->reactive(),
                    ])
                    ->columns(5),
            ]);
    }

    public static function table(Table $table): Table
    {
        return $table
            ->query(InvoiceValidation::query())
            ->columns([
                // Tables\Columns\TextColumn::make('id')
                //     ->label('ID')
                //     ->numeric()
                //     ->sortable(),
                Tables\Columns\TextColumn::make('No.')
                    ->label('No.')
                    ->getStateUsing(function ($record, $livewire, $column, $rowLoop) {
                        $paginator = $livewire->getTableRecords();
                        $perPage = method_exists($paginator, 'perPage') ? $paginator->perPage() : 10;
                        $currentPage = method_exists($paginator, 'currentPage') ? $paginator->currentPage() : 1;

                        return ($currentPage - 1) * $perPage + $rowLoop->iteration;
                    }),
                Tables\Columns\TextColumn::make('invoice_number')
                    ->label('Invoice Number')
                    ->alignCenter()
                    ->sortable(), // ->searchable()
                Tables\Columns\TextColumn::make('stickerMaster.item.code')
                    ->label('Item Code')
                    ->alignCenter()
                    ->sortable(), // ->searchable()
                Tables\Columns\TextColumn::make('stickerMaster.item.description')
                    ->label('Item Description')
                    ->alignCenter()
                    ->sortable() // ->searchable()
                    ->toggleable(isToggledHiddenByDefault: true),
                Tables\Columns\TextColumn::make('stickerMaster.item.uom')
                    ->label('Unit of Measure')
                    ->alignCenter()
                    ->sortable() // ->searchable()
                    ->toggleable(isToggledHiddenByDefault: true),
                Tables\Columns\TextColumn::make('stickerMaster.material_type')
                    ->label('Material Type')
                    ->alignCenter() // ->searchable()
                    ->sortable()
                    ->formatStateUsing(fn ($state) => match ($state) {
                        1 => 'Individual',
                        2 => 'Bundle',
                        3 => 'Quantity',
                        4 => 'Bundle Individual',
                        default => '-',
                    })
                    ->toggleable(isToggledHiddenByDefault: true),
                Tables\Columns\TextColumn::make('serial_number')
                    ->label('Serial Number')
                    ->alignCenter()
                    ->sortable(), // ->searchable()
                Tables\Columns\TextColumn::make('motor_scanned_status')
                    ->label('Motor Scanned Status')
                    ->alignCenter(),
                Tables\Columns\TextColumn::make('pump_scanned_status')
                    ->label('Pump Scanned Status')
                    ->alignCenter(),
                Tables\Columns\TextColumn::make('scanned_status_set')
                    ->label('Pump Set Scanned Status')
                    ->alignCenter(),
                Tables\Columns\TextColumn::make('capacitor_scanned_status')
                    ->label('Capacitor Scanned Status')
                    ->alignCenter(),
                Tables\Columns\TextColumn::make('scanned_status')
                    ->label('Scanned Status')
                    ->alignCenter(),
                Tables\Columns\TextColumn::make('panel_box_code')// stickerMaster.panel_box_code
                    ->label('Panel Box Code')
                    ->alignCenter() // ->searchable()
                    ->sortable(),
                // ->toggleable(isToggledHiddenByDefault: true),
                Tables\Columns\TextColumn::make('panel_box_supplier')
                    ->label('Panel Box Supplier')
                    ->alignCenter(),
                Tables\Columns\TextColumn::make('panel_box_serial_number')
                    ->label('Panel Box Serial Number')
                    ->alignCenter(),
                Tables\Columns\TextColumn::make('load_rate')
                    ->label('Load Rate')
                    ->numeric()
                    ->alignCenter(),
                Tables\Columns\TextColumn::make('upload_status')
                    ->label('Upload Status')
                    ->alignCenter(),
                Tables\Columns\TextColumn::make('batch_number')
                    ->label('Batch Number')
                    ->alignCenter(),
                Tables\Columns\TextColumn::make('quantity')
                    ->label('Quantity')
                    ->alignCenter()
                    ->numeric(),
                Tables\Columns\TextColumn::make('plant.name')
                    ->label('Plant Name')
                    ->alignCenter()
                    ->sortable(),
                Tables\Columns\TextColumn::make('created_by')
                    ->label('Created By')
                    ->alignCenter()
                    ->sortable(),
                Tables\Columns\TextColumn::make('created_at')
                    ->label('Created At')
                    ->dateTime()
                    ->alignCenter()
                    ->sortable(),
                Tables\Columns\TextColumn::make('updated_by')
                    ->label('Updated By')
                    ->alignCenter()
                    ->sortable()
                    ->toggleable(isToggledHiddenByDefault: true),
                Tables\Columns\TextColumn::make('updated_at')
                    ->label('Updated At')
                    ->dateTime()
                    ->alignCenter()
                    ->sortable()
                    ->toggleable(isToggledHiddenByDefault: true),
                Tables\Columns\TextColumn::make('deleted_at')
                    ->label('Deleted At')
                    ->dateTime()
                    ->alignCenter()
                    ->sortable()
                    ->toggleable(isToggledHiddenByDefault: true),
                Tables\Columns\TextColumn::make('operator_id')
                    ->label('Operator ID')
                    ->alignCenter()
                    ->sortable(),
            ])

            ->headerActions([
                // Action::make('plant_id')
                // ->label('Select Plant')
                // ->form([
                //     Select::make('plant_id')
                //         ->options(Plant::pluck('name', 'id')->toArray()) // Fetch plant names and IDs
                //         ->label('Select Plant')
                //         ->required()
                //         ->reactive()
                //     ]),

                Tables\Actions\Action::make('Import Serial Number')
                    ->label('Import Serial Invoice')
                    ->form([
                        Select::make('plant_id')
                            // ->options(Plant::pluck('name', 'id')->toArray()) // Fetch plant names and IDs
                            ->options(function (callable $get) {
                                $userHas = Filament::auth()->user()->plant_id;

                                return ($userHas && strlen($userHas) > 0) ? Plant::where('id', $userHas)->pluck('name', 'id')->toArray() : Plant::orderBy('code')->pluck('name', 'id')->toArray();
                            })
                            ->searchable()
                            ->label('Search by Plant Name')
                            ->required()
                            ->default(function () {
                                return optional(InvoiceValidation::latest()->first())->plant_id;
                            })
                            ->afterStateUpdated(function ($state, callable $set, callable $get) {
                                $set('invoice_serial_number', null);
                                $plantId = $get('plant_id');
                                if (! $plantId) {
                                    $set('invoice_serial_number', null);

                                    return;
                                }
                                $plantCode = Plant::find($plantId)?->code ?? null;

                                $directory = "uploads/temp/{$plantCode}";
                                if ($plantId && ! Storage::disk('local')->exists($directory)) {
                                    Storage::disk('local')->makeDirectory($directory);
                                }
                            })
                            ->reactive(),

                        FileUpload::make('invoice_serial_number')
                            ->label('Choose Serial Invoice')
                            ->required()
                            ->acceptedFileTypes([
                                'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet',
                                // 'application/vnd.ms-excel', // Legacy .xls fallback if needed
                            ])
                            ->rules(['mimes:xlsx', 'max:50']) // Laravel validation: extension check
                            ->maxSize(50)
                            ->preserveFilenames() // <- this keeps the original filename
                            ->reactive()
                            ->storeFiles(false) // prevent auto-storing, we will store manually
                            ->disk('local') // 'local' refers to the local storage disk defined in config/filesystems.php, typically pointing to storage/app.
                            ->visible(fn (Get $get) => ! empty($get('plant_id')))
                            ->directory(function (callable $get) {
                                $plant = Plant::find($get('plant_id'));
                                $plantCode = $plant?->code ?? null;

                                return "uploads/temp/{$plantCode}";
                            })
                            ->uploadingMessage('Uploading...')
                            ->helperText('Only .xlsx files are allowed (Excel files).'),
                    ])
                    ->action(function (array $data) {
                        $uploadedFile = $data['invoice_serial_number'];

                        $disk = Storage::disk('local');

                        $plantId = $data['plant_id'];

                        $plant = Plant::find($plantId);
                        $plantCode = $plant?->code ?? null;

                        // Get original filename
                        $originalName = $uploadedFile->getClientOriginalName(); // e.g. 3RA0018732.xlsx

                        $extension = strtolower(pathinfo($originalName, PATHINFO_EXTENSION));
                        if ($extension != 'xlsx') {
                            throw new \Exception('Only .xlsx files allowed.');
                        }

                        $originalNameOnly = strtoupper(pathinfo($originalName, PATHINFO_FILENAME));

                        $originalName = "{$originalNameOnly}.xlsx";

                        // Store manually using storeAs to keep original name
                        $path = $uploadedFile->storeAs("uploads/temp/{$plantCode}", $originalName, 'local'); // returns relative path
                        // uploads/temp/{$plantCode}/3RA0018735.xlsx

                        if (strlen($originalNameOnly) < 8 || ! ctype_alnum($originalNameOnly)) {
                            Notification::make()
                                ->title("Serial invoice number : '$originalNameOnly' should contain minimum 8 digit alpha numeric values!")
                                ->danger()
                                ->send();

                            if ($disk->exists($path)) {
                                $disk->delete($path);
                            }

                            return;
                        }

                        $fullPath = Storage::disk('local')->path($path);
                        // /home/iot-dev/projects/pds/storage/app/private/uploads/temp/{$plantCode}/3RA0018735.xlsx

                        $totQuan = InvoiceValidation::where('invoice_number', $originalNameOnly)->count();
                        if ($totQuan > 0) {
                            $scanSQuan = InvoiceValidation::where('invoice_number', $originalNameOnly)->where('scanned_status', 'Scanned')->count();
                            if ($totQuan == $scanSQuan) {
                                $invoiceFirst = InvoiceValidation::with('plant')->where('invoice_number', $originalNameOnly)->first();
                                $plantName = $invoiceFirst ? (string) $invoiceFirst->plant->name : null;

                                Notification::make()
                                    ->title("Serial invoice number : '$originalNameOnly' already completed the scanning process for plant : '$plantName'.")
                                    ->danger()
                                    ->send();

                                if ($disk->exists($path)) {
                                    $disk->delete($path);
                                }

                                return;
                            } else {
                                $invoiceFirst = InvoiceValidation::with('plant')->where('invoice_number', $originalNameOnly)->first();
                                // $plantCode = $invoiceFirst ? (String)$invoiceFirst->plant->code : null;
                                $plantName = $invoiceFirst ? (string) $invoiceFirst->plant->name : null;
                                $invoicePlantId = $invoiceFirst->plant_id;
                                if ($plantId != $invoicePlantId) {
                                    Notification::make()
                                        ->title("Serial invoice number : '$originalNameOnly' already exists for plant : '$plantName'.<br>Choose the valid 'Plant' to proceed!")
                                        ->danger()
                                        ->send();

                                    if ($disk->exists($path)) {
                                        $disk->delete($path);
                                    }

                                    return;
                                }
                            }
                        }

                        $totQuan = InvoiceValidation::where('invoice_number', $originalNameOnly)->where('plant_id', $plantId)->count();
                        $scanSQuan = InvoiceValidation::where('invoice_number', $originalNameOnly)->where('scanned_status', 'Scanned')->where('plant_id', $plantId)->count();

                        if ($totQuan > 0 && $totQuan == $scanSQuan) {
                            Notification::make()
                                ->title('Serial invoice already completed the scanning process for selected plant.')
                                ->danger()
                                ->send();

                            if ($disk->exists($path)) {
                                $disk->delete($path);
                            }

                            return;
                        }

                        if ($fullPath && file_exists($fullPath)) {
                            $rows = Excel::toArray(null, $fullPath)[0];

                            if ((count($rows) - 1) <= 0) {
                                Notification::make()
                                    ->title('Records Not Found')
                                    ->body("Import the valid 'Serial Invoice' file to proceed..!")
                                    ->danger()
                                    ->send();

                                if ($disk->exists($path)) {
                                    $disk->delete($path);
                                }

                                return;
                            }

                            $invalidMatCodes = [];
                            $invalidSerialCodes = [];
                            $materialCodes = [];
                            $missingSerials = [];
                            $duplicateSerials = [];
                            $seenSerialNumbers = [];
                            $validRowsFound = false;

                            foreach ($rows as $index => $row) {
                                if ($index == 0) {
                                    continue;
                                }  // Skip header

                                $materialCode = trim($row[0]);
                                $serialNumber = trim($row[1]);

                                if (empty($materialCode) && empty($serialNumber)) {
                                    continue;
                                }

                                if (! empty($materialCode)) {
                                    if (Str::length($materialCode) < 6 || ! ctype_alnum($materialCode)) {
                                        $invalidMatCodes[] = $materialCode;
                                    } else {
                                        if (empty($serialNumber)) {
                                            $missingSerials[] = $materialCode;

                                        } elseif (Str::length($serialNumber) < 9 || ! ctype_alnum($serialNumber)) {
                                            $invalidSerialCodes[] = $serialNumber;
                                        } else {
                                            if (in_array($serialNumber, $seenSerialNumbers)) {
                                                $duplicateSerials[] = $serialNumber;
                                            } else {
                                                $seenSerialNumbers[] = $serialNumber;
                                                $materialCodes[] = $materialCode;
                                                $validRowsFound = true;
                                            }
                                        }
                                    }
                                } else {
                                    continue;
                                }
                            }

                            $uniqueInvalidCodes = array_unique($invalidMatCodes);

                            $uniqueMissingSerials = array_unique($missingSerials);

                            $uniqueSerialCodes = array_unique($invalidSerialCodes);

                            $duplicateSerialCodes = array_unique($duplicateSerials);

                            if (! empty($uniqueInvalidCodes)) {
                                Notification::make()
                                    ->title('Invalid Item Codes')
                                    ->body('The following item codes should contain minimum 6 digit alpha numeric values:<br>'.implode(', ', $uniqueInvalidCodes))
                                    ->danger()
                                    ->send();
                                if ($disk->exists($path)) {
                                    $disk->delete($path);
                                }

                                return;
                            } elseif (! empty($uniqueMissingSerials)) {
                                Notification::make()
                                    ->title('Missing Serial Numbers')
                                    ->body("The following item codes doesn't have valid serial number:<br>".implode(', ', $uniqueMissingSerials))
                                    ->danger()
                                    ->send();
                                if ($disk->exists($path)) {
                                    $disk->delete($path);
                                }

                                return;
                            } elseif (! empty($uniqueSerialCodes)) {
                                Notification::make()
                                    ->title('Invalid Serial Number')
                                    ->body('The following serial numbers should contain minimum 9 digit alpha numeric values:<br>'.implode(', ', $uniqueSerialCodes))
                                    ->danger()
                                    ->send();
                                if ($disk->exists($path)) {
                                    $disk->delete($path);
                                }

                                return;
                            } elseif (! empty($duplicateSerialCodes)) {
                                Notification::make()
                                    ->title('Duplicate Serial Numbers')
                                    ->body('The following serial numbers are already exist in imported excel:<br>'.implode(', ', $duplicateSerialCodes))
                                    ->danger()
                                    ->send();
                                if ($disk->exists($path)) {
                                    $disk->delete($path);
                                }

                                return;
                            } elseif (! $validRowsFound) {
                                Notification::make()
                                    ->title('Invalid Serial Invoice')
                                    ->danger()  // This makes the notification red to indicate an error
                                    ->body('Uploaded Excel sheet is empty or<br>contains no valid data.')
                                    ->send();
                                if ($disk->exists($path)) {
                                    $disk->delete($path);
                                }

                                return;
                            }

                            $uniqueCodes = array_unique($materialCodes);

                            $matchedItems = StickerMaster::with('item')->where('plant_id', $plantId)
                                ->whereHas('item', function ($query) use ($uniqueCodes, $plantId) {
                                    $query->whereIn('code', $uniqueCodes)->where('plant_id', $plantId);
                                })
                                ->get();

                            $matchedCodes = $matchedItems->pluck('item.code')->toArray();

                            $missingCodes = array_diff($uniqueCodes, $matchedCodes);

                            if (! empty($missingCodes)) {
                                $missingCount = count($missingCodes);

                                $message = $missingCount > 10 ? "'$missingCount' item codes are not found in sticker master." : 'The following item codes are not found in sticker master:<br>'.implode(', ', $missingCodes);

                                Notification::make()
                                    ->title('Unknown Item Codes')
                                    ->body($message)
                                    ->danger()
                                    ->send();

                                if ($disk->exists($path)) {
                                    $disk->delete($path);
                                }

                                return;
                            }

                            // Check which codes have a material_type set (not null)
                            $invalidCodes = $matchedItems
                                ->filter(fn ($sticker) => ! empty($sticker->material_type))  // filter invalid
                                ->pluck('item.code')
                                ->toArray();

                            if (count($invalidCodes) > 10) {
                                Notification::make()
                                    ->title('Invalid item codes found')
                                    ->body(''.count($invalidCodes).' item codes have material type.')
                                    ->danger()
                                    ->send();

                                if ($disk->exists($path)) {
                                    $disk->delete($path);
                                }

                                return;
                            } elseif (count($invalidCodes) > 0) {
                                Notification::make()
                                    ->title('Invalid item codes found')
                                    ->body('Material invoice Item Codes found : '.implode(', ', $invalidCodes))
                                    ->danger()
                                    ->send();

                                if ($disk->exists($path)) {
                                    $disk->delete($path);
                                }

                                return;
                            } else {
                                // Save full file path to session
                                session(['uploaded_invoice_path' => $fullPath]);
                                Notification::make()
                                    ->title('Serial invoice imported successfully.')
                                    ->success()
                                    ->send();
                            }
                        }
                    })
                    ->visible(function () {
                        return Filament::auth()->user()->can('view import serial invoice');
                    }),
                Tables\Actions\Action::make('Import Invoice Material')
                    ->label('Import Material Invoice')
                    ->form([

                        Select::make('plant_id')
                        // ->options(Plant::pluck('name', 'id')->toArray()) // Fetch plant names and IDs
                            ->options(function (callable $get) {
                                $userHas = Filament::auth()->user()->plant_id;

                                return ($userHas && strlen($userHas) > 0) ? Plant::where('id', $userHas)->pluck('name', 'id')->toArray() : Plant::orderBy('code')->pluck('name', 'id')->toArray();
                            })
                            ->searchable()
                            ->label('Search by Plant Name')
                            ->required()
                            ->default(function () {
                                return optional(InvoiceValidation::latest()->first())->plant_id;
                            })
                            ->afterStateUpdated(function ($state, callable $set, callable $get) {
                                $set('invoice_material', null);
                                $plantId = $get('plant_id');
                                if (! $plantId) {
                                    $set('invoice_material', null);

                                    return;
                                }
                                $plantCode = Plant::find($plantId)?->code ?? null;

                                $directory = "uploads/temp/{$plantCode}";
                                if ($plantId && ! Storage::disk('local')->exists($directory)) {
                                    Storage::disk('local')->makeDirectory($directory);
                                }
                            })
                            ->reactive(),

                        FileUpload::make('invoice_material')
                            ->label('Choose Material Invoice')
                            ->required()
                            ->acceptedFileTypes([
                                'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet',
                                // 'application/vnd.ms-excel', // Legacy .xls fallback if needed
                            ])
                            ->rules(['mimes:xlsx', 'max:50']) // Laravel validation: extension check
                            ->maxSize(50)
                            ->preserveFilenames() // <- this keeps the original filename
                            ->reactive()
                            ->storeFiles(false) // prevent auto-storing, we will store manually
                            ->disk('local') // 'local' refers to the local storage disk defined in config/filesystems.php, typically pointing to storage/app.
                            ->visible(fn (Get $get) => ! empty($get('plant_id')))
                            ->directory(function (callable $get) {
                                $plant = Plant::find($get('plant_id'));
                                $plantCode = $plant?->code ?? null;

                                return "uploads/temp/{$plantCode}";
                            })
                            ->uploadingMessage('Uploading...')
                            ->helperText('Only .xlsx files are allowed (Excel files).'),
                    ])
                    ->action(function (array $data) {
                        $uploadedFile = $data['invoice_material'];

                        $plantId = $data['plant_id']; // Access the selected plant_id

                        $plant = Plant::find($plantId);
                        $plantCode = $plant?->code ?? null;

                        $disk = Storage::disk('local');

                        // Get original filename
                        $originalName = $uploadedFile->getClientOriginalName();

                        $extension = strtolower(pathinfo($originalName, PATHINFO_EXTENSION));
                        if ($extension != 'xlsx') {
                            throw new \Exception('Only .xlsx files allowed.');
                        }

                        $originalNameOnly = strtoupper(pathinfo($originalName, PATHINFO_FILENAME));

                        $originalName = "{$originalNameOnly}.xlsx";

                        $path = $uploadedFile->storeAs("uploads/temp/{$plantCode}", $originalName, 'local');

                        if (strlen($originalNameOnly) < 8 || ! ctype_alnum($originalNameOnly)) {
                            Notification::make()
                                ->title("Material invoice number : '$originalNameOnly' should contain minimum 8 digit alpha numeric values!")
                                ->danger()
                                ->send();

                            if ($disk->exists($path)) {
                                $disk->delete($path);
                            }

                            return;
                        }

                        $fullPath = Storage::disk('local')->path($path);

                        $totQuan = InvoiceValidation::where('invoice_number', $originalNameOnly)->count();
                        if ($totQuan > 0) {
                            $scanMQuan = InvoiceValidation::where('invoice_number', $originalNameOnly)->whereNotNull('serial_number')->where('serial_number', '!=', '')->count();
                            if ($totQuan == $scanMQuan) {
                                $invoiceFirst = InvoiceValidation::with('plant')->where('invoice_number', $originalNameOnly)->first();
                                $plantName = $invoiceFirst ? (string) $invoiceFirst->plant->name : null;

                                Notification::make()
                                    ->title("Material invoice number : '$originalNameOnly' already completed the scanning process for plant : '$plantName'.")
                                    ->danger()
                                    ->send();

                                if ($disk->exists($path)) {
                                    $disk->delete($path);
                                }

                                return;
                            } else {
                                $invoiceFirst = InvoiceValidation::with('plant')->where('invoice_number', $originalNameOnly)->first();
                                // $plantCode = $invoiceFirst ? (String)$invoiceFirst->plant->code : null;
                                $plantName = $invoiceFirst ? (string) $invoiceFirst->plant->name : null;
                                $invoicePlantId = $invoiceFirst->plant_id;
                                if ($plantId != $invoicePlantId) {
                                    Notification::make()
                                        ->title("Material invoice number : '$originalNameOnly' already exists for plant : '$plantName'.<br>Choose the valid 'Plant' to proceed!")
                                        ->danger()
                                        ->send();

                                    if ($disk->exists($path)) {
                                        $disk->delete($path);
                                    }

                                    return;
                                }
                            }
                        }

                        $totQuan = InvoiceValidation::where('invoice_number', $originalNameOnly)->where('plant_id', $plantId)->count();
                        $scanMQuan = InvoiceValidation::where('invoice_number', $originalNameOnly)->whereNotNull('serial_number')->where('serial_number', '!=', '')->where('plant_id', $plantId)->count();

                        if ($totQuan > 0 && $totQuan == $scanMQuan) {
                            Notification::make()
                                ->title('Material invoice already completed the scanning process for selected plant.')
                                ->danger()
                                ->send();
                            if ($disk->exists($path)) {
                                $disk->delete($path);
                            }

                            return;
                        }

                        if ($fullPath && file_exists($fullPath)) {
                            $rows = Excel::toArray(null, $fullPath)[0];

                            if ((count($rows) - 1) <= 0) {
                                Notification::make()
                                    ->title('Records Not Found')
                                    ->body("Import the valid 'Material Invoice' file to proceed..!")
                                    ->danger()
                                    ->send();

                                if ($disk->exists($path)) {
                                    $disk->delete($path);
                                }

                                return;
                            }

                            $invalidMatCodes = [];
                            $materialCodes = [];
                            $missingQuantities = [];
                            $invalidMatQuan = [];
                            $invalidMaterialQuan = [];
                            $validRowsFound = false;

                            foreach ($rows as $index => $row) {
                                if ($index == 0) {
                                    continue;
                                }  // Skip header

                                $materialCode = trim($row[0]);
                                $materialQuantity = trim($row[1]);

                                if (empty($materialCode) && empty($materialQuantity)) {
                                    continue;
                                }

                                if (! empty($materialCode)) {
                                    if (Str::length($materialCode) < 6 || ! ctype_alnum($materialCode)) {
                                        $invalidMatCodes[] = $materialCode;
                                    } else {
                                        if ($materialQuantity == 0) {
                                            $invalidMaterialQuan[] = $materialCode;
                                        } elseif (empty($materialQuantity)) {
                                            $missingQuantities[] = $materialCode;
                                        } elseif (! is_numeric($materialQuantity)) {
                                            $invalidMatQuan[] = $materialCode;
                                        } else {
                                            $materialCodes[] = $materialCode;
                                            $validRowsFound = true;
                                        }
                                    }
                                } else {
                                    continue;
                                }
                            }

                            $uniqueInvalidCodes = array_unique($invalidMatCodes);
                            $uniqueaplhaMat = array_unique($invalidMatQuan);
                            $uniqueZeroMat = array_unique($invalidMaterialQuan);
                            $uniqueEmptyMat = array_unique($missingQuantities);

                            if (! empty($uniqueInvalidCodes)) {
                                Notification::make()
                                    ->title('Invalid Item Codes')
                                    ->body('The following item codes should contain minimum 6 digit alpha numeric values:<br>'.implode(', ', $uniqueInvalidCodes))
                                    ->danger()
                                    ->send();

                                if ($disk->exists($path)) {
                                    $disk->delete($path);
                                }

                                return;
                            } elseif (! empty($uniqueaplhaMat)) {
                                Notification::make()
                                    ->title('Invalid Material Quantity')
                                    ->body('The following item codes material quantity must be a numeric values :<br>'.implode(', ', $uniqueaplhaMat))
                                    ->danger()
                                    ->send();

                                if ($disk->exists($path)) {
                                    $disk->delete($path);
                                }

                                return;
                            } elseif (! empty($uniqueZeroMat)) {
                                Notification::make()
                                    ->title('Invalid Material Quantity')
                                    ->body('The following item codes material quantity should be greater than 0:<br>'.implode(', ', $uniqueZeroMat))
                                    ->danger()
                                    ->send();

                                if ($disk->exists($path)) {
                                    $disk->delete($path);
                                }

                                return;
                            } elseif (! empty($uniqueEmptyMat)) {
                                Notification::make()
                                    ->title('Missing Material Quantity')
                                    ->body("The following item codes doesn't have valid material quantity:<br>".implode(', ', $uniqueEmptyMat))
                                    ->danger()
                                    ->send();

                                if ($disk->exists($path)) {
                                    $disk->delete($path);
                                }

                                return;
                            } elseif (! $validRowsFound) {
                                Notification::make()
                                    ->title('Invalid Material Invoice')
                                    ->danger()  // This makes the notification red to indicate an error
                                    ->body('Uploaded Excel sheet is empty or<br>contains no valid data.')
                                    ->send();

                                if ($disk->exists($path)) {
                                    $disk->delete($path);
                                }

                                return;
                            }

                            $uniqueCodes = array_unique($materialCodes);

                            $matchedItems = StickerMaster::with('item')->where('plant_id', $plantId)
                                ->whereHas('item', function ($query) use ($uniqueCodes, $plantId) {
                                    $query->whereIn('code', $uniqueCodes)->where('plant_id', $plantId);
                                })
                                ->get();

                            $matchedCodes = $matchedItems->pluck('item.code')->toArray();

                            $missingCodes = array_diff($uniqueCodes, $matchedCodes);

                            if (! empty($missingCodes)) {
                                $missingCount = count($missingCodes);

                                $message = $missingCount > 10 ? "'$missingCount' item codes are not found in sticker master." : 'The following item codes are not found in sticker master:<br>'.implode(', ', $missingCodes);

                                Notification::make()
                                    ->title('Unknown Item Codes')
                                    ->body($message)
                                    ->danger()
                                    ->send();

                                if ($disk->exists($path)) {
                                    $disk->delete($path);
                                }

                                return;
                            }

                            $invalidCodes = $matchedItems
                                ->filter(fn ($sticker) => empty($sticker->material_type))  // filter invalid
                                ->pluck('item.code')
                                ->toArray();

                            if (count($invalidCodes) > 10) {
                                $invalidCodes = array_unique($invalidCodes);
                                Notification::make()
                                    ->title('Invalid item codes found')
                                    ->body(''.count($invalidCodes).' item codes have serial type.')
                                    ->danger()
                                    ->send();

                                if ($disk->exists($path)) {
                                    $disk->delete($path);
                                }

                                return;
                            } elseif (count($invalidCodes) > 0) {
                                $invalidCodes = array_unique($invalidCodes);
                                Notification::make()
                                    ->title('Invalid item codes found')
                                    ->body('Serial invoice Item Codes found : '.implode(', ', $invalidCodes))
                                    ->danger()
                                    ->send();

                                if ($disk->exists($path)) {
                                    $disk->delete($path);
                                }

                                return;
                            }

                            $nonNumericQtyCodes = [];
                            $zeroQtyCodes = [];
                            $notDivisibleCodes = [];

                            foreach ($matchedItems as $sticker) {
                                $code = $sticker->item->code;
                                $materialType = $sticker->material_type;

                                if ($materialType == 2) {
                                    $bundleQty = $sticker->bundle_quantity ?? 0;
                                    $totalExcelQty = 0;

                                    foreach ($rows as $index => $row) {
                                        if ($index == 0) {
                                            continue;
                                        } // Skip header

                                        $excelCode = trim($row[0]);
                                        $excelMatQty = trim($row[1]);

                                        if ($excelCode == $code && is_numeric($excelMatQty)) {
                                            $totalExcelQty += $excelMatQty; // Sum up the quantities
                                        }
                                    }

                                    if ($totalExcelQty == 0) {
                                        $zeroQtyCodes[] = $code;
                                    } elseif (! is_numeric($totalExcelQty)) {
                                        $nonNumericQtyCodes[] = $code;  // Here you may want to check divisibility condition too
                                    } elseif ($bundleQty != 0 && $totalExcelQty % $bundleQty != 0) {
                                        $notDivisibleCodes[] = $code;
                                    }
                                }
                            }

                            $showValidationNotification = function (array $codes, string $message) {
                                if (count($codes) == 0) {
                                    return;
                                }

                                $uniqueCodes = array_unique($codes);
                                $codeList = implode(', ', $uniqueCodes);

                                Notification::make()
                                    ->title('Invalid Bundle Quantity')
                                    ->body("$message <br>$codeList")
                                    ->danger()
                                    ->send();
                            };

                            $nonNumericQtyCodes = array_unique($nonNumericQtyCodes);
                            $zeroQtyCodes = array_unique($zeroQtyCodes);
                            $notDivisibleCodes = array_unique($notDivisibleCodes);

                            $showValidationNotification($nonNumericQtyCodes, 'The following item codes contains invalid bundle quantity:');
                            $showValidationNotification($zeroQtyCodes, "The following item codes quantity should be greater than '0':");
                            $showValidationNotification($notDivisibleCodes, 'The following item codes quantity is not divisible by bundle quantity.');

                            if ($nonNumericQtyCodes || $zeroQtyCodes || $notDivisibleCodes) {
                                if ($disk->exists($path)) {
                                    $disk->delete($path);
                                }

                                return;
                            } else {
                                // Save full file path to session
                                session(['uploaded_material_invoice' => $fullPath]);
                                Notification::make()
                                    ->title('Material invoice imported successfully.')
                                    ->success()
                                    ->send();
                            }

                        }
                    })
                    ->visible(function () {
                        return Filament::auth()->user()->can('view import material invoice');
                    }),
                ImportAction::make('invoice_import')
                    ->label('Import Invoices')
                    ->color('warning')
                    ->importer(InvoiceValidationImporter::class)
                    ->visible(function () {
                        return Filament::auth()->user()->can('view import invoice');
                    }),
                ImportAction::make('sap_invoice_import')
                    ->label('Import SAP Invoices')
                    ->color('warning')
                    ->importer(SapInvoiceValidationImporter::class)
                    ->visible(function () {
                        return Filament::auth()->user()->can('view import sap invoice');
                    }),
                ExportAction::make('serial_invoice_export')
                    ->label('Export Serial Invoices')
                    ->color('warning')
                    ->exporter(InvoiceValidationExporter::class)
                    ->visible(function () {
                        return Filament::auth()->user()->can('view export serial invoice');
                    }),
                ExportAction::make('material_invoice_export')
                    ->label('Export Material Invoices')
                    ->color('warning')
                    ->exporter(MaterialInvoiceValidationExporter::class)
                    ->visible(function () {
                        return Filament::auth()->user()->can('view export material invoice');
                    }),
                ExportAction::make('axn_export')
                    ->label('Export Asn')
                    ->color('warning')
                    ->exporter(AxnExporter::class)
                    ->visible(function () {
                        return Filament::auth()->user()->can('view export asn invoice');
                    }),
            ])

            ->filters([
                Tables\Filters\TrashedFilter::make(),
                Filter::make('advanced_filters')
                    ->label('Advanced Filters')
                    ->form([
                        Radio::make('invoice_type')
                            ->label('Type ?')
                            ->boolean()
                            // ->options([
                            //     'Serial' => 'Serial',
                            //     'Material' => 'Material',
                            // ])
                            ->options(function () {
                                $userRights = Filament::auth()->user();
                                $hasBoth = ($userRights->hasRole(['Super Admin', 'Sales Employee', 'Sales Supervisor Hub', 'Sales Supervisor Hub Upload', 'Sales Manager']) ?? null);

                                $hasSerial = ($userRights->hasRole(['Sales Employee 1', 'Sales Supervisor 1', 'Sales Supervisor Upload 1']) ?? null); // , 'Sales Supervisor Inventory', 'Sales Supervisor Inventory Upload', 'Sales Employee Inventory'

                                $hasMaterial = ($userRights->hasRole(['Sales Employee 2', 'Sales Supervisor 2', 'Sales Supervisor Upload 2']) ?? null);

                                $retRes = [
                                    'Serial' => 'Serial',
                                    'Material' => 'Material',
                                ];

                                if ($hasBoth) {
                                    return $retRes;
                                } elseif ($hasSerial) {
                                    return ['Serial' => 'Serial'];
                                } elseif ($hasMaterial) {
                                    return ['Material' => 'Material'];
                                } else {
                                    return ['Serial' => 'Serial']; // return [];
                                }
                            })
                            // ->default('Serial')
                            ->default(function () {
                                $userRights = Filament::auth()->user();
                                $hasBoth = ($userRights->hasRole(['Super Admin', 'Sales Employee', 'Sales Supervisor Hub', 'Sales Supervisor Hub Upload', 'Sales Manager']) ?? null);

                                $hasSerial = ($userRights->hasRole(['Sales Employee 1', 'Sales Supervisor 1', 'Sales Supervisor Upload 1']) ?? null); // , 'Sales Supervisor Inventory', 'Sales Supervisor Inventory Upload', 'Sales Employee Inventory'

                                $hasMaterial = ($userRights->hasRole(['Sales Employee 2', 'Sales Supervisor 2', 'Sales Supervisor Upload 2']) ?? null);

                                if ($hasBoth || $hasSerial) {
                                    return 'Serial';
                                } elseif ($hasMaterial) {
                                    return 'Material';
                                } else {
                                    return 'Serial'; // return [];
                                }
                            })
                            ->inlineLabel(false)
                            ->inline(),
                        Select::make('Plant')
                            ->label('Search by Plant Name')
                            ->nullable()
                            ->searchable()
                            ->reactive()
                            ->options(function (callable $get) {
                                $userHas = Filament::auth()->user()->plant_id;

                                if ($userHas && strlen($userHas) > 0) {
                                    return Plant::where('id', $userHas)->pluck('name', 'id')->toArray();
                                } else {
                                    return Plant::whereHas('invoiceValidations', function ($query) {
                                        $query->whereNotNull('id');
                                    })->orderBy('code')->pluck('name', 'id');
                                }

                                // return ($userHas && strlen($userHas) > 0) ? Plant::where('id', $userHas)->pluck('name', 'id')->toArray() : Plant::orderBy('code')->pluck('name', 'id')->toArray();
                            })
                            ->afterStateUpdated(function ($state, callable $set, callable $get): void {
                                $set('sticker_master_id', null);
                                $set('operator_id', null);
                            }),
                        TextInput::make('invoice_number')
                            ->label('Invoice Number')
                            ->placeholder(placeholder: 'Enter Invoice Number'),
                        TextInput::make('serial_number')
                            ->label('Serial Number')
                            ->placeholder(placeholder: 'Enter Serial Number'),
                        Select::make('sticker_master_id')
                            ->label('Search by Item Code')
                            ->nullable()
                            ->searchable()
                            ->reactive()
                            ->options(function (callable $get) {
                                $pId = $get('Plant');

                                // if (empty($pId)) {
                                //     return [];
                                // }
                                return Item::whereHas('stickerMasters', function ($query) use ($pId) {
                                    if ($pId) {
                                        $query->where('plant_id', $pId);
                                    }
                                    $query->whereHas('invoiceValidations');
                                })->pluck('code', 'id');
                            }),
                        Select::make('scanned_status')
                            ->label('Scanned Status')
                            ->nullable()
                            ->options([
                                'Scanned' => 'Scanned',
                                'Pending' => 'Pending',
                            ])
                            ->searchable()
                            ->reactive(),
                        Select::make('operator_id')
                            ->label('Created By')
                            ->nullable()
                            ->options(function (callable $get) {
                                $plantId = $get('Plant');
                                if (! $plantId) {
                                    return InvoiceValidation::whereNotNull('operator_id')->select('operator_id')->distinct()->pluck('operator_id', 'operator_id');
                                } else {
                                    return InvoiceValidation::where('plant_id', $plantId)->whereNotNull('operator_id')->select('operator_id')->distinct()->pluck('operator_id', 'operator_id');
                                }
                            })
                            ->searchable()
                            ->reactive(),
                        DateTimePicker::make(name: 'created_from')
                            ->label('Created From')
                            ->placeholder(placeholder: 'Select From DateTime')
                            ->reactive()
                            ->native(false),
                        DateTimePicker::make('created_to')
                            ->label('Created To')
                            ->placeholder(placeholder: 'Select To DateTime')
                            ->reactive()
                            ->native(false),
                    ])
                    ->query(function ($query, array $data) {
                        // Hide all records initially if no filters are applied
                        if (empty($data['invoice_type']) || (empty($data['Plant']) && empty($data['invoice_number']) && empty($data['serial_number']) && empty($data['created_from']) && empty($data['created_to']) && empty($data['operator_id']) && empty($data['scanned_status']) && empty($data['sticker_master_id']))) {
                            if (empty($data['invoice_type'])) {
                                Notification::make()
                                    ->title('Please, choose invoice type to filter.')
                                    ->danger()
                                    ->send();
                            }

                            return $query->whereRaw('1 = 0');
                        }

                        if ($data['invoice_type'] == 'Serial') {
                            $query->whereNull('quantity');

                            if (! empty($data['scanned_status'])) {
                                if ($data['scanned_status'] == 'Scanned') {
                                    $query->whereNotNull('scanned_status')->where('scanned_status', '!=', '');
                                } elseif ($data['scanned_status'] == 'Pending') {
                                    // $query->whereNull('scanned_status')->orWhere('scanned_status', '');
                                    $query->where(function ($query) {
                                        // if (empty($data['scanned_status']) || $data['scanned_status'] == 'Pending') {
                                        $query->whereNull('scanned_status')->orWhere('scanned_status', '!=', 'Scanned');
                                        // }
                                    });
                                }
                            }
                        } elseif ($data['invoice_type'] == 'Material') {
                            $query->whereNotNull('quantity'); // ->where('quantity', '>', 0)

                            if (! empty($data['scanned_status'])) {
                                if ($data['scanned_status'] == 'Scanned') {
                                    $query->whereNotNull('serial_number')->where('serial_number', '!=', '');
                                } elseif ($data['scanned_status'] == 'Pending') {
                                    $query->where(function ($query) {
                                        $query->whereNull('serial_number')->orWhere('serial_number', '=', '');
                                    });
                                }
                            }
                        }

                        if (! empty($data['Plant'])) { // $plant = $data['Plant'] ?? null
                            $query->where('plant_id', $data['Plant']);
                        } else {
                            $userHas = Filament::auth()->user()->plant_id;

                            if ($userHas && strlen($userHas) > 0) {
                                return $query->whereRaw('1 = 0');
                            }
                        }

                        if (! empty($data['invoice_number'])) {
                            $query->where('invoice_number', 'like', '%'.$data['invoice_number'].'%');
                        }

                        if (! empty($data['serial_number'])) {
                            $query->where('serial_number', 'like', '%'.$data['serial_number'].'%');
                        }

                        if (! empty($data['created_from'])) {
                            $query->where('created_at', '>=', $data['created_from']);
                        }

                        if (! empty($data['created_to'])) {
                            $query->where('created_at', '<=', $data['created_to']);
                        }

                        if (! empty($data['operator_id'])) {
                            $query->where('operator_id', $data['operator_id']);
                        }

                        if (! empty($data['sticker_master_id'])) {
                            $stickerMasterIds = StickerMaster::where('item_id', $data['sticker_master_id'])
                                ->pluck('id')
                                ->toArray();

                            if (! empty($stickerMasterIds)) {
                                $query->whereIn('sticker_master_id', $stickerMasterIds);
                            }
                        }
                    })
                    ->indicateUsing(function (array $data) {
                        $indicators = [];

                        if (! empty($data['Plant'])) {
                            $indicators[] = 'Plant Name: '.Plant::where('id', $data['Plant'])->value('name');
                        } else {
                            $userHas = Filament::auth()->user()->plant_id;

                            if ($userHas && strlen($userHas) > 0) {
                                return 'Plant: Choose plant to filter records.';
                            }
                        }

                        if (! empty($data['invoice_number'])) {
                            $indicators[] = 'Invoice Number: '.$data['invoice_number'];
                        }

                        if (! empty($data['serial_number'])) {
                            $indicators[] = 'Serial Number: '.$data['serial_number'];
                        }

                        if (! empty($data['sticker_master_id'])) {
                            $itemCode = Item::find($data['sticker_master_id'])->code ?? 'Unknown';
                            $indicators[] = 'Item Code: '.$itemCode;
                        }

                        if (! empty($data['operator_id'])) {
                            $indicators[] = 'Created By: '.$data['operator_id'];
                        }

                        if (! empty($data['created_from'])) {
                            $indicators[] = 'From: '.$data['created_from'];
                        }

                        if (! empty($data['created_to'])) {
                            $indicators[] = 'To: '.$data['created_to'];
                        }

                        if (! empty($data['scanned_status'])) {
                            $indicators[] = 'Scanned Status: '.$data['scanned_status'];
                        }

                        return $indicators;
                    }),
            ])
            ->filtersFormMaxHeight('280px')
            ->actions([
                Tables\Actions\ViewAction::make(),
                Tables\Actions\EditAction::make(),
            ])
            ->bulkActions([
                Tables\Actions\BulkActionGroup::make([
                    Tables\Actions\DeleteBulkAction::make(),
                    Tables\Actions\ForceDeleteBulkAction::make(),
                    Tables\Actions\RestoreBulkAction::make(),
                    FilamentExportBulkAction::make('export'),
                ]),
            ]);
    }

    public static function getRelations(): array
    {
        return [
            //
        ];
    }

    public static function getPages(): array
    {
        return [
            'index' => Pages\ListInvoiceValidations::route('/'),
            'create' => Pages\CreateInvoiceValidation::route('/create'),
            'view' => Pages\ViewInvoiceValidation::route('/{record}'),
            'edit' => Pages\EditInvoiceValidation::route('/{record}/edit'),
        ];
    }

    // public static function render(): View
    // {
    //     if (session()->has('invoice_number')) {
    //         $invoiceNumber = session('invoice_number');

    //         // Debug: show the invoice number
    //         dd($invoiceNumber); // This will stop execution and show the value

    //         // Trigger email
    //         \Mail::to('jothikumar.padmanaban@cripumps.com')
    //             ->send(new InvoiceNotification($invoiceNumber));

    //         // Clear session so it doesn't resend on next refresh
    //         //session()->forget('invoice_number');
    //     }
    //     // return view('filament.resources.invoice-validation-resource.pages.list-invoice-validation');
    // }

    public static function getEloquentQuery(): Builder
    {
        return parent::getEloquentQuery()
            ->withoutGlobalScopes([
                SoftDeletingScope::class,
            ]);
    }
}
