<?php

namespace App\Http\Controllers;

use App\Models\CustomerPoMaster;
use App\Models\Plant;
use App\Models\WireMasterPacking;
use Barryvdh\DomPDF\Facade\Pdf;
use Illuminate\Http\Request;
use Mpdf\Mpdf;

class PalletPrintController extends Controller
{
    /**
     * Display a listing of the resource.
     */
    public function index()
    {
        //
    }

    // public function print(Request $request, $pallet, $plant)
    // {

    //     $customerId = $request->query('customer');

    //     $items = WireMasterPacking::with('item')
    //         ->where('plant_id', $plant)
    //         ->where('wire_packing_number', $pallet)
    //         ->get()
    //         ->map(function ($row) {
    //             return (object) [
    //                 'code' => $row->item->code,
    //                 'description' => $row->item->description,
    //                 'box_count' => 1, // each row = one box
    //                 'weight' => $row->weight,
    //             ];
    //         });

    //     $masterBox = WireMasterPacking::where('plant_id', $plant)
    //         ->where('wire_packing_number', $pallet)
    //         ->value('customer_po_master_id');

    //     $customer = CustomerPoMaster::find($masterBox);

    //     $customerCode = $customer->customer_po ?? '';
    //     $customerName = $customer->customer_name ?? '';

    //     // $masterBox = WireMasterPacking::where('plant_id', $plant)
    //     //     ->where('wire_packing_number', $pallet)
    //     //     ->distinct('customer_po')
    //     //     ->count('customer_po');

    //     // $pallets = WireMasterPacking::where('plant_id', $plant)
    //     //     ->select('wire_packing_number', 'updated_at')
    //     //     ->distinct('wire_packing_number')
    //     //     ->orderBy('wire_packing_number')
    //     //     ->orderBy('updated_at', 'asc')
    //     //     ->get()
    //     //     ->pluck('wire_packing_number')
    //     //     ->values();

    //     // $currentPalletNo = $pallets->search($pallet) + 1;

    //     // $totalBoxes = WireMasterPacking::where('plant_id', $plant)
    //     //     // ->where('wire_packing_number', $pallet)
    //     //     ->distinct()
    //     //     ->count('customer_po');

    //     // $boxLabel = $currentPalletNo . '/' . $totalBoxes;

    //     $totalBoxes = WireMasterPacking::where('plant_id', $plant)
    //         ->where('customer_po_master_id', $customerId)
    //         ->distinct('wire_packing_number')
    //         ->count('wire_packing_number');

    //     $completedPallets = WireMasterPacking::where('plant_id', $plant)
    //         ->where('customer_po_master_id', $customerId)
    //         ->select('wire_packing_number')
    //         ->groupBy('wire_packing_number')
    //         ->havingRaw(
    //             'COUNT(*) = COUNT(CASE WHEN wire_packing_status = ? THEN 1 END)',
    //             ['Completed']
    //         )
    //         ->orderBy('wire_packing_number')
    //         ->pluck('wire_packing_number')
    //         ->values();

    //     $index = $completedPallets->search($pallet);

    //     $currentPalletNo = ($index !== false) ? $index + 1 : 0;

    //     $boxLabel = $currentPalletNo.'/'.$totalBoxes;

    //     // $completedPallets = WireMasterPacking::where('plant_id', $plant)
    //     //     ->select('wire_packing_number')
    //     //     ->groupBy('wire_packing_number')
    //     //     ->havingRaw('COUNT(*) = COUNT(CASE WHEN wire_packing_status = ? THEN 1 END)', ['Completed'])
    //     //     ->orderBy('wire_packing_number')
    //     //     ->pluck('wire_packing_number')
    //     //     ->values();

    //     // $currentPalletNo = $completedPallets->search($pallet) != false
    //     //     ? $completedPallets->search($pallet) + 1
    //     //     : 0;

    //     // $boxLabel = $currentPalletNo . '/' . $totalBoxes;

    //     $grossWeight = $items->sum('weight');
    //     $widthPt = 85 * 2.83465; // 85mm → points
    //     $heightPt = 100 * 2.83465; // 100mm → points

    //     $plantName = Plant::where('id', $plant)->value('name');

    //     $plantAddress = Plant::where('id', $plant)->value('address');

    //     $pdf = Pdf::loadView('pdf.wire-pallet', [
    //         'product' => 'Submersible Winding Wire',
    //         'plantName' => $plantName,
    //         'plantAddress' => $plantAddress,
    //         'monthYear' => now()->format('M-y'),
    //         'branch' => '',
    //         'customerCode' => $customerCode,
    //         'customerName' => $customerName,
    //         'masterBox' => $boxLabel,
    //         'items' => $items,
    //         'grossWeight' => $grossWeight + 3.050,
    //         'netWeight' => $grossWeight,
    //         // 'grossWeight' => $grossWeight,
    //         // 'netWeight' => $grossWeight - 3.05,
    //         'pallet' => $pallet,
    //     ])->setPaper([0, 0, $widthPt, $heightPt], 'portrait');

    //     return $pdf->stream("Pallet-{$pallet}.pdf");
    //     // $pdfPath = storage_path("app/public/Pallet-{$pallet}.pdf");
    //     // $pdf->save($pdfPath);

    //     // $printerName = 'Tsc';
    //     // $output = [];
    //     // $returnVar = 0;

    //     // exec("lp -d {$printerName} " . escapeshellarg($pdfPath), $output, $returnVar);

    //     // if ($returnVar == 0) {
    //     //     return response()->json([
    //     //         'status' => 'success',
    //     //         'message' => "PDF sent to printer $printerName successfully."
    //     //     ]);
    //     // } else {
    //     //     return response()->json([
    //     //         'status' => 'error',
    //     //         'message' => "Failed to send PDF to printer $printerName.",
    //     //         'output' => $output,
    //     //         'code' => $returnVar
    //     //     ], 500);
    //     // }
    // }

    /**
     * Store a newly created resource in storage.
     */

    public function print(Request $request, $pallet, $plant)
    {

        $customerPoMasterId = WireMasterPacking::where('plant_id', $plant)
        ->where('wire_packing_number', $pallet)
        ->value('customer_po_master_id');

        $masterIds = WireMasterPacking::where('plant_id', $plant)
            ->where('wire_packing_number', $pallet)
            ->pluck('customer_po_master_id');

        $customerPo = CustomerPoMaster::whereIn('id', $masterIds)
            ->value('customer_po');

        $customerPoMasterIds = CustomerPoMaster::where('customer_po', $customerPo)
            ->pluck('id');

        $items = WireMasterPacking::with('item')
            ->where('plant_id', $plant)
            ->where('wire_packing_number', $pallet)
            ->get()
            ->map(function ($row) {
                 return (object) [
                    'code' => $row->item->code,
                    'description' => $row->item->description,
                    'box_count' => 1, // each row = one box
                    'weight' => $row->weight,
                ];
            });

        $customer = CustomerPoMaster::find($customerPoMasterId);

        $customerCode = $customer->customer_po ?? '';
        $customerName = $customer->customer_name ?? '';

        // $totalBoxes = WireMasterPacking::where('plant_id', $plant)
        //     ->where('customer_po_master_id', $customerPoMasterId)
        //     ->select('wire_packing_number')
        //     ->groupBy('wire_packing_number')
        //     ->havingRaw(
        //         'COUNT(*) = COUNT(CASE WHEN wire_packing_status = ? THEN 1 END)',
        //         ['Completed']
        //     )
        //     ->count();

        $totalBoxes = WireMasterPacking::where('plant_id', $plant)
            ->whereIn('customer_po_master_id', $customerPoMasterIds)
            ->select('wire_packing_number')
            ->groupBy('wire_packing_number')
            ->havingRaw(
                'COUNT(*) = COUNT(CASE WHEN wire_packing_status = ? THEN 1 END)',
                ['Completed']
            )
            ->count();

        // $completedPallets = WireMasterPacking::where('plant_id', $plant)
        //     ->where('customer_po_master_id', $customerPoMasterId)
        //     ->select('wire_packing_number')
        //     ->groupBy('wire_packing_number')
        //     ->havingRaw(
        //         'COUNT(*) = COUNT(CASE WHEN wire_packing_status = ? THEN 1 END)',
        //         ['Completed']
        //     )
        //     ->orderBy('wire_packing_number')
        //     ->pluck('wire_packing_number')
        //     ->values();

        $completedPallets = WireMasterPacking::where('plant_id', $plant)
        ->whereIn('customer_po_master_id', $customerPoMasterIds)
        ->select('wire_packing_number')
        ->groupBy('wire_packing_number')
        ->havingRaw(
            'COUNT(*) = COUNT(CASE WHEN wire_packing_status = ? THEN 1 END)',
            ['Completed']
        )
        ->orderBy('wire_packing_number')
        ->pluck('wire_packing_number')
        ->values();

        $index = $completedPallets->search($pallet);

        $currentPalletNo = ($index !== false) ? $index + 1 : 0;

        $boxLabel = $currentPalletNo.'/'.$totalBoxes;

        $grossWeight = $items->sum('weight');
        $widthPt = 85 * 2.83465; // 85mm → points
        $heightPt = 100 * 2.83465; // 100mm → points

        $plantName = Plant::where('id', $plant)->value('name');

        $plantAddress = Plant::where('id', $plant)->value('address');

        $scannedAt = WireMasterPacking::where('plant_id', $plant)
        ->where('wire_packing_number', $pallet)
        ->value('scanned_at');

        $pdf = Pdf::loadView('pdf.wire-pallet', [
            'product' => 'Submersible Winding Wire',
            'plantName' => $plantName,
            'plantAddress' => $plantAddress,
            // 'monthYear' => now()->format('M-y'),
            'monthYear' => $scannedAt
                ? \Carbon\Carbon::parse($scannedAt)->format('M-y')
                : '',
            'branch' => '',
            'customerCode' => $customerCode,
            'customerName' => $customerName,
            'masterBox' => $boxLabel,
            'items' => $items,
            'grossWeight' => $grossWeight + 3.050,
            'netWeight' => $grossWeight,
            'pallet' => $pallet,
        ])->setPaper([0, 0, $widthPt, $heightPt], 'portrait');

        return $pdf->stream("Pallet-{$pallet}.pdf");

    }




    public function store(Request $request)
    {
        //
    }

    /**
     * Display the specified resource.
     */
    public function show(string $id)
    {
        //
    }

    /**
     * Update the specified resource in storage.
     */
    public function update(Request $request, string $id)
    {
        //
    }

    /**
     * Remove the specified resource from storage.
     */
    public function destroy(string $id)
    {
        //
    }
}
