<?php

namespace App\Services;

use App\Models\Item;
use App\Models\ItemCharacteristic;
use App\Models\ProductionQuantity;
use App\Models\StickerDetail;
use App\Models\StickerMappingMaster;
use App\Models\StickerStructureDetail;
use App\Models\StickerValidation;
use Illuminate\Http\Response;
use Illuminate\Support\Collection;
use Illuminate\Support\Facades\Log;
use Illuminate\Support\Facades\Schema;
use TCPDF;

class StickerPdfService
{
    public function generateStickerItem(string $stickerId, Collection $dynamicElements, ?ItemCharacteristic $itemCharacteristic)
    {

        $dynamicValueMap = [];

        foreach ($dynamicElements as $element) {

            $column = $element->characteristics_type;

            $value = '';

            if (
                $itemCharacteristic &&
                $column &&
                Schema::hasColumn('item_characteristics', $column)
            ) {
                $value = $itemCharacteristic->{$column};
            }

            $dynamicValueMap[$element->id] = [
                'design_type' => $element->design_element_type, // Text / Image
                'value' => $value,
            ];
        }

        $structure = StickerStructureDetail::where('sticker_id', $stickerId)
            ->first();

        $structureId = $structure->id;
        $elements = StickerDetail::where(
            'sticker_structure_detail_id',
            $structureId
        )->get();

        $width = (float) $structure->sticker_width;
        $height = (float) $structure->sticker_height;

        $pdf = new TCPDF('P', 'mm', [$width, $height], true, 'UTF-8', false);

        // $pdf->SetMargins(
        //     (float) $structure->sticker_lmargin,
        //     (float) $structure->sticker_tmargin,
        //     (float) $structure->sticker_rmargin,
        // );

        // //$pdf->SetAutoPageBreak(false, (float) $structure->sticker_bmargin);
        // $pdf->SetAutoPageBreak(false, (float) $structure->sticker_bmargin);

        $pdf->setPrintHeader(false);
        $pdf->setPrintFooter(false);
        // $pdf->setCellPaddings(0, 0, 0, 0);
        // $pdf->setCellMargins(5, 5, 5, 5);

        // Set margins
        // $pdf->SetMargins(5, 5, 5); // left, top, right

        $pdf->SetMargins(
            (float) $structure->sticker_lmargin,
            (float) $structure->sticker_tmargin,
            (float) $structure->sticker_rmargin,
        );
        $pdf->SetAutoPageBreak(false, 0);

        $pdf->AddPage();

        $pdf->SetFont('helvetica', 'B', 10);

        foreach ($elements as $row) {

            switch ($row->design_element_type) {

                case 'Text':

                    $pdf->SetFont(
                        $row->string_font ?? 'helvetica',
                        '',
                        (int) ($row->string_size ?? 10)
                    );

                    $pdf->SetTextColor(
                        ...$this->hexToRgb($row->element_colour ?? '#000000')
                    );

                    $textValue = $row->string_value ?? '';

                    if (
                        $row->element_type == 'Dynamic' &&
                        isset($dynamicValueMap[$row->id])
                    ) {
                        $textValue = $dynamicValueMap[$row->id]['value'];
                    }

                    $pdf->Text(
                        (float) ($row->string_x_value ?? 0),
                        (float) ($row->string_y_value ?? 0),
                        (string) $textValue
                    );

                    break;

                case 'QR':
                    $pdf->write2DBarcode(
                        $row->qr_value ?? '',
                        'QRCODE,H',
                        (float) ($row->qr_x_value ?? 0),
                        (float) ($row->qr_y_value ?? 0),
                        (float) ($row->qr_size ?? 10),
                        (float) ($row->qr_size ?? 10)
                    );
                    break;

                case 'Image':

                    $imagePath = null;

                    if (
                        $row->element_type == 'Dynamic' &&
                        isset($dynamicValueMap[$row->id]) &&
                        ! empty($dynamicValueMap[$row->id]['value'])
                    ) {
                        $imageName = strtolower($dynamicValueMap[$row->id]['value']).'.png';

                        $imagePath = public_path('images/'.ltrim($imageName, '/'));
                    }

                    $pdf->Image(
                        $imagePath,
                        (float) ($row->image_x ?? 0),
                        (float) ($row->image_y ?? 0),
                        (float) ($row->image_width ?? 0),
                        (float) ($row->image_height ?? 0)
                    );
                    break;
                case 'Shape':
                    if ($row->shape_name == 'Line') {
                        $pdf->SetLineWidth((float) ($row->shape_pen_size ?? 0.3));

                        if (isset($row->element_colour)) {
                            $rgb = $this->hexToRgb($row->element_colour);
                            $pdf->SetDrawColor($rgb[0], $rgb[1], $rgb[2]);
                        } else {
                            $pdf->SetDrawColor(0, 0, 0);
                        }

                        $pdf->Line(
                            (float) $row->shape_x1_value,
                            (float) $row->shape_y1_value,
                            (float) $row->shape_x2_value,
                            (float) $row->shape_y2_value
                        );
                    } elseif ($row->shape_name == 'Rectangle') {
                        $pdf->SetLineWidth((float) ($row->shape_pen_size ?? 0.3));

                        if (isset($row->element_colour)) {
                            $rgb = $this->hexToRgb($row->element_colour);
                            $pdf->SetDrawColor($rgb[0], $rgb[1], $rgb[2]);
                        } else {
                            $pdf->SetDrawColor(0, 0, 0);
                        }

                        $x1 = (float) $row->shape_x1_value;
                        $y1 = (float) $row->shape_y1_value;
                        $x2 = (float) $row->shape_x2_value;
                        $y2 = (float) $row->shape_y2_value;

                        $x = min($x1, $x2);
                        $y = min($y1, $y2);
                        $width = abs($x2 - $x1);
                        $height = abs($y2 - $y1);

                        $pdf->Rect($x, $y, $width, $height, 'D');
                    } elseif ($row->shape_name == 'CurvedRectangle') {
                        $pdf->SetLineWidth((float) ($row->shape_pen_size ?? 0.3));

                        if (isset($row->element_colour)) {
                            $rgb = $this->hexToRgb($row->element_colour);
                            $pdf->SetDrawColor($rgb[0], $rgb[1], $rgb[2]);
                        } else {
                            $pdf->SetDrawColor(0, 0, 0);
                        }

                        $x1 = (float) $row->shape_x1_value;
                        $y1 = (float) $row->shape_y1_value;
                        $x2 = (float) $row->shape_x2_value;
                        $y2 = (float) $row->shape_y2_value;

                        $x = min($x1, $x2);
                        $y = min($y1, $y2);
                        $width = abs($x2 - $x1);
                        $height = abs($y2 - $y1);

                        // radius in mm
                        // $radius = 3;
                        $radius = (float) $row->curve_radius;

                        $pdf->RoundedRect(
                            $x,
                            $y,
                            $width,
                            $height,
                            $radius,
                            '1111', // ← round all 4 corners (default)
                            'D'
                        );
                    }

                    break;
            }
        }

        $pdfContent = $pdf->Output('', 'S'); // 'S' returns string

        // Encode as base64
        return base64_encode($pdfContent);

        // // return $pdf->Output('sticker.pdf', 'S');
        // $pdfContent = $pdf->Output('sticker.pdf', 'S');

        // return (new Response($pdfContent, 200))
        //     ->header('Content-Type', 'application/pdf')
        //     ->header('Content-Disposition', 'inline; filename="sticker.pdf"');

    }

    public function generate1(string $stickerId, Collection $dynamicElements, ?ItemCharacteristic $itemCharacteristic)
    {

        $dynamicValueMap = [];

        foreach ($dynamicElements as $element) {

            $column = $element->characteristics_type;

            $value = '';

            if (
                $itemCharacteristic &&
                $column &&
                Schema::hasColumn('item_characteristics', $column)
            ) {
                $value = $itemCharacteristic->{$column};
            }

            $dynamicValueMap[$element->id] = [
                'design_type' => $element->design_element_type, // Text / Image
                'value' => $value,
            ];
        }

        $structure = StickerStructureDetail::where('sticker_id', $stickerId)
            ->first();

        $structureId = $structure->id;
        $elements = StickerDetail::where(
            'sticker_structure_detail_id',
            $structureId
        )->get();

        $width = (float) $structure->sticker_width;
        $height = (float) $structure->sticker_height;

        $pdf = new TCPDF('P', 'mm', [$width, $height], true, 'UTF-8', false);

        // $pdf->SetMargins(
        //     (float) $structure->sticker_lmargin,
        //     (float) $structure->sticker_tmargin,
        //     (float) $structure->sticker_rmargin,
        // );

        // //$pdf->SetAutoPageBreak(false, (float) $structure->sticker_bmargin);
        // $pdf->SetAutoPageBreak(false, (float) $structure->sticker_bmargin);

        $pdf->setPrintHeader(false);
        $pdf->setPrintFooter(false);
        // $pdf->setCellPaddings(0, 0, 0, 0);
        // $pdf->setCellMargins(5, 5, 5, 5);

        // Set margins
        // $pdf->SetMargins(5, 5, 5); // left, top, right

        $pdf->SetMargins(
            (float) $structure->sticker_lmargin,
            (float) $structure->sticker_tmargin,
            (float) $structure->sticker_rmargin,
        );
        $pdf->SetAutoPageBreak(false, 0);

        $pdf->AddPage();

        $pdf->SetFont('helvetica', 'B', 10);

        foreach ($elements as $row) {

            switch ($row->design_element_type) {

                case 'Text':

                    $pdf->SetFont(
                        $row->string_font ?? 'helvetica',
                        '',
                        (int) ($row->string_size ?? 10)
                    );

                    $pdf->SetTextColor(
                        ...$this->hexToRgb($row->element_colour ?? '#000000')
                    );

                    $textValue = $row->string_value ?? '';

                    if (
                        $row->element_type == 'Dynamic' &&
                        isset($dynamicValueMap[$row->id])
                    ) {
                        $textValue = $dynamicValueMap[$row->id]['value'];
                    }

                    $pdf->Text(
                        (float) ($row->string_x_value ?? 0),
                        (float) ($row->string_y_value ?? 0),
                        (string) $textValue
                    );

                    break;

                case 'QR':
                    $pdf->write2DBarcode(
                        $row->qr_value ?? '',
                        'QRCODE,H',
                        (float) ($row->qr_x_value ?? 0),
                        (float) ($row->qr_y_value ?? 0),
                        (float) ($row->qr_size ?? 10),
                        (float) ($row->qr_size ?? 10)
                    );
                    break;

                case 'Image':

                    $imagePath = null;

                    if (
                        $row->element_type == 'Dynamic' &&
                        isset($dynamicValueMap[$row->id]) &&
                        ! empty($dynamicValueMap[$row->id]['value'])
                    ) {
                        $imageName = strtolower($dynamicValueMap[$row->id]['value']).'.png';

                        $imagePath = public_path('images/'.ltrim($imageName, '/'));
                    }

                    $pdf->Image(
                        $imagePath,
                        (float) ($row->image_x ?? 0),
                        (float) ($row->image_y ?? 0),
                        (float) ($row->image_width ?? 0),
                        (float) ($row->image_height ?? 0)
                    );
                    break;
                case 'Shape':
                    if ($row->shape_name == 'Line') {
                        $pdf->SetLineWidth((float) ($row->shape_pen_size ?? 0.3));

                        if (isset($row->element_colour)) {
                            $rgb = $this->hexToRgb($row->element_colour);
                            $pdf->SetDrawColor($rgb[0], $rgb[1], $rgb[2]);
                        } else {
                            $pdf->SetDrawColor(0, 0, 0);
                        }

                        $pdf->Line(
                            (float) $row->shape_x1_value,
                            (float) $row->shape_y1_value,
                            (float) $row->shape_x2_value,
                            (float) $row->shape_y2_value
                        );
                    } elseif ($row->shape_name == 'Rectangle') {
                        $pdf->SetLineWidth((float) ($row->shape_pen_size ?? 0.3));

                        if (isset($row->element_colour)) {
                            $rgb = $this->hexToRgb($row->element_colour);
                            $pdf->SetDrawColor($rgb[0], $rgb[1], $rgb[2]);
                        } else {
                            $pdf->SetDrawColor(0, 0, 0);
                        }

                        $x1 = (float) $row->shape_x1_value;
                        $y1 = (float) $row->shape_y1_value;
                        $x2 = (float) $row->shape_x2_value;
                        $y2 = (float) $row->shape_y2_value;

                        $x = min($x1, $x2);
                        $y = min($y1, $y2);
                        $width = abs($x2 - $x1);
                        $height = abs($y2 - $y1);

                        $pdf->Rect($x, $y, $width, $height, 'D');
                    } elseif ($row->shape_name == 'CurvedRectangle') {
                        $pdf->SetLineWidth((float) ($row->shape_pen_size ?? 0.3));

                        if (isset($row->element_colour)) {
                            $rgb = $this->hexToRgb($row->element_colour);
                            $pdf->SetDrawColor($rgb[0], $rgb[1], $rgb[2]);
                        } else {
                            $pdf->SetDrawColor(0, 0, 0);
                        }

                        $x1 = (float) $row->shape_x1_value;
                        $y1 = (float) $row->shape_y1_value;
                        $x2 = (float) $row->shape_x2_value;
                        $y2 = (float) $row->shape_y2_value;

                        $x = min($x1, $x2);
                        $y = min($y1, $y2);
                        $width = abs($x2 - $x1);
                        $height = abs($y2 - $y1);

                        // radius in mm
                        // $radius = 3;
                        $radius = (float) $row->curve_radius;

                        $pdf->RoundedRect(
                            $x,
                            $y,
                            $width,
                            $height,
                            $radius,
                            '1111', // ← round all 4 corners (default)
                            'D'
                        );
                    }

                    break;
            }
        }

        // return $pdf->Output('sticker.pdf', 'S');
        $pdfContent = $pdf->Output('', 'S'); // 'S' returns string

        // Encode as base64
        return base64_encode($pdfContent);

    }

    public function generate(string $stickerId, array $elements)
    {
        $structure = StickerStructureDetail::where('sticker_id', $stickerId)
            ->first();

        // $stickerId = $structure->sticker_id;

        // $elements = StickerDetail::where('sticker_structure_detail_id', $stickerId)->get();

        // dd($elements);
        $structureId = $structure->id;
        $elements = StickerDetail::where(
            'sticker_structure_detail_id',
            $structureId
        )->get();

        $width = (float) $structure->sticker_width;
        $height = (float) $structure->sticker_height;

        $pdf = new TCPDF('P', 'mm', [$width, $height], true, 'UTF-8', false);

        // $pdf->SetMargins(
        //     (float) $structure->sticker_lmargin,
        //     (float) $structure->sticker_tmargin,
        //     (float) $structure->sticker_rmargin,
        // );

        // //$pdf->SetAutoPageBreak(false, (float) $structure->sticker_bmargin);
        // $pdf->SetAutoPageBreak(false, (float) $structure->sticker_bmargin);

        $pdf->setPrintHeader(false);
        $pdf->setPrintFooter(false);
        // $pdf->setCellPaddings(0, 0, 0, 0);
        $pdf->setCellMargins(5, 5, 5, 5);

        // Set margins
        $pdf->SetMargins(5, 5, 5); // left, top, right
        // $pdf->SetAutoPageBreak(false, 0); // bottom = 0

        $pdf->SetMargins(
            (float) $structure->sticker_lmargin,
            (float) $structure->sticker_tmargin,
            (float) $structure->sticker_rmargin,
            (float) $structure->sticker_bmargin,
        );

        // $pdf->SetAutoPageBreak(false, (float) $structure->sticker_bmargin);
        // $pdf->SetAutoPageBreak(false, (float) $structure->sticker_bmargin);

        // dd($pdf->getMargins());

        $pdf->AddPage();

        $pdf->SetFont('helvetica', 'B', 10); // font, style, size in points

        // // 📍 ADD TEXT: 3mm from left, 10mm from top
        // $pdf->Text(3, 10, 'Sticker ID: ' . $stickerId);

        // // Optional: add more text
        // $pdf->SetFont('helvetica', '', 8);
        // $pdf->Text(45, 45, 'Batch: X1');
        // $pdf->Text(3, 20, '✓ Valid');

        foreach ($elements as $row) {

            switch ($row->design_element_type) {

                case 'Text':
                    $pdf->SetFont(
                        $row->string_font ?? 'helvetica',
                        '',
                        (int) ($row->string_size ?? 10)
                    );
                    $pdf->SetTextColor(...$this->hexToRgb($row->element_colour ?? '#000000'));
                    $pdf->Text(
                        (float) ($row->string_x_value ?? 0),
                        (float) ($row->string_y_value ?? 0),
                        $row->string_value ?? ''
                    );
                    break;

                case 'QR':
                    $pdf->write2DBarcode(
                        $row->qr_value ?? '',
                        'QRCODE,H',
                        (float) ($row->qr_x_value ?? 0),
                        (float) ($row->qr_y_value ?? 0),
                        (float) ($row->qr_size ?? 10),
                        (float) ($row->qr_size ?? 10)
                    );
                    break;

                case 'Image':
                    if (empty($row->image_path)) {
                        break;
                    }

                    $imagePath = storage_path('app/public/'.ltrim($row->image_path, '/'));

                    // Optional: check if file actually exists (avoid TCPDF crash)
                    if (! file_exists($imagePath)) {
                        // Log or skip — or use a placeholder
                        break;
                    }

                    $pdf->Image(
                        $imagePath,
                        (float) ($row->image_x ?? 0),
                        (float) ($row->image_y ?? 0),
                        (float) ($row->image_width ?? 0),
                        (float) ($row->image_height ?? 0)
                    );
                    break;
                case 'Shape':
                    if ($row->shape_name == 'Line') {
                        $pdf->SetLineWidth((float) ($row->shape_pen_size ?? 0.3));

                        if (isset($row->element_colour)) {
                            $rgb = $this->hexToRgb($row->element_colour);
                            $pdf->SetDrawColor($rgb[0], $rgb[1], $rgb[2]);
                        } else {
                            $pdf->SetDrawColor(0, 0, 0);
                        }

                        $pdf->Line(
                            (float) $row->shape_x1_value,
                            (float) $row->shape_y1_value,
                            (float) $row->shape_x2_value,
                            (float) $row->shape_y2_value
                        );
                    } elseif ($row->shape_name == 'Rectangle') {
                        $pdf->SetLineWidth((float) ($row->shape_pen_size ?? 0.3));

                        if (isset($row->element_colour)) {
                            $rgb = $this->hexToRgb($row->element_colour);
                            $pdf->SetDrawColor($rgb[0], $rgb[1], $rgb[2]);
                        } else {
                            $pdf->SetDrawColor(0, 0, 0);
                        }

                        $x1 = (float) $row->shape_x1_value;
                        $y1 = (float) $row->shape_y1_value;
                        $x2 = (float) $row->shape_x2_value;
                        $y2 = (float) $row->shape_y2_value;

                        $x = min($x1, $x2);
                        $y = min($y1, $y2);
                        $width = abs($x2 - $x1);
                        $height = abs($y2 - $y1);

                        $pdf->Rect($x, $y, $width, $height, 'D');
                    }
                    break;
            }
        }

        // return $pdf->Output('sticker.pdf', 'S');
        $pdfContent = $pdf->Output('sticker.pdf', 'S');

        return (new Response($pdfContent, 200))
            ->header('Content-Type', 'application/pdf')
            ->header('Content-Disposition', 'inline; filename="sticker.pdf"');
    }

    public function generateSticker(string $stickerId, array $elements)
    {
        $structure = StickerStructureDetail::where('sticker_id', $stickerId)
            ->first();

        // $stickerId = $structure->sticker_id;

        // $elements = StickerDetail::where('sticker_structure_detail_id', $stickerId)->get();

        // dd($elements);
        $structureId = $structure->id;
        $elements = StickerDetail::where(
            'sticker_structure_detail_id',
            $structureId
        )->get();

        $width = (float) $structure->sticker_width;
        $height = (float) $structure->sticker_height;

        $pdf = new TCPDF('P', 'mm', [$width, $height], true, 'UTF-8', false);

        // $pdf->SetMargins(
        //     (float) $structure->sticker_lmargin,
        //     (float) $structure->sticker_tmargin,
        //     (float) $structure->sticker_rmargin,
        // );

        // //$pdf->SetAutoPageBreak(false, (float) $structure->sticker_bmargin);
        // $pdf->SetAutoPageBreak(false, (float) $structure->sticker_bmargin);

        $pdf->setPrintHeader(false);
        $pdf->setPrintFooter(false);
        // $pdf->setCellPaddings(0, 0, 0, 0);
        $pdf->setCellMargins(5, 5, 5, 5);

        // Set margins
        $pdf->SetMargins(5, 5, 5); // left, top, right
        // $pdf->SetAutoPageBreak(false, 0); // bottom = 0

        $pdf->SetMargins(
            (float) $structure->sticker_lmargin,
            (float) $structure->sticker_tmargin,
            (float) $structure->sticker_rmargin,
            (float) $structure->sticker_bmargin,
        );

        // $pdf->SetAutoPageBreak(false, (float) $structure->sticker_bmargin);
        // $pdf->SetAutoPageBreak(false, (float) $structure->sticker_bmargin);

        // dd($pdf->getMargins());

        $pdf->AddPage();

        $pdf->SetFont('helvetica', 'B', 10); // font, style, size in points

        // // 📍 ADD TEXT: 3mm from left, 10mm from top
        // $pdf->Text(3, 10, 'Sticker ID: ' . $stickerId);

        // // Optional: add more text
        // $pdf->SetFont('helvetica', '', 8);
        // $pdf->Text(45, 45, 'Batch: X1');
        // $pdf->Text(3, 20, '✓ Valid');

        foreach ($elements as $row) {

            switch ($row->design_element_type) {

                case 'Text':
                    $pdf->SetFont(
                        $row->string_font ?? 'helvetica',
                        '',
                        (int) ($row->string_size ?? 10)
                    );
                    $pdf->SetTextColor(...$this->hexToRgb($row->element_colour ?? '#000000'));
                    $pdf->Text(
                        (float) ($row->string_x_value ?? 0),
                        (float) ($row->string_y_value ?? 0),
                        $row->string_value ?? ''
                    );
                    break;

                case 'QR':
                    $pdf->write2DBarcode(
                        $row->qr_value ?? '',
                        'QRCODE,H',
                        (float) ($row->qr_x_value ?? 0),
                        (float) ($row->qr_y_value ?? 0),
                        (float) ($row->qr_size ?? 10),
                        (float) ($row->qr_size ?? 10)
                    );
                    break;

                case 'Image':
                    if (empty($row->image_path)) {
                        break;
                    }

                    $imagePath = storage_path('app/public/'.ltrim($row->image_path, '/'));

                    // Optional: check if file actually exists (avoid TCPDF crash)
                    if (! file_exists($imagePath)) {
                        // Log or skip — or use a placeholder
                        break;
                    }

                    $pdf->Image(
                        $imagePath,
                        (float) ($row->image_x ?? 0),
                        (float) ($row->image_y ?? 0),
                        (float) ($row->image_width ?? 0),
                        (float) ($row->image_height ?? 0)
                    );
                    break;
                case 'Shape':
                    if ($row->shape_name == 'Line') {
                        $pdf->SetLineWidth((float) ($row->shape_pen_size ?? 0.3));

                        if (isset($row->element_colour)) {
                            $rgb = $this->hexToRgb($row->element_colour);
                            $pdf->SetDrawColor($rgb[0], $rgb[1], $rgb[2]);
                        } else {
                            $pdf->SetDrawColor(0, 0, 0);
                        }

                        $pdf->Line(
                            (float) $row->shape_x1_value,
                            (float) $row->shape_y1_value,
                            (float) $row->shape_x2_value,
                            (float) $row->shape_y2_value
                        );
                    } elseif ($row->shape_name == 'Rectangle') {
                        $pdf->SetLineWidth((float) ($row->shape_pen_size ?? 0.3));

                        if (isset($row->element_colour)) {
                            $rgb = $this->hexToRgb($row->element_colour);
                            $pdf->SetDrawColor($rgb[0], $rgb[1], $rgb[2]);
                        } else {
                            $pdf->SetDrawColor(0, 0, 0);
                        }

                        $x1 = (float) $row->shape_x1_value;
                        $y1 = (float) $row->shape_y1_value;
                        $x2 = (float) $row->shape_x2_value;
                        $y2 = (float) $row->shape_y2_value;

                        $x = min($x1, $x2);
                        $y = min($y1, $y2);
                        $width = abs($x2 - $x1);
                        $height = abs($y2 - $y1);

                        $pdf->Rect($x, $y, $width, $height, 'D');
                    }
                    break;
            }
        }

        $pdfContent = $pdf->Output('', 'S'); // 'S' returns string

        // Encode as base64
        return base64_encode($pdfContent);

        // // return $pdf->Output('sticker.pdf', 'S');
        // $pdfContent = $pdf->Output('sticker.pdf', 'S');

        // return (new Response($pdfContent, 200))
        //     ->header('Content-Type', 'application/pdf')
        //     ->header('Content-Disposition', 'inline; filename="sticker.pdf"');
    }

    public function generatePdf1(string $stickerId, Collection $dynamicElements, ?ItemCharacteristic $itemCharacteristic, ?string $serialNumber, $serNo)
    {

        $dynamicValueMap = [];
        $itemCode = $itemCharacteristic?->item?->code ?? '';

        foreach ($dynamicElements as $element) {

            $column = $element->characteristics_type;

            $value = '';

            if (
                $itemCharacteristic &&
                $column &&
                Schema::hasColumn('item_characteristics', $column)
            ) {
                $value = $itemCharacteristic->{$column};
            }

            $dynamicValueMap[$element->id] = [
                'design_type' => $element->design_element_type, // Text / Image
                'value' => $value,
            ];
        }

        $structure = StickerStructureDetail::where('sticker_id', $stickerId)
            ->first();

        $structureId = $structure->id;
        $elements = StickerDetail::where(
            'sticker_structure_detail_id',
            $structureId
        )->get();

        $width = (float) $structure->sticker_width;
        $height = (float) $structure->sticker_height;

        $pdf = new TCPDF('P', 'mm', [$width, $height], true, 'UTF-8', false);

        $pdf->setPrintHeader(false);
        $pdf->setPrintFooter(false);

        $pdf->SetMargins(
            (float) $structure->sticker_lmargin,
            (float) $structure->sticker_tmargin,
            (float) $structure->sticker_rmargin,
            (float) $structure->sticker_bmargin,
        );
        $pdf->SetAutoPageBreak(false, 0);

        $pdf->AddPage();

        // if (!empty($serialNumber)) {
        //     $pdf->SetFont('helvetica', 'B', 10);
        //     $pdf->SetTextColor(0, 0, 0);

        //     // HARD-CODED POSITION (mm)
        //     $x = 40;  // change as needed
        //     $y = 60;  // change as needed

        //     $pdf->Text($x, $y, (string) $serialNumber);
        // }

        $pdf->SetFont('helvetica', 'B', 10);

        foreach ($elements as $row) {

            switch ($row->design_element_type) {

                case 'Text':

                    $pdf->SetFont(
                        $row->string_font ?? 'helvetica',
                        '',
                        (int) ($row->string_size ?? 10)
                    );

                    $pdf->SetTextColor(
                        ...$this->hexToRgb($row->element_colour ?? '#000000')
                    );

                    $textValue = $row->string_value ?? '';

                    if (
                        $row->element_type == 'Dynamic' &&
                        isset($dynamicValueMap[$row->id])
                    ) {
                        $textValue = $dynamicValueMap[$row->id]['value'];
                    }

                    $pdf->Text(
                        (float) ($row->string_x_value ?? 0),
                        (float) ($row->string_y_value ?? 0),
                        (string) $textValue
                    );

                    break;

                case 'QR':
                    if (
                        ($row->element_type) == 'Dynamic'
                    ) {
                        $qrContent = $serNo ?? '';
                        $pdf->write2DBarcode(
                        $qrContent,
                            'QRCODE,H',
                            (float) ($row->qr_x_value ?? 0),
                            (float) ($row->qr_y_value ?? 0),
                            (float) ($row->qr_size ?? 10),
                            (float) ($row->qr_size ?? 10)
                            );
                        break;
                    }
                    else{
                        $pdf->write2DBarcode(
                        $row->qr_value ?? '',
                            'QRCODE,H',
                            (float) ($row->qr_x_value ?? 0),
                            (float) ($row->qr_y_value ?? 0),
                            (float) ($row->qr_size ?? 10),
                            (float) ($row->qr_size ?? 10)
                            );
                        break;
                    }


                case 'Image':

                    $imagePath = null;

                    if (
                        $row->element_type == 'Dynamic' &&
                        isset($dynamicValueMap[$row->id]) &&
                        ! empty($dynamicValueMap[$row->id]['value'])
                    ) {
                        $imageName = strtolower($dynamicValueMap[$row->id]['value']).'.png';

                        $imagePath = public_path('images/'.ltrim($imageName, '/'));
                    }

                    $pdf->Image(
                        $imagePath,
                        (float) ($row->image_x ?? 0),
                        (float) ($row->image_y ?? 0),
                        (float) ($row->image_width ?? 0),
                        (float) ($row->image_height ?? 0)
                    );
                    break;
                case 'Shape':
                    if ($row->shape_name == 'Line') {
                        $pdf->SetLineWidth((float) ($row->shape_pen_size ?? 0.3));

                        if (isset($row->element_colour)) {
                            $rgb = $this->hexToRgb($row->element_colour);
                            $pdf->SetDrawColor($rgb[0], $rgb[1], $rgb[2]);
                        } else {
                            $pdf->SetDrawColor(0, 0, 0);
                        }

                        $pdf->Line(
                            (float) $row->shape_x1_value,
                            (float) $row->shape_y1_value,
                            (float) $row->shape_x2_value,
                            (float) $row->shape_y2_value
                        );
                    } elseif ($row->shape_name == 'Rectangle') {
                        $pdf->SetLineWidth((float) ($row->shape_pen_size ?? 0.3));

                        if (isset($row->element_colour)) {
                            $rgb = $this->hexToRgb($row->element_colour);
                            $pdf->SetDrawColor($rgb[0], $rgb[1], $rgb[2]);
                        } else {
                            $pdf->SetDrawColor(0, 0, 0);
                        }

                        $x1 = (float) $row->shape_x1_value;
                        $y1 = (float) $row->shape_y1_value;
                        $x2 = (float) $row->shape_x2_value;
                        $y2 = (float) $row->shape_y2_value;

                        $x = min($x1, $x2);
                        $y = min($y1, $y2);
                        $width = abs($x2 - $x1);
                        $height = abs($y2 - $y1);

                        $pdf->Rect($x, $y, $width, $height, 'D');
                    } elseif ($row->shape_name == 'CurvedRectangle') {
                        $pdf->SetLineWidth((float) ($row->shape_pen_size ?? 0.3));

                        if (isset($row->element_colour)) {
                            $rgb = $this->hexToRgb($row->element_colour);
                            $pdf->SetDrawColor($rgb[0], $rgb[1], $rgb[2]);
                        } else {
                            $pdf->SetDrawColor(0, 0, 0);
                        }

                        $x1 = (float) $row->shape_x1_value;
                        $y1 = (float) $row->shape_y1_value;
                        $x2 = (float) $row->shape_x2_value;
                        $y2 = (float) $row->shape_y2_value;

                        $x = min($x1, $x2);
                        $y = min($y1, $y2);
                        $width = abs($x2 - $x1);
                        $height = abs($y2 - $y1);

                        // radius in mm
                        // $radius = 3;
                        $radius = (float) $row->curve_radius;

                        $pdf->RoundedRect(
                            $x,
                            $y,
                            $width,
                            $height,
                            $radius,
                            '1111', // ← round all 4 corners (default)
                            'D'
                        );
                    }

                    break;
            }
        }

        // $pdfContent = $pdf->Output('', 'S'); // 'S' returns string

        // // Encode as base64
        // return base64_encode($pdfContent);


        // $pdfContent = $pdf->Output('', 'S');

        // return response($pdfContent)
        // ->header('Content-Type', 'application/pdf')
        // ->header('Content-Disposition', 'inline; filename="sticker.pdf"');
            $pdfContent = $pdf->Output('', 'S'); // 'S' returns the PDF as a string

    // Return the PDF as a response
        try {
            $pdfContent = $pdf->Output('', 'S'); // 'S' returns the PDF as a string
            return response($pdfContent)
                ->header('Content-Type', 'application/pdf')
                ->header('Content-Disposition', 'inline; filename="sticker.pdf"');
        } catch (\Exception $e) {
            Log::error('PDF generation failed: '.$e->getMessage());
            abort(500, 'Failed to generate PDF');
        }
    }

    public function generatePdfBySerial($item, $serNo, $plantId, $refNumber)
    {
        $recFound = ProductionQuantity::where('plant_id', $plantId)
        ->where('production_order', $refNumber)
        ->where('serial_number', $serNo)
        ->first();

        if (!$recFound) {
            abort(404, 'Serial not found');
        }

        $duplicate = StickerValidation::where('plant_id', $plantId)
            ->where('production_order', $refNumber)
            ->where('serial_number', $serNo)
            ->first();

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

        if (!$itemC) {
            abort(404, 'Item not found');
        }

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

        if (!$item) {
            abort(404, 'Item characteristic not found');
        }

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

        if (!$mapping) {
            abort(404, 'Sticker mapping not found');
        }

        $structure = StickerStructureDetail::findOrFail($mapping->sticker_structure1_id);

        $dynamicElements = StickerDetail::where(
            'sticker_structure_detail_id',
            $structure->id
        )->where('element_type', 'Dynamic')->get();

        return $this->generatePdf1(
            $structure->sticker_id,
            $dynamicElements,
            $item,
            $serNo,
            $serNo
        );

        // return response($pdf)
        //     ->header('Content-Type', 'application/pdf')
        //     ->header('Content-Disposition', 'inline; filename="sticker.pdf"');
    }

    // public function printStickersToUSB(array $stickers, int $plantId, ?string $serialNumber)
    // {
    //     $printerPort = 'USB001';

    //     foreach ($stickers as $sticker) {

    //         $dynamicElements = StickerDetail::where('sticker_structure_detail_id', $sticker['sticker_id'])
    //             ->get();

    //         $itemCharacteristic = ItemCharacteristic::find(
    //             $sticker['item_characteristic']
    //         );

    //         $pdfContent = $this->generatePdf1(
    //             $sticker['sticker_id'],
    //             $dynamicElements,
    //             $itemCharacteristic,
    //             $serialNumber
    //         );

    //         $handle = fopen("{$printerPort}:", "wb");

    //         if (! $handle) {
    //             throw new \Exception("Cannot open printer port {$printerPort}");
    //         }

    //         fwrite($handle, $pdfContent);
    //         fclose($handle);
    //     }
    // }


    // private function hexToRgb($hex)
    // {
    //     $hex = ltrim($hex, '#');
    //     return [
    //         hexdec(substr($hex, 0, 2)),
    //         hexdec(substr($hex, 2, 2)),
    //         hexdec(substr($hex, 4, 2)),
    //     ];
    // }

    private function hexToRgb($hex)
    {
        if (! is_string($hex) || ($hex = trim($hex)) === '') {
            return [0, 0, 0];
        }
        $hex = ltrim($hex, '#');
        if (strlen($hex) == 3) {
            $hex = $hex[0].$hex[0].$hex[1].$hex[1].$hex[2].$hex[2];
        }
        if (strlen($hex) !== 6 || ! ctype_xdigit($hex)) {
            return [0, 0, 0];
        }

        return [
            hexdec(substr($hex, 0, 2)), // integer
            hexdec(substr($hex, 2, 2)), // integer
            hexdec(substr($hex, 4, 2)),  // integer
        ];
    }
}
