<?php

namespace App\Http\Controllers\Api;

use App\Http\Controllers\Controller;
use App\Models\GasOrder;
use App\Models\GasOrderItem;
use App\Models\GasOffice;
use App\Models\GasCylinder;
use App\Models\User;
use App\Models\UserShoppingActivity;
use Carbon\Carbon;
use Illuminate\Http\Request;
use Illuminate\Http\JsonResponse;
use Illuminate\Support\Facades\DB;
use Illuminate\Support\Str;
use App\Services\PromotionalWheelService;

class GasOrderController extends Controller
{
    /**
     * عرض طلبات الغاز للمستخدم
     */
    public function index(Request $request): JsonResponse
    {
        try {
            $userId = $request->user_id ?? auth()->id();
            
            if (!$userId) {
                return response()->json([
                    'success' => false,
                    'data' => [],
                    'message' => 'معرف المستخدم مطلوب'
                ], 400);
            }

            $orders = GasOrder::with(['orderItems', 'gasOffice'])
                ->where('customer_id', $userId)
                ->orderBy('created_at', 'desc')
                ->get();

            // تحويل البيانات إلى الصيغة المطلوبة
            $formattedOrders = $orders->map(function ($order) {
                return [
                    'id' => $order->id,
                    'customer_id' => $order->customer_id,
                    'driver_id' => $order->driver_id,
                    'order_number' => $order->order_number,
                    'subtotal' => $order->subtotal,
                    'delivery_fee' => $order->delivery_fee,
                    'tax' => $order->tax,
                    'total' => $order->total,
                    'delivery_address' => $order->delivery_address,
                    'delivery_latitude' => $order->delivery_latitude,
                    'delivery_longitude' => $order->delivery_longitude,
                    'status' => $order->status,
                    'preferred_delivery_time' => $order->preferred_delivery_time,
                    'actual_delivery_time' => $order->actual_delivery_time,
                    'special_instructions' => $order->special_instructions,
                    'payment_method' => $order->payment_method,
                    'payment_status' => $order->payment_status,
                    'is_urgent' => $order->is_urgent,
                    'customer_rating' => $order->customer_rating,
                    'customer_feedback' => $order->customer_feedback,
                    'gas_office_id' => $order->gas_office_id,
                    'wheel_milestone_pending' => (bool) ($order->wheel_milestone_pending ?? false),
                    'wheel_promo_fee_amount' => $order->wheel_promo_fee_amount,
                    'wheel_result' => $order->wheel_result,
                    'wheel_spun_at' => $order->wheel_spun_at?->toISOString(),
                    'created_at' => $order->created_at->toISOString(),
                    'updated_at' => $order->updated_at->toISOString(),
                    'order_items' => $order->orderItems->map(function ($item) {
                        return [
                            'id' => $item->id,
                            'gas_order_id' => $item->gas_order_id,
                            'gas_cylinder_id' => $item->gas_cylinder_id,
                            'quantity' => $item->quantity,
                            'unit_price' => $item->unit_price,
                            'total_price' => $item->total_price,
                            'special_instructions' => $item->special_instructions,
                            'created_at' => $item->created_at->toISOString(),
                            'updated_at' => $item->updated_at->toISOString(),
                        ];
                    }),
                    'gas_office' => $order->gasOffice ? [
                        'id' => $order->gasOffice->id,
                        'name' => $order->gasOffice->name,
                        'description' => $order->gasOffice->description,
                        'address' => $order->gasOffice->address,
                        'phone' => $order->gasOffice->phone,
                        'email' => $order->gasOffice->email,
                    ] : null,
                ];
            });

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

        } catch (\Exception $e) {
            return response()->json([
                'success' => false,
                'data' => [],
                'message' => 'خطأ في جلب طلبات الغاز: ' . $e->getMessage()
            ], 500);
        }
    }

    /**
     * إنشاء طلب غاز جديد
     */
    public function store(Request $request): JsonResponse
    {
        try {
            $request->validate([
                'gas_office_id' => 'required|exists:gas_offices,id',
                'customer_id' => 'required|exists:users,id',
                'delivery_address' => 'required|string|max:500',
                'delivery_latitude' => 'nullable|numeric',
                'delivery_longitude' => 'nullable|numeric',
                'items' => 'required|array|min:1',
                'items.*.cylinder_id' => 'required|exists:gas_cylinders,id',
                'items.*.quantity' => 'required|integer|min:1',
                'special_instructions' => 'nullable|string|max:1000',
                'preferred_delivery_time' => 'nullable|date',
                'payment_method' => 'required|in:cash,card,online',
                'is_urgent' => 'boolean',
            ]);

            DB::beginTransaction();

            // التحقق من وجود مكتب الغاز
            $gasOffice = GasOffice::find($request->gas_office_id);
            if (!$gasOffice || !$gasOffice->is_active) {
                return response()->json([
                    'success' => false,
                    'data' => null,
                    'message' => 'مكتب الغاز غير متاح'
                ], 400);
            }

            // حساب المجموع
            $subtotal = 0;
            $items = [];

            foreach ($request->items as $item) {
                $cylinder = GasCylinder::find($item['cylinder_id']);
                
                if (!$cylinder || !$cylinder->is_available || $cylinder->stock_quantity < $item['quantity']) {
                    return response()->json([
                        'success' => false,
                        'data' => null,
                        'message' => "قنينة الغاز {$cylinder->name} غير متاحة أو الكمية غير كافية"
                    ], 400);
                }

                $itemTotal = $cylinder->price * $item['quantity'];
                $subtotal += $itemTotal;

                $items[] = [
                    'cylinder_id' => $cylinder->id,
                    'cylinder_name' => $cylinder->name,
                    'price' => $cylinder->price,
                    'quantity' => $item['quantity'],
                    'total' => $itemTotal,
                ];
            }

            $deliveryFee = $gasOffice->delivery_fee;
            $tax = 0; // يمكن إضافة حساب الضريبة لاحقاً
            $total = $subtotal + $deliveryFee + $tax;

            // التحقق من الحد الأدنى للطلب
            if ($total < $gasOffice->minimum_order) {
                return response()->json([
                    'success' => false,
                    'data' => null,
                    'message' => "الحد الأدنى للطلب هو {$gasOffice->minimum_order} د.ع"
                ], 400);
            }

            // إنشاء الطلب
            $order = GasOrder::create([
                'customer_id' => $request->customer_id,
                'order_number' => 'GO-' . str_pad(rand(1, 999999), 6, '0', STR_PAD_LEFT),
                'subtotal' => $subtotal,
                'delivery_fee' => $deliveryFee,
                'tax' => $tax,
                'total' => $total,
                'delivery_address' => $request->delivery_address,
                'delivery_latitude' => $request->delivery_latitude,
                'delivery_longitude' => $request->delivery_longitude,
                'status' => 'pending',
                'preferred_delivery_time' => $request->preferred_delivery_time,
                'special_instructions' => $request->special_instructions,
                'payment_method' => $request->payment_method,
                'payment_status' => 'pending',
                'is_urgent' => $request->is_urgent ?? false,
                'gas_office_id' => $request->gas_office_id,
            ]);

            // إنشاء عناصر الطلب
            foreach ($items as $item) {
                GasOrderItem::create([
                    'gas_order_id' => $order->id,
                    'gas_cylinder_id' => $item['cylinder_id'],
                    'quantity' => $item['quantity'],
                    'unit_price' => $item['price'],
                    'total_price' => $item['total'],
                ]);

                // تحديث المخزون
                $cylinder = GasCylinder::find($item['cylinder_id']);
                $cylinder->decrement('stock_quantity', $item['quantity']);
            }

            DB::commit();

            // تسجيل يوم التسوق لسجل الهدايا (أيام متتالية)
            UserShoppingActivity::firstOrCreate([
                'user_id' => $order->customer_id,
                'activity_date' => Carbon::today(),
            ]);

            // جلب الطلب مع العلاقات
            $order->load(['orderItems', 'gasOffice']);

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

        } catch (\Exception $e) {
            DB::rollBack();
            return response()->json([
                'success' => false,
                'data' => null,
                'message' => 'خطأ في إنشاء الطلب: ' . $e->getMessage()
            ], 500);
        }
    }

    /**
     * عرض تفاصيل طلب معين
     */
    public function show(int $id): JsonResponse
    {
        try {
            $order = GasOrder::with(['orderItems', 'gasOffice', 'customer'])
                ->find($id);

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

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

        } catch (\Exception $e) {
            return response()->json([
                'success' => false,
                'data' => null,
                'message' => 'خطأ في جلب تفاصيل الطلب: ' . $e->getMessage()
            ], 500);
        }
    }

    /**
     * تحديث حالة الطلب
     */
    public function updateStatus(Request $request, int $id): JsonResponse
    {
        try {
            $request->validate([
                'status' => 'required|in:pending,confirmed,preparing,picked_up,delivered,cancelled',
            ]);

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

            $order->update([
                'status' => $request->status,
                'actual_delivery_time' => $request->status === 'delivered' ? now() : null,
            ]);

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

            // حساب أرباح الإحالات عند التوصيل
            if ($request->status === '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', 'gas')
                                ->where('order_id', $order->id)
                                ->first();

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

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

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

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

    /**
     * إلغاء الطلب
     */
    public function cancel(int $id): JsonResponse
    {
        try {
            $order = GasOrder::find($id);
            
            if (!$order) {
                return response()->json([
                    'success' => false,
                    'data' => null,
                    'message' => 'الطلب غير موجود'
                ], 404);
            }

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

            DB::beginTransaction();

            // إرجاع المخزون
            foreach ($order->orderItems as $item) {
                $cylinder = GasCylinder::find($item->gas_cylinder_id);
                if ($cylinder) {
                    $cylinder->increment('stock_quantity', $item->quantity);
                }
            }

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

            DB::commit();

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

        } catch (\Exception $e) {
            DB::rollBack();
            return response()->json([
                'success' => false,
                'data' => null,
                'message' => 'خطأ في إلغاء الطلب: ' . $e->getMessage()
            ], 500);
        }
    }

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

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

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

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

            // تحديث تقييم مكتب الغاز
            $gasOffice = $order->gasOffice;
            if ($gasOffice) {
                $totalRating = $gasOffice->orders()
                    ->where('status', 'delivered')
                    ->whereNotNull('customer_rating')
                    ->sum('customer_rating');
                
                $ratingCount = $gasOffice->orders()
                    ->where('status', 'delivered')
                    ->whereNotNull('customer_rating')
                    ->count();

                $gasOffice->update([
                    'rating' => $ratingCount > 0 ? $totalRating / $ratingCount : 0,
                    'rating_count' => $ratingCount,
                ]);
            }

            return response()->json([
                'success' => true,
                'data' => $order,
                'message' => 'تم إرسال التقييم بنجاح'
            ]);

        } catch (\Exception $e) {
            return response()->json([
                'success' => false,
                'data' => null,
                'message' => 'خطأ في إرسال التقييم: ' . $e->getMessage()
            ], 500);
        }
    }

    /**
     * إحصائيات الطلبات
     */
    public function stats(Request $request): JsonResponse
    {
        try {
            $userId = $request->user_id ?? auth()->id();
            
            if (!$userId) {
                return response()->json([
                    'success' => false,
                    'data' => null,
                    'message' => 'معرف المستخدم مطلوب'
                ], 400);
            }

            $stats = [
                'total_orders' => GasOrder::where('customer_id', $userId)->count(),
                'pending_orders' => GasOrder::where('customer_id', $userId)->where('status', 'pending')->count(),
                'completed_orders' => GasOrder::where('customer_id', $userId)->where('status', 'delivered')->count(),
                'cancelled_orders' => GasOrder::where('customer_id', $userId)->where('status', 'cancelled')->count(),
                'total_spent' => GasOrder::where('customer_id', $userId)->where('status', 'delivered')->sum('total'),
                'average_order_value' => GasOrder::where('customer_id', $userId)->where('status', 'delivered')->avg('total'),
            ];

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

        } catch (\Exception $e) {
            return response()->json([
                'success' => false,
                'data' => null,
                'message' => 'خطأ في جلب الإحصائيات: ' . $e->getMessage()
            ], 500);
        }
    }

    /**
     * جلب طلبات مكتب الغاز
     */
    public function gasOfficeOrders(Request $request)
    {
        try {
            $user = $request->user();
            
            // البحث عن مكتب الغاز الخاص بالمستخدم
            $gasOffice = GasOffice::where('owner_id', $user->id)->first();
            
            if (!$gasOffice) {
                return response()->json([
                    'success' => false,
                    'data' => null,
                    'message' => 'مكتب الغاز غير موجود'
                ], 404);
            }

            // جلب الطلبات الخاصة بمكتب الغاز
            $orders = GasOrder::with(['orderItems', 'customer'])
                ->where('gas_office_id', $gasOffice->id)
                ->orderBy('created_at', 'desc')
                ->get();

            // تحويل البيانات إلى الصيغة المطلوبة
            $formattedOrders = $orders->map(function ($order) {
                return [
                    'id' => $order->id,
                    'customer_name' => $order->customer ? $order->customer->name : 'غير محدد',
                    'customer_phone' => $order->customer ? $order->customer->phone : 'غير محدد',
                    'address' => $order->delivery_address,
                    'total_amount' => $order->total,
                    'status' => $order->status,
                    'created_at' => $order->created_at->toISOString(),
                    'updated_at' => $order->updated_at->toISOString(),
                    'items' => $order->orderItems->map(function ($item) {
                        return [
                            'id' => $item->id,
                            'cylinder_name' => 'قنينة غاز', // يمكن تحسين هذا لاحقاً
                            'quantity' => $item->quantity,
                            'price' => $item->unit_price,
                        ];
                    }),
                    'notes' => $order->special_instructions,
                    'gas_office_id' => $order->gas_office_id,
                ];
            });

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

        } catch (\Exception $e) {
            return response()->json([
                'success' => false,
                'data' => null,
                'message' => 'خطأ في جلب طلبات مكتب الغاز: ' . $e->getMessage()
            ], 500);
        }
    }
}
