<?php

namespace App\Livewire;

use App\Models\DuplicateStock;
use App\Models\Item;
use App\Models\NotInStock;
use App\Models\StickerMaster;
use App\Models\StockDataMaster;
use Filament\Notifications\Notification;
use Livewire\Component;
use Livewire\WithPagination;

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

        use WithPagination;

    protected $paginationTheme = 'tailwind';

    // public $invoiceRecords;

    public $plantId = 0;

    public $package = [];

    public $scannedIds = [];

    public $scannedRecords = [];

    public $scannedSerials = [];

    public $packageCount = 0;

    public string $location = '';

    public bool $completedInvoice = false;

    public bool $isSerial = false;

    public $isnonQuanSfg = false;

    public bool $onCapFocus = false;

    public bool $emptyInvoice = false;

    public bool $hasSearched = false;

    public bool $materialInvoice = false;

    public bool $showCapacitorInput = false;

    public bool $isSfg = false;

    public $itemCode, $serialNumber, $serial_number;

    public $scannedSfgData = [];

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

    protected $listeners = [
        'refreshEmptyInvoice' => 'loadEmptyData',
        'refreshInvoiceData' => 'loadData',
        'refreshSfgData' => 'loadSfgData',
        'refreshSfgNonData' => 'loadSfgNonQuanData',
        'confirmStockUpdate',
        'confirmSerialUpdate',
        'confirmSerialFGUpdate',
        'confirmDuplicateUpdate'
    ];

    public $capacitorInput = '';

    public $panel_box_supplier;

    public $panel_box_code;

    public $panel_box_serial_number;

    public string $currentItemCode = '';

    public string $currentSerialNumber = '';

    public $stickerMasterId;

    public $sNo;

    public function confirmStockUpdate($plantId, $location, $bin, $stickerMasterId, $batch, $docNo, $quantity)
    {

        $record = NotInStock::where('plant_id', $plantId)
            ->where('location', $location)
            ->where('sticker_master_id', $stickerMasterId)
            ->where('doc_no', $docNo)
            ->where('bin', $bin)
            ->first();

        if (!$record) {

            NotInStock::create([
                'plant_id' => $plantId,
                'location' => $location,
                'bin' => $bin,
                'sticker_master_id' => $stickerMasterId,
                'type' => '1',
                'serial_number' => $this->serialNumber ?? null,
                'batch' => $batch ?? null,
                'doc_no' => $docNo ?? null,
                'scanned_quantity' => $quantity ?? '0',
            ]);

            Notification::make()
                ->title('Record inserted successfully in not in stock table.')
                ->success()
                ->send();

        } else {

            $record->update([
                'scanned_quantity' => $record->scanned_quantity + $quantity,
                'batch' => $batch ?? null,
                'doc_no' => $docNo ?? null,
            ]);

            Notification::make()
                ->title('Record updated in not in stock table.')
                ->success()
                ->send();
        }
    }

    public function confirmSerialUpdate($plantId, $location, $bin, $serial_number, $stickerMasterId, $batch, $docNo, $quantity)
    {
        $sNo = $serial_number;
        $record = NotInStock::where('plant_id', $plantId)
            ->where('location', $location)
            ->where('sticker_master_id', $stickerMasterId)
            ->where('serial_number', $sNo)
            ->where('bin', $bin)
            ->first();

        if (!$record) {

            NotInStock::create([
                'plant_id' => $plantId,
                'location' => $location,
                'bin' => $bin,
                'sticker_master_id' => $stickerMasterId,
                'type' => '1',
                'serial_number' => $sNo ?? null,
                'batch' => $batch ?? null,
                'doc_no' => $docNo ?? null,
                'scanned_quantity' => $quantity ?? '1',
            ]);

            Notification::make()
                ->title('Record inserted successfully in not in stock table.')
                ->success()
                ->send();

        } else {

            $record->update([
                'batch' => $batch ?? null,
            ]);

            Notification::make()
                ->title('Record updated in not in stock table.')
                ->success()
                ->send();
        }
    }

    public function confirmDuplicateUpdate($plantId, $location, $bin, $serial_number, $stickerMasterId, $batch, $docNo, $quantity)
    {
        $sNo = $serial_number;
        $stockRecord = StockDataMaster::where('serial_number', $sNo)
            ->where('plant_id', $plantId)
            ->first();

        if (!$stockRecord) {
            return;
        }

        $record = DuplicateStock::where('stock_data_master_id', $stockRecord->id)->first();

        if (!$record) {

            DuplicateStock::create([
                'stock_data_master_id' => $stockRecord->id,
            ]);

            Notification::make()
                ->title('Record inserted successfully in duplicate stock table.')
                ->success()
                ->send();

        } else {

            DuplicateStock::create([
                'stock_data_master_id' => $stockRecord->id,
            ]);

            Notification::make()
                ->title('Record inserted successfully in duplicate stock table.')
                ->success()
                ->send();
        }
    }

    public function confirmSerialFGUpdate($plantId, $location, $bin, $serial_number, $stickerMasterId)
    {
        $sNo = $serial_number;
        $record = NotInStock::where('plant_id', $plantId)
            ->where('location', $location)
            ->where('sticker_master_id', $stickerMasterId)
            ->where('serial_number', $sNo)
            ->where('bin', $bin)
            ->first();

        if (!$record) {

            NotInStock::create([
                'plant_id' => $plantId,
                'location' => $location,
                'bin' => $bin,
                'sticker_master_id' => $stickerMasterId,
                'type' => '0',
                'serial_number' => $sNo ?? null,
                'batch' => $batch ?? null,
                'doc_no' => $docNo ?? null,
                'scanned_quantity' => $quantity ?? '1',
            ]);

            Notification::make()
                ->title('Record inserted successfully in not in stock table.')
                ->success()
                ->send();

        } else {

            $record->update([
                'batch' => $batch ?? null,
                'doc_no' => $docNo ?? null,
            ]);

            Notification::make()
                ->title('Record updated in not in stock table.')
                ->success()
                ->send();
        }
    }

    public function loadCompletedData($location, $plantId, $isSerial)
    {
        $this->plantId = $plantId;
        $this->location = $location;
        $this->completedInvoice = true;
        $this->isSerial = $isSerial;
        $this->onCapFocus = false;
        $this->emptyInvoice = false;
        $this->hasSearched = false;
        $this->materialInvoice = false;
        $this->packageCount = 0;
        // $this->showCapacitorInput = false;
        $this->dispatch('focus-invoice-number');
    }

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

    public function loadSfgData($location, $plantId, $itemCode,$docNo)
    {
        $this->isSfg = true;
        $this->hasSearched = false;
        // $this->materialInvoice = false;
        // $this->completedInvoice = false;
        // $this->emptyInvoice = false;

        $item = Item::where('plant_id', $plantId)
                ->where('code', $itemCode)
                ->first();

        $itemId = $item->id;

        $stickerMaster = StickerMaster::where('plant_id', $plantId)
            ->where('item_id', $itemId)
            ->first();

        $stickerMasterId = $stickerMaster->id;

        $record = StockDataMaster::with('stickerMaster.item')
            ->where('plant_id', $plantId)
            ->where('location', $location)
            ->where('sticker_master_id', $stickerMasterId)
            ->where('doc_no', $docNo)
            ->where('type', '1')
            ->first();

        if ($record) {

            $itemCode = optional($record->stickerMaster->item)->code;

            $foundIndex = null;

            foreach ($this->scannedSfgData as $index => $row) {

                if (
                    $row['location'] == $record->location &&
                    $row['doc_no'] == $record->doc_no &&
                    $row['item_code'] == $itemCode
                ) {
                    $foundIndex = $index;
                    break;
                }
            }

            if ($foundIndex !== null) {

                $this->scannedSfgData[$foundIndex]['scanned_quantity'] = $record->scanned_quantity;

            } else {

                if (count($this->scannedSfgData) >= 100) {
                    return;
                }

                $this->scannedSfgData[] = [
                    'serial_number'     => $record->serial_number,
                    'bin'               => $record->bin,
                    'item_code'         => $itemCode,
                    'batch'             => $record->batch,
                    'doc_no'            => $record->doc_no,
                    'quantity'          => $record->quantity,
                    'scanned_quantity'  => $record->scanned_quantity,
                    'location'          => $record->location,
                    'updated_by'        => $record->updated_by,
                ];
            }
        }
    }

    public function loadSfgNonQuanData($location, $plantId, $serialNumber, $itemCode){

        $this->isnonQuanSfg = true;

        $record = StockDataMaster::with('stickerMaster.item')
            ->where('plant_id', $plantId)
            ->where('location', $location)
            ->where('serial_number', $serialNumber)
            ->whereHas('stickerMaster.item', function ($q) use ($itemCode) {
                $q->where('code', $itemCode);
            })
            ->where('type', '1')
            ->orderBy('updated_at', 'desc')
            ->first();

        if ($record) {

            // foreach ($this->scannedSerials as $row) {
            //     if ($row['serial_number'] == $serialNumber) {
            //         continue;
            //     }
            // }

            // $this->scannedSerials[] = [
            array_unshift($this->scannedSerials, [
                'location' => $record->location,
                'bin' => $record->bin ?? '',
                'item_code' => $record->stickerMaster->item->code ?? '',
                'serial_number' => $serialNumber,
                'batch' => $record->batch ?? '',
                'doc_no' => $record->doc_no ?? '',
                'quantity' => $record->quantity ?? '',
                'scanned_quantity' => $record->scanned_quantity ?? '',
                'updated_by' => $record->updated_by ?? '',
            ]);
            // ];
        }

    }

    public function loadData($location, $plantId, $itemCode, $serialNumber)
    {
        $this->location = $location;
        $this->plantId = $plantId;
        $this->itemCode = $itemCode;
        $this->serialNumber = $serialNumber;


        $this->completedInvoice = false;
        $this->isSerial = true;
        $this->emptyInvoice = false;
        $this->hasSearched = true;
        $this->materialInvoice = false;

        $this->resetPage();
        $this->packageCount = 0;

        $item = Item::where('plant_id', $plantId)
                ->where('code', $this->itemCode)
                ->first();

        $itemId = $item->id;

        $stickerMaster = StickerMaster::where('plant_id', $plantId)
            ->where('item_id', $itemId)
            ->first();

        $stickerMasterId = $stickerMaster->id;

        $records = StockDataMaster::with('stickerMasterRelation')
            ->where('location', $this->location)
            ->where('type', '=', '0')
            ->where('plant_id', $this->plantId)
            ->where('sticker_master_id', $stickerMasterId)
            ->where('serial_number', $this->serialNumber)
            ->orderBy('updated_at', 'desc')
            ->limit(100)
            ->get();

        foreach ($records as $record) {

            if ($record->scanned_status == 'Scanned') {

                if (!in_array($record->id, $this->scannedIds)) {
                    $this->scannedIds[] = $record->id;
                }

            }
        }

        $this->scannedIds = array_slice(array_unique($this->scannedIds), 0, 100);


        $this->packageCount = $records->sum(function ($record) {

            $sm = $record->stickerMasterRelation;

            if (! $sm) {
                return 0;
            }

            $stickCount = 0;
            $scannedCount = 0;


            if ($sm->tube_sticker_motor == 1 || $sm->tube_sticker_pump == 1 || $sm->tube_sticker_pumpset == 1) {

                if ($sm->tube_sticker_motor == 1) {
                    $stickCount++;
                    if ($record->motor_scanned_status == 1) {
                        $scannedCount++;
                    }
                }

                if (
                    $sm->tube_sticker_pump == 1 ||
                    ($sm->tube_sticker_pumpset != 1 &&
                    $sm->tube_sticker_pump != 1 &&
                    $sm->pack_slip_pump == 1)
                ) {
                    $stickCount++;
                    if ($record->pump_scanned_status == 1) {
                        $scannedCount++;
                    }
                }

                if ($sm->tube_sticker_pumpset == 1) {
                    $stickCount++;
                    if ($record->scanned_status_set == 1) {
                        $scannedCount++;
                    }
                }
            } elseif ($sm->pack_slip_motor == 1 || $sm->pack_slip_pump == 1 || $sm->pack_slip_pumpset == 1) {
                if ($sm->pack_slip_motor == 1) {
                    $stickCount++;
                    if ($record->motor_scanned_status == 1) {
                        $scannedCount++;
                    }
                }

                if ($sm->pack_slip_pump == 1) {
                    $stickCount++;
                    if ($record->pump_scanned_status == 1) {
                        $scannedCount++;
                    }
                }

                if ($sm->pack_slip_pumpset == 1) {
                    $stickCount++;
                    if ($record->scanned_status_set == 1) {
                        $scannedCount++;
                    }
                }
            }

            return max($stickCount - $scannedCount, 0);
        });

        // $this->dispatch(
        //     $onCapFocus ? 'focus-capacitor-input' : 'focus-serial-number'
        // );
    }

    // public function getInvoiceRecordsProperty()
    // {
    //     return StockDataMaster::with('stickerMasterRelation.item')
    //         ->where('plant_id', $this->plantId)
    //         ->where('location', $this->location)
    //         ->where('type', '=', '0')
    //         ->where('scanned_status', 'Scanned')
    //         // ->where(function ($query) {
    //         //     $query->whereNull('scanned_status')
    //         //         ->orWhere('scanned_status', 'Scanned');
    //         // })
    //         // ->when($this->hasSearched, function ($query) {
    //         //     $query->where('invoice_number', $this->invoiceNumber)
    //         //         ->where('plant_id', $this->plantId)
    //         //         ->where('scanned_status', '=', '');
    //         // })
    //         ->orderBy('updated_at', 'desc')
    //         ->paginate(6);
    // }


    public function getInvoiceRecordsProperty()
    {
        if (empty($this->scannedIds)) {
            return collect();
        }

        return StockDataMaster::with('stickerMasterRelation.item')
            ->whereIn('id', $this->scannedIds)
            ->orderBy('updated_at', 'desc')
            ->paginate(6);
    }
    public function render()
    {
        // return view('livewire.stock-data-table');
        return view('livewire.stock-data-table', [
            'records' => $this->invoiceRecords,
            'scannedSfgData' => $this->scannedSfgData,
            'scannedSerials' => $this->scannedSerials
        ]);
    }
}
