<?php

namespace App\Filament\Resources\StickerValidationResource\Pages;

use App\Filament\Resources\StickerValidationResource;
use App\Models\Item;
use App\Models\ItemCharacteristic;
use App\Models\ProductionQuantity;
use App\Models\StickerMappingMaster;
use App\Models\StickerValidation;
use Filament\Actions;
use Filament\Facades\Filament;
use Filament\Notifications\Notification;
use Filament\Resources\Pages\CreateRecord;

class CreateStickerValidation extends CreateRecord
{
    protected static string $resource = StickerValidationResource::class;

    protected static string $view = 'filament.resources.sticker-validation-resource.create-sticker-validation';

    public $ref_number;

    public $plantId;

    public $workCenter;

    public $serNo;

    public function getFormActions(): array
    {
        return [
            $this->getCancelFormAction(),
        ];
    }

    protected function getRedirectUrl(): string
    {
        return $this->getResource()::getUrl('create');
    }


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

        $this->plantId = $plantId;

        $this->ref_number = $value;

        $this->dispatch('refreshEmptySticker', $plantId, $value);

        $this->dispatch('focus-serial-number');
    }

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

        $this->plantId = $plantId;

        $workCenter = $this->form->getState()['machine_id'];

        $this->workCenter = $workCenter;

        $this->ref_number = $this->form->getState()['production_order'];

        $this->serNo = $serNo;

        $user = Filament::auth()->user();

        $operatorName = $user->name;

        if (! preg_match('/^([a-zA-Z0-9]{6,})\|([1-9][a-zA-Z0-9]{8,})\|?$/', $this->serNo, $matches)) {
            Notification::make()
                ->danger()
                ->title('Invalid Serial QR Format')
                ->body('Scan valid Serial QR code proceed!<br>Sample formats are:<br>123456|1234567890123| OR 123456|1234567890123')
                ->seconds(3)
                ->send();

            $this->dispatch('playWarnSound');

            $this->form->fill([
                'plant_id' => $this->plantId,
                'machine_id' => $this->workCenter,
                'production_order' => $this->ref_number,
                'serial_number' => null,
            ]);

            $this->dispatch('focus-serial-number');

            return;
        }

        if (preg_match('/^([a-zA-Z0-9]{6,})\|([1-9][a-zA-Z0-9]{8,})\|?$/', $this->serNo, $matches)) {
            $itemCode = $matches[1];
            $serialNumber = $matches[2];

            $recFound = ProductionQuantity::where('plant_id', $this->plantId)
            ->where('production_order', $this->ref_number)
            ->where('serial_number', $serialNumber)
            ->first();

            if(!$recFound){
                Notification::make()
                ->danger()
                ->title('Unknown Serial Number')
                ->body("Scanned serial number '$serialNumber' not found for the given plant and production order")
                ->seconds(3)
                ->send();
                $this->form->fill([
                    'plant_id' => $this->plantId,
                    'machine_id' => $this->workCenter,
                    'production_order' => $this->ref_number,
                    'serial_number' => null,
                ]);
                return;
            }

            $duplicate = StickerValidation::where('plant_id', $this->plantId)
                ->where('production_order', $this->ref_number)
                ->where('serial_number', $serialNumber)
                ->first();

            if ($duplicate) {
                Notification::make()
                    ->danger()
                    ->title('Duplicate Serial Number')
                    ->body("Serial number $serialNumber already exists for this plant and production order!")
                    ->seconds(3)
                    ->send();

                $this->form->fill([
                    'plant_id' => $this->plantId,
                    'machine_id' => $this->workCenter,
                    'production_order' => $this->ref_number,
                    'serial_number' => null,
                ]);
                return;
            }

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

            $itemId = $itemC->id;

            $item = ItemCharacteristic::where('item_id', $itemId)
            ->where('plant_id',$this->plantId)
            ->first();

            $itemI = $item->id;

            $mapping = StickerMappingMaster::where('plant_id', $this->plantId)
                ->where('item_characteristic_id', $itemI)
                ->first();

            if (!$mapping) {
                Notification::make()
                    ->danger()
                    ->title('Sticker Mapping Not Found')
                    ->body("No sticker mapping found for this item and plant.")
                    ->send();
                return;
            }

            $stickers = [];

            for ($i = 1; $i <= 8; $i++) {
                $machineColumn = "sticker{$i}_machine_id";
                $ipColumn      = "sticker{$i}_print_ip";
                $stickerColumn = "sticker_structure{$i}_id";
                $itemColumn = "item_characteristic_id";

                if (
                    !empty($mapping->$machineColumn) &&
                    !empty($mapping->$stickerColumn)
                ) {
                    $stickers[] = [
                        'machine_id' => $mapping->$machineColumn,
                        'sticker_id' => $mapping->$stickerColumn,
                        'item_characteristic'   => $mapping->$itemColumn,
                        'print_ip'   => $mapping->$ipColumn,
                    ];
                }
            }

            if (empty($stickers)) {
                Notification::make()
                    ->danger()
                    ->title('No Sticker Configuration Found')
                    ->body('No sticker and machine mappings configured for this item and plant.')
                    ->send();
                return;
            }

            $urls = [];

            foreach ($stickers as $sticker) {
                $urls[] = route('stickers1.pdf', [
                    'stickerId' => $sticker['sticker_id'],
                    'plant_id' => $this->plantId,
                    'item_characteristic_id' => $sticker['item_characteristic'],
                    'serial_number' => $serialNumber,
                ]);
            }

            $this->dispatch('open-stickers-sequence', urls: $urls);

            // $pdfPath = storage_path('app/private/uploads/StickerTemplateOcr/multi.pdf');

            // if (! file_exists($pdfPath)) {
            //     Notification::make()
            //         ->danger()
            //         ->title('Pdf Not Found')
            //         ->body("pdf file not exist.")
            //         ->send();
            //     return;
            // }

            // if (! $printerName) {
            //     Notification::make()
            //         ->danger()
            //         ->title('Printer Not Found')
            //         ->body("No CUPS printer configured for IP: $iotsPrintIp")
            //         ->send();
            //     return;
            // }

            // putenv('CUPS_SERVER=printer.iotsignin.com');

            // $cmd = "lp -d " . escapeshellarg($printerName)
            //     . " -o fit-to-page "
            //     . escapeshellarg($pdfPath);

            // exec($cmd, $out, $status);

            // if ($status != 0) {
            //     Notification::make()
            //         ->danger()
            //         ->title('Print Failed')
            //         ->body('CUPS print command failed.')
            //         ->send();
            //     return;
            // }

            //dd($iotsPrintIp, $matchedSticker);

            StickerValidation::create([
                'plant_id' => $this->plantId,
                'machine_id' => $this->workCenter,
                'production_order' => $this->ref_number ?? null,
                'serial_number' => $serialNumber,
                'status'  => 'Printed',
                // 'sticker_id' => $matchedSticker,
                'created_by' => $operatorName,
                'created_at' => now(),
                'updated_at' => now(),
            ]);

            Notification::make()
                ->success()
                ->title('Sticker Recorded')
                ->body("Item: $itemCode, Serial: $serialNumber recorded successfully!")
                ->seconds(3)
                ->send();

            $this->form->fill([
                'plant_id' => $this->plantId,
                'machine_id' => $this->workCenter,
                'production_order' => $this->ref_number,
                'serial_number' => null,
            ]);

            $this->dispatch('refreshEmptySticker', $plantId, $this->ref_number);

        }

    }

    private function getPrinterNameByIp(string $ip): ?string
    {
        exec('lpstat -v', $output);

        foreach ($output as $line) {
            // Example:
            // device for TSC_WC_01: socket://192.168.1.50:9100
            if (str_contains($line, $ip)) {
                preg_match('/device for (.+?):/', $line, $matches);
                return $matches[1] ?? null;
            }
        }

        return null;
    }

}
