<?php

namespace App\Livewire;

use App\Models\StickerMaster;
use Filament\Facades\Filament;
use Filament\Notifications\Notification;
use Livewire\Component;
use App\Models\SerialValidation;


class SerialValidationData extends Component
{
    public $invoiceData = [];

    public $plantId = 0;

    public string $invoiceNumber = '';
    public string $serialNumber = '';

    public bool $completedInvoice = false;

    public bool $isSerial = false;

    public bool $emptyInvoice = false;

    public bool $hasSearched = false;

    public bool $materialInvoice = false;

    public bool $showCapacitorInput = false;

   // protected $listeners = ['refreshInvoiceData' => 'loadData',];

    protected $listeners = [
        'refreshCompletedInvoice' => 'loadCompletedData',
        'refreshEmptyInvoice' => 'loadEmptyData',
        'refreshInvoiceData' => 'loadData',
        'refreshMaterialInvoiceData' => 'loadMaterialData',
        'openCapacitorModal' => 'showCapacitorInputBox',
    ];

    public $capacitorInput = '';

    public $panel_box_supplier;

    public $panel_box_item_code;

    public $panel_box_serial_number;

    public string $currentItemCode = '';

    public string $currentSerialNumber = '';

    // public function loadCompletedData($invoiceNumber, $plantId, $isSerial)
    // {
    //     $this->plantId = $plantId;
    //     $this->invoiceNumber = $invoiceNumber;
    //     $this->completedInvoice = true;
    //     $this->isSerial = $isSerial;
    //     $this->emptyInvoice = false;
    //     $this->hasSearched = false;
    //     $this->materialInvoice = false;
    //     // $this->showCapacitorInput = false;
    // }

    public function loadCompletedData($invoiceNumber, $plantId, $isSerial)
    {

        $this->plantId = $plantId;
        $this->invoiceNumber = $invoiceNumber;
        $this->completedInvoice = true;
        $this->isSerial = $isSerial;
        $this->emptyInvoice = false;
        $this->hasSearched = false;
        $this->materialInvoice = false;
        // $this->showCapacitorInput = false;
    }

    public function loadEmptyData($invoiceNumber, $plantId)
    {
        $this->plantId = $plantId;
        $this->invoiceNumber = $invoiceNumber;
        $this->completedInvoice = false;
        $this->emptyInvoice = true;
        $this->hasSearched = false;
        $this->materialInvoice = false;
        // $this->showCapacitorInput = false;
    }

    public function loadData($invoiceNumber, $plantId)
    {
        $this->plantId = $plantId;
        $this->invoiceNumber = $invoiceNumber;
        $this->completedInvoice = false;
        $this->isSerial = true;
        $this->emptyInvoice = false;
        $this->hasSearched = true;
        $this->materialInvoice = false;
        // $this->showCapacitorInput = false;

        //->where('serial_number', '!=', '')
        $this->invoiceData = SerialValidation::where('invoice_number', $this->invoiceNumber)
        ->where('plant_id', $plantId)->where('scanned_status', null)
        ->get()
        ->map(function ($record) {
            return [
                'sticker_master_id' => $record->sticker_master_id,
                'serial_number' => $record->serial_number,
                'motor_scanned_status' => $record->motor_scanned_status ?? '',
                'pump_scanned_status' => $record->pump_scanned_status ?? '',
                'capacitor_scanned_status' => $record->capacitor_scanned_status ?? '',
                'scanned_status_set' => $record->scanned_status_set ?? '',
                'scanned_status' => $record->scanned_status ?? '',
                'panel_box_supplier' => $record->panel_box_supplier ?? '',
                'panel_box_serial_number' => $record->panel_box_serial_number ?? '',
                'created_at' => $record->created_at,
                'operator_id' => $record->operator_id,
            ];
        })
        ->toArray();

        //Loop through and replace 'code' using related StickerMaster > Item > code
        foreach ($this->invoiceData as &$row) {
           // $stickerMaster = \App\Models\StickerMaster::with('item')->find($row['sticker_master_id'] ?? null);
           $row['code'] = StickerMaster::with('item')->find($row['sticker_master_id'] ?? null)?->item?->code ?? 'N/A';
        }
    }

    public function loadMaterialData($invoiceNumber, $plantId)
    {
        $this->plantId = $plantId;
        $this->invoiceNumber = $invoiceNumber;
        $this->completedInvoice = false;
        $this->isSerial = false;
        $this->emptyInvoice = false;
        $this->hasSearched = false;
        $this->materialInvoice = true;
        // $this->showCapacitorInput = false;

        //->where('serial_number', '!=', '')
        $this->invoiceData = SerialValidation::where('invoice_number', $this->invoiceNumber)->where('plant_id', $plantId)->where('serial_number', null)
        ->get()
        ->map(function ($record) {
            return [
                'sticker_master_id' => $record->sticker_master_id,
                // 'material_type' => StickerMaster::where('id', $record->sticker_master_id)->first()->material_type ?? '',
                'quantity' => $record->quantity ?? '',
                'serial_number' => $record->serial_number ?? '',
                'batch_number' => $record->batch_number ?? '',
                'created_at' => $record->created_at,
                'operator_id' => $record->operator_id,
            ];
        })
        ->toArray();

        //Loop through and replace 'code' using related StickerMaster > Item > code
        foreach ($this->invoiceData as &$row) {
           // $stickerMaster = \App\Models\StickerMaster::with('item')->find($row['sticker_master_id'] ?? null);
           $row['code'] = StickerMaster::with('item')->find($row['sticker_master_id'] ?? null)?->item?->code ?? 'N/A';
           $matType = StickerMaster::where('id', $row['sticker_master_id'] ?? null)->first()->material_type ?? '';
           if($matType === 1)
           {
                $row['material_type'] = 'Individual';
           }
           else if($matType === 2)
           {
                $row['material_type'] = 'Bundle';
           }
           else if($matType === 3)
           {
                $row['material_type'] = 'Quantity';
           }
           else
           {
                $row['material_type'] = 'N/A';
           }
        }
    }

    // public function showCapacitorInputBox()
    // {
    //     $this->showCapacitorInput = true;
    // }

    public function showCapacitorInputBox($itemCode, $serialNumber, $plantId)
    {
        $this->plantId = $plantId;
        $this->currentItemCode = $itemCode;
        $this->currentSerialNumber = $serialNumber;
        $this->showCapacitorInput = true;
        // $this->capacitorInput = '';
        $this->completedInvoice = false;
        $this->isSerial = true;
        $this->emptyInvoice = false;
        $this->hasSearched = false;
        $this->materialInvoice = false;
        $this->dispatch('focus-capacitor-input');
    }

    public function cancelCapacitorInput()
    {
        $this->showCapacitorInput = false;
    }

    public function processCapacitorInput()
    {
        $user = Filament::auth()->user();
        $operatorName = $user->name;

        if (!$this->capacitorInput) {
            return;
        }

        if (!preg_match('/^[^\/]+\/[^\/]+\/.+$/', $this->capacitorInput)) {
            Notification::make()
                ->title('Invalid Panel Box QR Format:')
                ->body('Scan the valid panel box QR code to proceed!')
                ->danger()
                // ->duration(3000)
                ->seconds(2)
                ->send();
            return;
        }

        $parts = explode('/', $this->capacitorInput);
        $supplier = $parts[0];
        $itemCode = $parts[1];
        $serialNumber = implode('/', array_slice($parts, 2)); // Keep rest of the string

        $existsInStickerMaster = StickerMaster::where('panel_box_code', $itemCode)->where('plant_id', $this->plantId)->whereHas('item', function ($query) {
            $query->where('code', $this->currentItemCode);
        })
        ->exists();

        if (!$existsInStickerMaster) {
            Notification::make()
                ->title('Unknown: Panel Box Code')
                ->body("Unknown panel box code: $itemCode found for item code: $this->currentItemCode")
                ->danger()
                // ->duration(4000)
                ->seconds(2)
                ->send();
            $this->capacitorInput = '';
            return;
        }

        foreach ($this->invoiceData as &$row) {
            if (
                ($row['code'] ?? '') === $this->currentItemCode &&
                ($row['serial_number'] ?? '') === $this->currentSerialNumber
            ) {
                $row['panel_box_supplier'] = $supplier;
                $row['panel_box_item_code'] = $itemCode;
                $row['panel_box_serial_number'] = $serialNumber;
                $row['capacitor_scanned_status'] = 1;
                // $row['scanned_status_set'] = true;

                $matchingValidation = SerialValidation::with('stickerMaster.item')
                    ->where('serial_number', $this->currentSerialNumber)
                    ->where('plant_id', $this->plantId)
                    ->get()
                    ->first(function ($validation) {
                        return $validation->stickerMaster?->item?->code === $this->currentItemCode;
                    });

                if ($matchingValidation) {
                    $hasMotorQr = $matchingValidation->stickerMasterRelation->tube_sticker_motor ?? null;
                    $hasPumpQr = $matchingValidation->stickerMasterRelation->tube_sticker_pump ?? null;
                    $hasPumpSetQr = $matchingValidation->stickerMasterRelation->tube_sticker_pumpset ?? null;
                    // $hasCapacitorQr = $matchingValidation->stickerMasterRelation->panel_box_code ?? null;

                    $hadMotorQr = $matchingValidation->motor_scanned_status ?? null;
                    $hadPumpQr = $matchingValidation->pump_scanned_status ?? null;
                    $hadPumpSetQr = $matchingValidation->scanned_status_set ?? null;
                    // $hadCapacitorQr = $matchingValidation->capacitor_scanned_status ?? null;

                    $packCnt = 1;
                    $scanCnt = 1;
                    // if($hadMotorQr === $hasMotorQr && $hadPumpQr === $hasPumpQr && $hadPumpSetQr === $hasPumpSetQr)
                    if($hasMotorQr || $hasPumpQr || $hasPumpSetQr)
                    {
                        $packCnt = $hasMotorQr ? $packCnt + 1 : $packCnt;
                        $packCnt = $hasPumpQr ? $packCnt + 1 : $packCnt;
                        $packCnt = $hasPumpSetQr ? $packCnt + 1 : $packCnt;

                        $scanCnt = $hadMotorQr ? $scanCnt + 1: $scanCnt;
                        $scanCnt = $hadPumpQr ? $scanCnt + 1: $scanCnt;
                        $scanCnt = $hadPumpSetQr ? $scanCnt + 1: $scanCnt;

                        if($packCnt === $scanCnt)
                        {
                            $matchingValidation->update([
                                'panel_box_supplier' => $supplier,
                                'panel_box_item_code' => $itemCode,
                                'panel_box_serial_number' => $serialNumber,
                                'capacitor_scanned_status' => 1,
                                'scanned_status' => 'Scanned',
                                'operator_id'=> $operatorName,
                            ]);
                        }
                        else
                        {
                            $matchingValidation->update([
                                'panel_box_supplier' => $supplier,
                                'panel_box_item_code' => $itemCode,
                                'panel_box_serial_number' => $serialNumber,
                                'capacitor_scanned_status' => 1,
                                'operator_id'=> $operatorName,
                            ]);
                        }
                    }
                    else
                    {
                        $matchingValidation->update([
                            'panel_box_supplier' => $supplier,
                            'panel_box_item_code' => $itemCode,
                            'panel_box_serial_number' => $serialNumber,
                            'capacitor_scanned_status' => 1,
                            'scanned_status' => 'Scanned',
                            'operator_id'=> $operatorName,
                        ]);
                    }

                    // Notification::make()
                    //     ->title('Success: Capacitor QR')
                    //     // ->title("Panel box code scanned: $itemCode")
                    //     ->body("'Capacitor' QR scanned status updated, Scan next QR.")
                    //     ->success() // commented
                    //     ->seconds(2)
                    //     ->send();

                    $totalQuantity = SerialValidation::where('invoice_number', $matchingValidation->invoice_number)->where('plant_id', $this->plantId)->count();
                    $scannedQuantity = SerialValidation::where('invoice_number', $matchingValidation->invoice_number)->where('plant_id', $this->plantId)->where('scanned_status', 'Scanned')->count();
                    // $this->form->fill([
                        //     'plant_id' => $matchingValidation->plant_id,
                        //     'invoice_number' => $matchingValidation->invoice_number,
                        //     'serial_number' => null,
                        //     'total_quantity' => $totalQuantity,
                        //     'scanned_quantity'=> $scannedQuantity,
                        // ]);

                    if($totalQuantity === $scannedQuantity)
                    {
                        Notification::make()
                            ->title('Completed: Serial Invoice')
                            ->body("Serial invoice '$matchingValidation->invoice_number' completed the scanning process.<br>Scan the next 'Serial Invoice' to proceed!")
                            ->success()
                            ->seconds(2)
                            ->send();
                        $this->loadCompletedData($matchingValidation->invoice_number, $matchingValidation->plant_id, true);
                    }
                    else
                    {
                        $this->loadData($matchingValidation->invoice_number, $matchingValidation->plant_id);
                    }
                }
                break;
            }
        }
        $this->showCapacitorInput = false;
        $this->capacitorInput = '';
        $this->dispatch('focus-serial-number');
    }

    public function render()
    {
        return view('livewire.serial-validation-data');
    }

}
