/home2/mshostin/carnival.ms-hostingladz.com/app/Http/Controllers/OrderController.php
<?php

namespace App\Http\Controllers;

use Illuminate\Http\Request;
use Barryvdh\DomPDF\Facade\Pdf;
use App\Models\Order;
use App\Models\OrderShipping;
use App\Models\OrdersBilling;
use App\Models\Product;
use App\Models\User;
use Illuminate\Validation\Rule;
use App\Models\Cart;
use Illuminate\Support\Facades\Auth;
use App\Http\Controllers\PaymentController;

class OrderController extends Controller
{
    public function index(Request $request)
    {
        /** @var \App\Models\User|null $user */
        $user = Auth::user();

        $query = Order::with(['user', 'items.product', 'items.event.tickets', 'items.music', 'items.costume'])->latest();

        // If not admin → restrict orders to vendor’s products
        if (!$user->isAdmin()) {
            $query->whereHas('items.product', function ($q) use ($user) {
                $q->where('user_id', $user->id);
            });
        }

        // --- Filters ---
        if ($request->filled('search')) {
            $search = $request->search;
            $query->where(function ($q) use ($search) {
                $q->where('order_num', 'like', "%{$search}%")
                    ->orWhereHas('user', function ($sub) use ($search) {
                        $sub->where('name', 'like', "%{$search}%")
                            ->orWhere('email', 'like', "%{$search}%");
                    });
            });
        }

        if ($request->filled('payment')) {
            $query->where('payment_method', $request->payment);
        }

        if ($request->filled('status')) {
            $query->where('status', $request->status);
        }

        if ($request->filled('date_from')) {
            $query->whereDate('created_at', '>=', $request->date_from);
        }

        if ($request->filled('date_to')) {
            $query->whereDate('created_at', '<=', $request->date_to);
        }

        if (!$user->isAdmin()) {
            $query->whereHas('items', function ($q) use ($user) {
                $q->where(function ($sub) use ($user) {
                    $sub->whereHas('product', fn($q) => $q->where('user_id', $user->id))
                        ->orWhereHas('event', fn($q) => $q->where('user_id', $user->id))
                        ->orWhereHas('music', fn($q) => $q->where('user_id', $user->id))
                        ->orWhereHas('costume', fn($q) => $q->where('user_id', $user->id));
                });
            });
        }

        // --- Pagination ---
        $orders = $query->paginate(10);

        // --- AJAX check ---
        if ($request->ajax()) {
            return view('dashboard.admin.orders.partials.order_table', compact('orders'))->render();
        }

        return view('dashboard.admin.orders.index', compact('orders'));
    }

    public function store(Request $request)
    {
        $user_id = Auth::id();
        $cartItems = Cart::with(['product', 'event', 'music'])->where('user_id', $user_id)->get();

        if ($cartItems->isEmpty()) {
            return response()->json(['error' => 'Cart is empty'], 400);
        }

        // ✅ Calculate total dynamically based on type
        $total = 0;
        foreach ($cartItems as $cartItem) {
            $price = 0;

            if ($cartItem->type === 'product' && $cartItem->product) {
                $price = $cartItem->product->new_price;
            } elseif ($cartItem->type === 'event' && $cartItem->event) {
                $price = $cartItem->event->price;
            } elseif ($cartItem->type === 'music' && $cartItem->music) {
                $price = $cartItem->music->price;
            }

            $total += $price * $cartItem->quantity;
        }

        // ✅ Create the order
        $order = Order::create([
            'user_id' => $user_id,
            'order_num' => $this->generateOrderNumber(),
            'shipping_price' => $request->shipping_price,
            'payment_method' => $request->payment_method,
            'total_amount' => $total,
        ]);

        // ✅ Save billing
        OrdersBilling::create([
            'order_id' => $order->id,
            'first_name' => $request->first_name,
            'last_name' => $request->last_name,
            'company_name' => $request->company_name,
            'address' => $request->address,
            'email_address' => $request->email_address,
            'city' => $request->city,
            'state' => $request->state,
            'postal_code' => $request->postal_code,
            'country' => $request->country,
            'telephone' => $request->telephone,
            'fax' => $request->fax,
        ]);

        // ✅ Save shipping
        OrderShipping::create([
            'order_id' => $order->id,
            'first_name_1' => $request->first_name_1,
            'last_name_1' => $request->last_name_1,
            'company_name_1' => $request->company_name_1,
            'email_address_1' => $request->email_address_1,
            'address_1' => $request->address_1,
            'city_1' => $request->city_1,
            'state1' => $request->state1,
            'postal_code_1' => $request->postal_code_1,
            'country1' => $request->country1,
            'telephone_1' => $request->telephone_1,
            'fax_1' => $request->fax_1,
        ]);

        // ✅ Save order items dynamically
        foreach ($cartItems as $cartItem) {
            $price = 0;

            if ($cartItem->type === 'product' && $cartItem->product) {
                $price = $cartItem->product->new_price;
            } elseif ($cartItem->type === 'event' && $cartItem->event) {
                $price = $cartItem->event->price;
            } elseif ($cartItem->type === 'music' && $cartItem->music) {
                $price = $cartItem->music->price;
            }

            $order->items()->create([
                'product_id' => $cartItem->product_id,
                'type' => $cartItem->type,
                'quantity' => $cartItem->quantity,
                'price' => $price ?? 0,
            ]);
        }

        // ✅ Handle Stripe payment if payment method is 'card'
        if ($request->payment_method === 'card') {
            $paymentController = new PaymentController();
            $request->merge([
                'order_id' => $order->id,
                'stripeToken' => $request->stripeToken,
            ]);

            return $paymentController->splitPayment($request);
        }

        // ✅ Clear cart
        Cart::where('user_id', $user_id)->delete();

        return response()->json(['message' => 'Order created successfully', 'total' => $total]);
    }

    // public function store(Request $request)
    // {
    //     $user_id = Auth::id();
    //     $cartItems = Cart::with('product')->where('user_id', $user_id)->get();

    //     if ($cartItems->isEmpty()) {
    //         return response()->json(['error' => 'Cart is empty'], 400);
    //     }

    //     $total = 0;
    //     foreach ($cartItems as $cartItem) {
    //         $total += $cartItem->product->new_price * $cartItem->quantity;
    //     }

    //     $order = Order::create([
    //         'user_id' => $user_id,
    //         'order_num' => $this->generateOrderNumber(),
    //         'shipping_price' => $request->shipping_price,
    //         'payment_method' => $request->payment_method,
    //         'total_amount' => $total, // Set the total amount
    //     ]);
    //     $billing_data = [
    //         'order_id' => $order->id,
    //         'first_name' => $request->first_name,
    //         'last_name' => $request->last_name,
    //         'company_name' => $request->company_name,
    //         'address' => $request->address,
    //         'email_address' => $request->email_address,
    //         'city' => $request->city,
    //         'state' => $request->state,
    //         'postal_code' => $request->postal_code,
    //         'country' => $request->country,
    //         'telephone' => $request->telephone,
    //         'fax' => $request->fax,
    //     ];
    //     $order_billing = OrdersBilling::create($billing_data);
    //     $shipping_data = [
    //         'order_id' => $order->id,
    //         'first_name_1' => $request->first_name_1,
    //         'last_name_1' => $request->last_name_1,
    //         'company_name_1' => $request->company_name_1,
    //         'email_address_1' => $request->email_address_1,
    //         'address_1' => $request->address_1,
    //         'city_1' => $request->city_1,
    //         'state1' => $request->state1,
    //         'postal_code_1' => $request->postal_code_1,
    //         'country1' => $request->country1,
    //         'telephone_1' => $request->telephone_1,
    //         'fax_1' => $request->fax_1,
    //     ];
    //     $order_shipping = OrderShipping::create($shipping_data);
    //     foreach ($cartItems as $cartItem) {
    //         $order->items()->create([
    //             'product_id' => $cartItem->product_id,
    //             'quantity' => $cartItem->quantity,
    //             'price' => $cartItem->product->new_price,
    //         ]);
    //     }

    //     Cart::where('user_id', $user_id)->delete();

    //     return response()->json(['message' => 'Order created successfully', 'total' => $total]);
    // }

    public function show(Order $order)
    {
        $order->load([
            'user',
            'items.product.category',
            'items.product.subcategory',
            'items.product.brand',
            'items.product.features',
            'items.product.variants',
            'items.product.product_images',
            'shipping',
            'billing',
        ]);

        return view('dashboard.admin.orders.show', compact('order'));
    }

    public function generateOrderNumber()
    {
        $today = now()->format('mdY');

        do {
            $countToday = Order::whereDate('created_at', now()->toDateString())->count() + 1;
            $orderNumber = 'ORD-' . $today . '-' . str_pad($countToday, 4, '0', STR_PAD_LEFT);
        } while (Order::where('order_num', $orderNumber)->exists());

        return $orderNumber;
    }

    public function invoice($id)
    {
        $order = Order::with([
            'user',
            'items.product',
            'shipping',
            'billing'
        ])->findOrFail($id);

        return view('dashboard.admin.orders.invoice', compact('order'));
    }

    public function invoicePdf($id)
    {
        $order = Order::with([
            'user',
            'items.product',
            'shipping',
            'billing'
        ])->findOrFail($id);

        $pdf = Pdf::setOptions(['isRemoteEnabled' => true])
            ->loadView('dashboard.admin.orders.invoice', compact('order'));

        return $pdf->download("invoice-{$order->order_num}.pdf");
    }
}