<?php

namespace App\Http\Controllers\Api;

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

class RestaurantOrderController extends Controller
{
    /**
     * عرض جميع طلبات المطعم
     */
    public function index(Request $request): JsonResponse
    {
        try {
            $user = Auth::user();
            
            if (!$user) {
                return response()->json([
                    'success' => false,
                    'message' => 'يجب تسجيل الدخول أولاً'
                ], 401);
            }
            
            // الحصول على المطعم المرتبط بالمستخدم
            $restaurant = Restaurant::where('user_id', $user->id)->first();
            
            if (!$restaurant) {
                return response()->json([
                    'success' => false,
                    'message' => 'المطعم غير موجود'
                ], 404);
            }
            
            $query = FoodOrder::where('restaurant_id', $restaurant->id)
                ->with(['customer', 'orderItems.menuItem'])
                ->orderBy('created_at', 'desc');

            // فلترة حسب الحالة
            if ($request->has('status') && $request->status !== 'all') {
                $query->where('status', $request->status);
            }

            // فلترة حسب التاريخ
            if ($request->has('date_from')) {
                $query->whereDate('created_at', '>=', $request->date_from);
            }
            if ($request->has('date_to')) {
                $query->whereDate('created_at', '<=', $request->date_to);
            }

            $perPage = min((int) $request->get('per_page', 20), 100);
            $perPage = $perPage > 0 ? $perPage : 20;
            $orders = $query->paginate($perPage);

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

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

    /**
     * عرض الطلبات الواردة الجديدة
     */
    public function getIncomingOrders(Request $request): JsonResponse
    {
        try {
            $user = Auth::user();
            
            if (!$user) {
                return response()->json([
                    'success' => false,
                    'message' => 'يجب تسجيل الدخول أولاً'
                ], 401);
            }
            
            // الحصول على المطعم المرتبط بالمستخدم
            $restaurant = Restaurant::where('user_id', $user->id)->first();
            
            if (!$restaurant) {
                return response()->json([
                    'success' => false,
                    'message' => 'المطعم غير موجود'
                ], 404);
            }
            
            // الطلبات الواردة هي فقط الطلبات الجديدة (pending)
            $orders = FoodOrder::where('restaurant_id', $restaurant->id)
                ->where('status', 'pending')
                ->with(['customer', 'orderItems.menuItem'])
                ->orderBy('created_at', 'desc')
                ->get();

            return response()->json([
                'success' => true,
                'data' => $orders,
                'message' => 'تم جلب الطلبات الواردة بنجاح'
            ], 200, [], JSON_UNESCAPED_UNICODE);

        } catch (\Exception $e) {
            return response()->json([
                'success' => false,
                'message' => 'حدث خطأ أثناء جلب الطلبات الواردة',
                'error' => $e->getMessage()
            ], 500);
        }
    }

    /**
     * عرض الطلبات المكتملة
     */
    public function getCompletedOrders(Request $request): JsonResponse
    {
        try {
            $user = Auth::user();
            
            if (!$user) {
                return response()->json([
                    'success' => false,
                    'message' => 'يجب تسجيل الدخول أولاً'
                ], 401);
            }
            
            // الحصول على المطعم المرتبط بالمستخدم
            $restaurant = Restaurant::where('user_id', $user->id)->first();
            
            if (!$restaurant) {
                return response()->json([
                    'success' => false,
                    'message' => 'المطعم غير موجود'
                ], 404);
            }
            
            // الطلبات المكتملة هي الطلبات التي تم توصيلها
            $orders = FoodOrder::where('restaurant_id', $restaurant->id)
                ->where('status', 'delivered')
                ->with(['customer', 'orderItems.menuItem'])
                ->orderBy('created_at', 'desc')
                ->get();

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

        } catch (\Exception $e) {
            return response()->json([
                'success' => false,
                'message' => 'حدث خطأ أثناء جلب الطلبات المكتملة',
                'error' => $e->getMessage()
            ], 500);
        }
    }

    /**
     * عرض تفاصيل طلب معين
     */
    public function show(Request $request, $id): JsonResponse
    {
        try {
            $user = Auth::user();
            
            if (!$user) {
                return response()->json([
                    'success' => false,
                    'message' => 'يجب تسجيل الدخول أولاً'
                ], 401);
            }
            
            // الحصول على المطعم المرتبط بالمستخدم
            $restaurant = Restaurant::where('user_id', $user->id)->first();
            
            if (!$restaurant) {
                return response()->json([
                    'success' => false,
                    'message' => 'المطعم غير موجود'
                ], 404);
            }
            
            $order = FoodOrder::where('id', $id)
                ->where('restaurant_id', $restaurant->id)
                ->with(['customer', 'orderItems.menuItem'])
                ->first();

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

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

        } catch (\Exception $e) {
            return response()->json([
                'success' => false,
                'message' => 'حدث خطأ أثناء جلب تفاصيل الطلب',
                'error' => $e->getMessage()
            ], 500);
        }
    }

    /**
     * قبول طلب
     */
    public function acceptOrder(Request $request, $id): JsonResponse
    {
        \Log::info('Accept order called for ID: ' . $id);
        
        try {
            $user = Auth::user();
            
            if (!$user) {
                return response()->json([
                    'success' => false,
                    'message' => 'يجب تسجيل الدخول أولاً'
                ], 401);
            }
            
            // الحصول على المطعم المرتبط بالمستخدم
            $restaurant = Restaurant::where('user_id', $user->id)->first();
            
            if (!$restaurant) {
                return response()->json([
                    'success' => false,
                    'message' => 'المطعم غير موجود'
                ], 404);
            }
            
            \Log::info('Using restaurant: ' . $restaurant->id);
            
            $order = FoodOrder::where('id', $id)
                ->where('restaurant_id', $restaurant->id)
                ->first();
            
            \Log::info('Order found: ' . ($order ? $order->id : 'null'));
            \Log::info('Order status: ' . ($order ? $order->status : 'null'));

            if (!$order) {
                \Log::error('Order not found for ID: ' . $id);
                return response()->json([
                    'success' => false,
                    'message' => 'الطلب غير موجود'
                ], 404);
            }

            if ($order->status !== 'pending') {
                \Log::error('Order status is not pending: ' . $order->status);
                return response()->json([
                    'success' => false,
                    'message' => 'لا يمكن قبول الطلب في هذه المرحلة'
                ], 400);
            }

            DB::beginTransaction();

            $order->update([
                'status' => 'confirmed',
                'confirmed_at' => now(),
            ]);

            DB::commit();
            
            \Log::info('Order accepted successfully: ' . $order->id);

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

        } catch (\Exception $e) {
            DB::rollBack();
            
            \Log::error('Error accepting order: ' . $e->getMessage());
            \Log::error('Stack trace: ' . $e->getTraceAsString());
            
            return response()->json([
                'success' => false,
                'message' => 'حدث خطأ أثناء قبول الطلب',
                'error' => $e->getMessage()
            ], 500);
        }
    }

    /**
     * رفض طلب
     */
    public function rejectOrder(Request $request, $id): JsonResponse
    {
        $request->validate([
            'reason' => 'nullable|string|max:500',
        ]);

        try {
            $user = Auth::user();
            
            if (!$user) {
                return response()->json([
                    'success' => false,
                    'message' => 'يجب تسجيل الدخول أولاً'
                ], 401);
            }
            
            // الحصول على المطعم المرتبط بالمستخدم
            $restaurant = Restaurant::where('user_id', $user->id)->first();
            
            if (!$restaurant) {
                return response()->json([
                    'success' => false,
                    'message' => 'المطعم غير موجود'
                ], 404);
            }
            
            $order = FoodOrder::where('id', $id)
                ->where('restaurant_id', $restaurant->id)
                ->first();

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

            if (!in_array($order->status, ['pending', 'confirmed'])) {
                return response()->json([
                    'success' => false,
                    'message' => 'لا يمكن رفض الطلب في هذه المرحلة'
                ], 400);
            }

            DB::beginTransaction();

            $order->update([
                'status' => 'rejected',
                'rejected_at' => now(),
                'rejection_reason' => $request->reason,
            ]);

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

            DB::commit();

            return response()->json([
                'success' => true,
                'message' => 'تم رفض الطلب بنجاح'
            ], 200, [], JSON_UNESCAPED_UNICODE);

        } catch (\Exception $e) {
            DB::rollBack();
            
            return response()->json([
                'success' => false,
                'message' => 'حدث خطأ أثناء رفض الطلب',
                'error' => $e->getMessage()
            ], 500);
        }
    }

    /**
     * تحديث حالة الطلب
     */
    public function updateOrderStatus(Request $request, $id): JsonResponse
    {
        // Log the incoming request for debugging
        \Log::info('Update Order Status Request', [
            'order_id' => $id,
            'status' => $request->status,
            'status_type' => gettype($request->status),
            'all_data' => $request->all(),
        ]);
        
        $validStatuses = ['pending', 'confirmed', 'preparing', 'ready', 'picked_up', 'on_way', 'delivered', 'cancelled', 'rejected'];
        
        $request->validate([
            'status' => [
                'required',
                function ($attribute, $value, $fail) use ($validStatuses) {
                    if (!in_array($value, $validStatuses)) {
                        \Log::error('Invalid status value', [
                            'received' => $value,
                            'type' => gettype($value),
                            'valid_statuses' => $validStatuses,
                        ]);
                        $fail("The status must be one of: " . implode(', ', $validStatuses) . ". Received: " . var_export($value, true));
                    }
                },
            ],
        ], [
            'status.required' => 'حالة الطلب مطلوبة',
        ]);

        try {
            $user = Auth::user();
            
            if (!$user) {
                return response()->json([
                    'success' => false,
                    'message' => 'يجب تسجيل الدخول أولاً'
                ], 401);
            }
            
            // الحصول على المطعم المرتبط بالمستخدم
            $restaurant = Restaurant::where('user_id', $user->id)->first();
            
            if (!$restaurant) {
                return response()->json([
                    'success' => false,
                    'message' => 'المطعم غير موجود'
                ], 404);
            }
            
            $order = FoodOrder::where('id', $id)
                ->where('restaurant_id', $restaurant->id)
                ->first();

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

            $oldStatus = $order->status;
            $newStatus = $request->status;

            // التحقق من صحة الانتقال بين الحالات
            if (!$this->isValidStatusTransition($oldStatus, $newStatus)) {
                return response()->json([
                    'success' => false,
                    'message' => 'لا يمكن الانتقال من الحالة ' . $this->getStatusName($oldStatus) . ' إلى ' . $this->getStatusName($newStatus)
                ], 400);
            }

            DB::beginTransaction();

            $updateData = ['status' => $newStatus];

            // إضافة timestamps للحالات المختلفة
            switch ($newStatus) {
                case 'confirmed':
                    $updateData['confirmed_at'] = now();
                    break;
                case 'preparing':
                    $updateData['preparing_at'] = now();
                    break;
                case 'ready':
                    $updateData['ready_at'] = now();
                    break;
                case 'picked_up':
                    $updateData['picked_up_at'] = now();
                    break;
                case 'delivered':
                    $updateData['delivered_at'] = now();
                    break;
            }

            $order->update($updateData);

            // حساب أجر التطبيق عند التوصيل
            if ($newStatus === 'delivered' && !$order->platform_fee_calculated) {
                try {
                    \App\Services\PlatformFeeService::calculateAndSaveForFoodOrder($order->fresh());
                } catch (\Exception $e) {
                    \Log::error('خطأ في حساب أجر التطبيق: ' . $e->getMessage());
                    // لا نوقف العملية إذا فشل حساب الأجر
                }
            }

            // حساب أرباح الإحالات عند التوصيل
            if ($newStatus === 'delivered') {
                try {
                    $customer = $order->customer;
                    if ($customer) {
                        // البحث عن الإحالة المرتبطة بهذا المستخدم
                        $referral = \App\Models\Referral::where('referred_id', $customer->id)
                            ->where('status', 'completed')
                            ->first();

                        if ($referral) {
                            // التحقق من عدم وجود سجل ربح سابق لهذا الطلب
                            $existingEarning = \App\Models\ReferralEarning::where('order_type', 'food')
                                ->where('order_id', $order->id)
                                ->first();

                            if (!$existingEarning) {
                                // إنشاء سجل ربح جديد
                                \App\Models\ReferralEarning::createFromOrder(
                                    $referral,
                                    'food',
                                    $order->id,
                                    $order->order_number,
                                    $order->total
                                );
                            }
                        }
                    }
                } catch (\Exception $e) {
                    \Log::error('خطأ في حساب أرباح الإحالات: ' . $e->getMessage());
                    // لا نوقف العملية إذا فشل حساب الأرباح
                }
            }

            if ($newStatus === 'delivered') {
                try {
                    $fresh = $order->fresh();
                    PromotionalWheelService::onOrderCompleted('food', (int) $fresh->id, (float) $fresh->total);
                } catch (\Throwable $e) {
                    \Log::error('PromotionalWheelService food: '.$e->getMessage());
                }
            }

            DB::commit();

            return response()->json([
                'success' => true,
                'message' => 'تم تحديث حالة الطلب بنجاح'
            ], 200, [], JSON_UNESCAPED_UNICODE);

        } catch (\Exception $e) {
            DB::rollBack();
            
            return response()->json([
                'success' => false,
                'message' => 'حدث خطأ أثناء تحديث حالة الطلب',
                'error' => $e->getMessage()
            ], 500);
        }
    }

    /**
     * التحقق من صحة الانتقال بين الحالات
     */
    private function isValidStatusTransition($oldStatus, $newStatus): bool
    {
        $validTransitions = [
            'pending' => ['confirmed', 'rejected', 'cancelled'],
            'confirmed' => ['preparing', 'rejected', 'cancelled'],
            'preparing' => ['ready', 'cancelled'],
            'ready' => ['picked_up', 'cancelled'],
            'picked_up' => ['delivered', 'cancelled'],
            'on_way' => ['delivered', 'cancelled'],
            'delivered' => [],
            'rejected' => [],
            'cancelled' => [],
        ];

        return in_array($newStatus, $validTransitions[$oldStatus] ?? []);
    }

    /**
     * الحصول على اسم الحالة بالعربية
     */
    private function getStatusName($status): string
    {
        $statusNames = [
            'pending' => 'في انتظار التأكيد',
            'confirmed' => 'مؤكد',
            'preparing' => 'قيد الإعداد',
            'ready' => 'جاهز',
            'picked_up' => 'تم الاستلام من المطعم',
            'on_way' => 'في الطريق',
            'delivered' => 'تم التوصيل',
            'rejected' => 'مرفوض',
            'cancelled' => 'ملغي',
        ];

        return $statusNames[$status] ?? $status;
    }
}
