<?php

namespace App\Http\Controllers\Admin;

use App\Http\Controllers\Controller;
use App\Models\Product;
use Barryvdh\DomPDF\Facade\Pdf;
use Illuminate\Http\Request;
use Illuminate\View\View;
use Picqer\Barcode\BarcodeGeneratorPNG;
use Symfony\Component\HttpFoundation\Response;

class BarcodeController extends Controller
{
    /**
     * Display HTML print view for barcode label
     */
    public function printLabel(Product $product, Request $request): View
    {
        $variant = null;
        $barcodeValue = null;
        $salesPrice = null;
        $wholesalePrice = null;
        $mrp = null;

        // Unified model: If variant_id is provided, it's actually a product ID (variant product)
        $variant = null;
        if ($request->has('variant_id')) {
            $variant = Product::where('id', $request->variant_id)
                ->where('parent_id', $product->id)
                ->where('is_active', true)
                ->with('attributeValues.attribute')
                ->first();
        }

        // Get barcode and prices
        if ($variant) {
            // Use variant (child product) barcode and prices
            $barcodeValue = $variant->barcode ?? $product->barcode ?? $this->generateRandomBarcode();
            $salesPrice = $variant->price;
            $wholesalePrice = $variant->wholesale_price;
            $mrp = $variant->mrp;
        } else {
            // Use product barcode and prices
            $barcodeValue = $product->barcode ?? $this->generateRandomBarcode();
            $salesPrice = $product->price;
            $wholesalePrice = $product->wholesale_price;
            $mrp = $product->mrp;
            
            // For variant parent products, load all variants for selection
            if (is_null($product->parent_id) && $product->product_type === 'variant') {
                $product->load('variants.attributeValues.attribute');
            }
        }

        // Generate barcode image
        $barcodeImage = generateBarcodeImage($barcodeValue);

        // Get all dynamic attributes from variant
        $variantAttributes = $this->getVariantAttributes($variant);

        return view('admin.products.barcode.print', [
            'product' => $product,
            'variant' => $variant,
            'barcodeImage' => $barcodeImage,
            'barcodeValue' => $barcodeValue,
            'salesPrice' => $salesPrice,
            'wholesalePrice' => $wholesalePrice,
            'mrp' => $mrp,
            'variantAttributes' => $variantAttributes,
        ]);
    }

    /**
     * Generate random barcode value
     * 
     * @return string Random 8-digit barcode
     */
    protected function generateRandomBarcode(): string
    {
        // Generate a random 8-digit number
        return str_pad((string) mt_rand(10000000, 99999999), 8, '0', STR_PAD_LEFT);
    }

    /**
     * Get all dynamic attributes from variant (now a Product)
     * 
     * @param Product|null $variant
     * @return array Array of attributes with 'name' and 'value' keys, or empty array if no variant/attributes
     */
    protected function getVariantAttributes(?Product $variant): array
    {
        if (!$variant) {
            return [];
        }

        // Ensure attributeValues relation is loaded
        if (!$variant->relationLoaded('attributeValues')) {
            $variant->load('attributeValues.attribute');
        }

        $attributeValues = $variant->attributeValues;
        
        if ($attributeValues->isEmpty()) {
            return [];
        }

        // Collect all attributes dynamically
        $attributes = [];
        foreach ($attributeValues as $attributeValue) {
            $attribute = $attributeValue->attribute;
            if ($attribute) {
                $attributes[] = [
                    'name' => $attribute->name,
                    'value' => $attributeValue->value,
                ];
            }
        }

        return $attributes;
    }

    /**
     * Generate barcode image from barcode value
     * 
     * @param string $barcodeValue
     * @return string Base64 encoded image data
     */
    protected function generateBarcodeImage(string $barcodeValue): string
    {
        try {
            $generator = new BarcodeGeneratorPNG();
            
            // Generate Code 128 barcode
            // Parameters: type, data, width factor, height, color array [R, G, B]
            $barcodeData = $generator->getBarcode(
                $barcodeValue,
                $generator::TYPE_CODE_128,
                1, // width factor (reduced for smaller label)
                25, // height in pixels (reduced for 50mm x 25mm label)
                [0, 0, 0] // black color
            );

            // Convert to base64 for embedding in HTML/PDF
            return 'data:image/png;base64,' . base64_encode($barcodeData);
        } catch (\Exception $e) {
            // If barcode generation fails, return error
            throw new \RuntimeException('Failed to generate barcode: ' . $e->getMessage());
        }
    }
}

