<?php

namespace App\Http\Controllers;

use App\Events\OrderPacked;
use App\Models\Order;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Auth;
use Illuminate\Support\Facades\Log;

class PackingController extends Controller
{
    /**
     * Confirm order packing with dimensions and weight
     * 
     * POST /orders/{id}/pack
     * POST /custom-orders/{id}/pack
     */
    public function confirmPacked(Request $request, Order $order)
    {
        // Validate packing input
        $validated = $request->validate([
            'width' => 'required|numeric|min:0.01',
            'length' => 'required|numeric|min:0.01',
            'weight' => 'required|numeric|min:0.01',
        ]);

        // Check: Order must exist and not already be packed
        if (! $order) {
            return response()->json(['error' => 'Order not found'], 404);
        }

        if ($order->packing_completed_at !== null) {
            return response()->json(['error' => 'Order already packed'], 409);
        }

        // Check: Order must be in Inspection state
        if ($order->status !== 'inspection') {
            return response()->json([
                'error' => 'Order must be in Inspection state before packing',
                'current_status' => $order->status,
            ], 409);
        }

        try {
            // Save packing data
            $order->update([
                'packing_width' => $validated['width'],
                'packing_length' => $validated['length'],
                'packing_weight' => $validated['weight'],
                'packing_completed_at' => now(),
                'packed_by' => Auth::id(),
                'status' => 'packing',
            ]);

            Log::info('Order packed', [
                'order_id' => $order->id,
                'width' => $validated['width'],
                'length' => $validated['length'],
                'weight' => $validated['weight'],
                'packed_by' => Auth::id(),
            ]);

            // Emit event to trigger Trello update, Slack notification
            OrderPacked::dispatch(
                $order,
                (float) $validated['width'],
                (float) $validated['length'],
                (float) $validated['weight'],
                Auth::id(),
            );

            return response()->json([
                'success' => true,
                'message' => 'Order packed successfully',
                'order_id' => $order->id,
                'packing_completed_at' => $order->packing_completed_at,
                'dimensions' => [
                    'width' => $validated['width'],
                    'length' => $validated['length'],
                    'weight' => $validated['weight'],
                ],
            ]);
        } catch (\Exception $e) {
            Log::error('Error packing order', [
                'order_id' => $order->id,
                'error' => $e->getMessage(),
            ]);

            return response()->json([
                'error' => 'Failed to pack order',
                'message' => $e->getMessage(),
            ], 500);
        }
    }
}
