<?php

namespace App\Http\Controllers\Api;

use App\Http\Controllers\Controller;
use App\Models\FoodOrder;
use App\Models\FoodOrderItem;
use App\Models\Restaurant;
use App\Models\MenuItem;
use Illuminate\Http\Request;
use Illuminate\Http\JsonResponse;
use Illuminate\Support\Facades\Auth;
use Illuminate\Support\Facades\DB;
use Illuminate\Support\Facades\Schema;

class OrderController extends Controller
{
    /**
     * إنشاء طلب طعام جديد
     */
    public function store(Request $request): JsonResponse
    {
        $request->validate([
            'restaurant_id' => 'required|exists:restaurants,id',
            'items' => 'required|array|min:1',
            'items.*.menu_item_id' => 'required|exists:menu_items,id',
            'items.*.quantity' => 'required|integer|min:1',
            'items.*.special_instructions' => 'nullable|string|max:500',
            'delivery_address' => 'required|string',
            'delivery_latitude' => 'nullable|numeric',
            'delivery_longitude' => 'nullable|numeric',
            'preferred_delivery_time' => 'nullable|date|after:now',
            'payment_method' => 'required|in:cash,card,online',
            'notes' => 'nullable|string|max:1000',
            'special_instructions' => 'nullable|string|max:1000',
        ]);

        try {
            DB::beginTransaction();

            $user = Auth::user();
            $restaurant = Restaurant::findOrFail($request->restaurant_id);

            // التأكد من أن المطعم مفتوح
            if (!$restaurant->is_open) {
                return response()->json([
                    'success' => false,
                    'message' => 'المطعم مغلق حالياً'
                ], 400);
            }

            $items = $request->items;
            $subtotal = 0;
            $deliveryFee = $this->calculateDeliveryFee($request->delivery_latitude, $request->delivery_longitude);
            $tax = 0.15; // ضريبة 15%

            // حساب المجموع الفرعي والتحقق من المخزون
            foreach ($items as $item) {
                $menuItem = MenuItem::find($item['menu_item_id']);

                if (!$menuItem) {
                    return response()->json([
                        'success' => false,
                        'message' => 'الوجبة المطلوبة غير موجودة'
                    ], 400);
                }

                if (!$menuItem->is_available) {
                    return response()->json([
                        'success' => false,
                        'message' => "الوجبة {$menuItem->name} غير متاحة حالياً"
                    ], 400);
                }

                // التحقق من المخزون فقط إذا كان الحقل موجوداً في قاعدة البيانات وليس null
                if (Schema::hasColumn('menu_items', 'stock_quantity')) {
                    $stockQuantity = $menuItem->getAttribute('stock_quantity');
                    if ($stockQuantity !== null && $stockQuantity < $item['quantity']) {
                        return response()->json([
                            'success' => false,
                            'message' => "الكمية المطلوبة من {$menuItem->name} غير متوفرة في المخزون"
                        ], 400);
                    }
                }

                $subtotal += $menuItem->price * $item['quantity'];
            }

            $taxAmount = $subtotal * $tax;
            $total = $subtotal + $deliveryFee + $taxAmount;

            // إنشاء الطلب
            $order = FoodOrder::create([
                'customer_id' => $user->id,
                'restaurant_id' => $restaurant->id,
                'order_number' => 'FOOD-' . time() . '-' . $user->id,
                'subtotal' => $subtotal,
                'delivery_fee' => $deliveryFee,
                'tax' => $taxAmount,
                'total' => $total,
                'delivery_address' => $request->delivery_address,
                'delivery_latitude' => $request->delivery_latitude,
                'delivery_longitude' => $request->delivery_longitude,
                'preferred_delivery_time' => $request->preferred_delivery_time,
                'notes' => $request->notes ?? $request->special_instructions,
                'payment_method' => $request->payment_method,
                'status' => 'pending',
            ]);

            // إنشاء تفاصيل الطلب
            foreach ($items as $item) {
                $menuItem = MenuItem::find($item['menu_item_id']);

                FoodOrderItem::create([
                    'food_order_id' => $order->id,
                    'menu_item_id' => $menuItem->id,
                    'quantity' => $item['quantity'],
                    'unit_price' => $menuItem->price,
                    'total_price' => $menuItem->price * $item['quantity'],
                    'special_instructions' => $item['special_instructions'] ?? null,
                ]);

                // تحديث المخزون فقط إذا كان الحقل موجوداً في قاعدة البيانات
                if (Schema::hasColumn('menu_items', 'stock_quantity')) {
                    $menuItem->decrement('stock_quantity', $item['quantity']);
                }
            }

            DB::commit();

            $order->load(['restaurant', 'orderItems.menuItem']);

            return response()->json([
                'success' => true,
                'message' => 'تم إنشاء طلب الطعام بنجاح',
                'data' => $order
            ], 201);

        } catch (\Exception $e) {
            DB::rollBack();

            return response()->json([
                'success' => false,
                'message' => 'حدث خطأ أثناء إنشاء الطلب',
                'error' => $e->getMessage()
            ], 500);
        }
    }

    /**
     * عرض طلبات المستخدم
     */
    public function myOrders(): JsonResponse
    {
        $user = Auth::user();
        $orders = $user->foodOrders()
            ->with(['restaurant', 'orderItems.menuItem'])
            ->orderBy('created_at', 'desc')
            ->paginate(20);

        return response()->json([
            'success' => true,
            'data' => $orders,
            'message' => 'تم جلب طلباتك بنجاح'
        ]);
    }

    /**
     * عرض طلب معين
     */
    public function show(FoodOrder $foodOrder): JsonResponse
    {
        // التأكد من أن المستخدم يملك الطلب
        if ($foodOrder->customer_id !== Auth::id()) {
            return response()->json([
                'success' => false,
                'message' => 'غير مصرح لك بعرض هذا الطلب'
            ], 403);
        }

        $foodOrder->load(['restaurant', 'orderItems.menuItem']);

        return response()->json([
            'success' => true,
            'data' => $foodOrder,
            'message' => 'تم جلب بيانات الطلب بنجاح'
        ]);
    }

    /**
     * إلغاء طلب
     */
    public function cancel(FoodOrder $foodOrder): JsonResponse
    {
        // التأكد من أن المستخدم يملك الطلب
        if ($foodOrder->customer_id !== Auth::id()) {
            return response()->json([
                'success' => false,
                'message' => 'غير مصرح لك بإلغاء هذا الطلب'
            ], 403);
        }

        // التأكد من أن الطلب يمكن إلغاؤه
        if (!in_array($foodOrder->status, ['pending', 'confirmed'])) {
            return response()->json([
                'success' => false,
                'message' => 'لا يمكن إلغاء الطلب في هذه المرحلة'
            ], 400);
        }

        try {
            DB::beginTransaction();

            $foodOrder->update(['status' => 'cancelled']);

            // إعادة المخزون
            foreach ($foodOrder->orderItems as $item) {
                $item->menuItem->increment('stock_quantity', $item->quantity);
            }

            DB::commit();

            return response()->json([
                'success' => true,
                'message' => 'تم إلغاء الطلب بنجاح'
            ]);

        } catch (\Exception $e) {
            DB::rollBack();

            return response()->json([
                'success' => false,
                'message' => 'حدث خطأ أثناء إلغاء الطلب',
                'error' => $e->getMessage()
            ], 500);
        }
    }

    /**
     * تقييم الطلب
     */
    public function rate(Request $request, FoodOrder $foodOrder): JsonResponse
    {
        $request->validate([
            'rating' => 'required|numeric|min:1|max:5',
            'feedback' => 'nullable|string|max:500',
        ]);

        // التأكد من أن المستخدم يملك الطلب
        if ($foodOrder->customer_id !== Auth::id()) {
            return response()->json([
                'success' => false,
                'message' => 'غير مصرح لك بتقييم هذا الطلب'
            ], 403);
        }

        // التأكد من أن الطلب مكتمل
        if ($foodOrder->status !== 'delivered') {
            return response()->json([
                'success' => false,
                'message' => 'يمكن تقييم الطلب بعد اكتماله فقط'
            ], 400);
        }

        $foodOrder->update([
            'customer_rating' => $request->rating,
            'customer_feedback' => $request->feedback,
        ]);

        return response()->json([
            'success' => true,
            'message' => 'تم تقييم الطلب بنجاح'
        ]);
    }

    /**
     * تتبع حالة الطلب
     */
    public function track(FoodOrder $foodOrder): JsonResponse
    {
        // التأكد من أن المستخدم يملك الطلب
        if ($foodOrder->customer_id !== Auth::id()) {
            return response()->json([
                'success' => false,
                'message' => 'غير مصرح لك بتتبع هذا الطلب'
            ], 403);
        }

        $statusInfo = $this->getStatusInfo($foodOrder->status);

        return response()->json([
            'success' => true,
            'data' => [
                'order_id' => $foodOrder->id,
                'order_number' => $foodOrder->order_number,
                'status' => $foodOrder->status,
                'status_info' => $statusInfo,
                'estimated_delivery_time' => $foodOrder->estimated_delivery_time,
                'created_at' => $foodOrder->created_at,
                'updated_at' => $foodOrder->updated_at,
            ],
            'message' => 'تم جلب حالة الطلب بنجاح'
        ]);
    }

    /**
     * حساب رسوم التوصيل
     */
    private function calculateDeliveryFee($latitude, $longitude): float
    {
        // حساب بسيط لرسوم التوصيل بناءً على المسافة
        // يمكن تطوير هذا ليكون أكثر دقة
        $baseFee = 15.00;
        $perKmFee = 2.00;

        // هنا يمكن إضافة حساب المسافة الفعلي
        // للتبسيط نستخدم رسوم ثابتة
        return $baseFee;
    }

    /**
     * معلومات حالة الطلب
     */
    private function getStatusInfo($status): array
    {
        $statuses = [
            'pending' => [
                'title' => 'في انتظار التأكيد',
                'description' => 'تم استلام طلبك وسيتم تأكيده قريباً',
                'icon' => 'clock',
                'color' => 'warning'
            ],
            'confirmed' => [
                'title' => 'تم التأكيد',
                'description' => 'تم تأكيد طلبك وسيتم إعداده قريباً',
                'icon' => 'check-circle',
                'color' => 'info'
            ],
            'preparing' => [
                'title' => 'قيد الإعداد',
                'description' => 'طلبك قيد الإعداد في المطبخ',
                'icon' => 'utensils',
                'color' => 'primary'
            ],
            'ready' => [
                'title' => 'جاهز للتوصيل',
                'description' => 'طلبك جاهز وسيتم إرسال مندوب التوصيل قريباً',
                'icon' => 'shipping-fast',
                'color' => 'success'
            ],
            'on_way' => [
                'title' => 'في الطريق',
                'description' => 'مندوب التوصيل في طريقه إليك',
                'icon' => 'truck',
                'color' => 'info'
            ],
            'delivered' => [
                'title' => 'تم التوصيل',
                'description' => 'تم توصيل طلبك بنجاح',
                'icon' => 'check-double',
                'color' => 'success'
            ],
            'cancelled' => [
                'title' => 'تم الإلغاء',
                'description' => 'تم إلغاء طلبك',
                'icon' => 'times-circle',
                'color' => 'danger'
            ],
        ];

        return $statuses[$status] ?? [
            'title' => 'غير معروف',
            'description' => 'حالة غير معروفة',
            'icon' => 'question',
            'color' => 'secondary'
        ];
    }
}
