<?php

namespace App\Http\Controllers\Api;

use App\Http\Controllers\Controller;
use App\Models\GasOrder;
use App\Models\GasOffice;
use Illuminate\Http\Request;
use Illuminate\Http\JsonResponse;
use Illuminate\Support\Facades\Auth;

class GasOfficeOrderController extends Controller
{
    /**
     * عرض جميع طلبات مكتب الغاز
     */
    public function index(Request $request): JsonResponse
    {
        $user = Auth::user();
        $gasOffice = GasOffice::where('owner_id', $user->id)->first();

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

        $query = $gasOffice->gasOrders()->with(['customer', 'driver', 'orderItems.gasCylinder']);

        // فلترة حسب الحالة
        if ($request->has('status')) {
            $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);
        }

        // فلترة حسب نوع الدفع
        if ($request->has('payment_method')) {
            $query->where('payment_method', $request->payment_method);
        }

        // فلترة حسب حالة الدفع
        if ($request->has('payment_status')) {
            $query->where('payment_status', $request->payment_status);
        }

        $orders = $query->orderBy('created_at', 'desc')->paginate(20);

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

    /**
     * عرض الطلبات الواردة (pending)
     */
    public function getIncomingOrders(Request $request): JsonResponse
    {
        $user = Auth::user();
        $gasOffice = GasOffice::where('owner_id', $user->id)->first();

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

        $orders = $gasOffice->gasOrders()
            ->where('status', 'pending')
            ->with(['customer', 'orderItems.gasCylinder'])
            ->orderBy('created_at', 'desc')
            ->paginate(20);

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

    /**
     * عرض الطلبات المكتملة
     */
    public function getCompletedOrders(Request $request): JsonResponse
    {
        $user = Auth::user();
        $gasOffice = GasOffice::where('owner_id', $user->id)->first();

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

        $orders = $gasOffice->gasOrders()
            ->whereIn('status', ['delivered', 'cancelled'])
            ->with(['customer', 'driver', 'orderItems.gasCylinder'])
            ->orderBy('created_at', 'desc')
            ->paginate(20);

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

    /**
     * عرض تفاصيل طلب معين
     */
    public function show(GasOrder $gasOrder): JsonResponse
    {
        $user = Auth::user();
        $gasOffice = GasOffice::where('owner_id', $user->id)->first();

        if (!$gasOffice || $gasOrder->gas_office_id !== $gasOffice->id) {
            return response()->json([
                'success' => false,
                'message' => 'طلب غير موجود أو غير مصرح لك بعرضه'
            ], 404);
        }

        $gasOrder->load(['customer', 'driver', 'orderItems.gasCylinder']);

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

    /**
     * قبول طلب
     */
    public function acceptOrder(GasOrder $gasOrder): JsonResponse
    {
        $user = Auth::user();
        $gasOffice = GasOffice::where('owner_id', $user->id)->first();

        if (!$gasOffice || $gasOrder->gas_office_id !== $gasOffice->id) {
            return response()->json([
                'success' => false,
                'message' => 'طلب غير موجود أو غير مصرح لك بقبوله'
            ], 404);
        }

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

        $gasOrder->update([
            'status' => 'confirmed',
            'payment_status' => 'paid' // نفترض أن الدفع تم عند القبول
        ]);

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

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

        $user = Auth::user();
        $gasOffice = GasOffice::where('owner_id', $user->id)->first();

        if (!$gasOffice || $gasOrder->gas_office_id !== $gasOffice->id) {
            return response()->json([
                'success' => false,
                'message' => 'طلب غير موجود أو غير مصرح لك برفضه'
            ], 404);
        }

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

        $gasOrder->update([
            'status' => 'cancelled',
            'special_instructions' => $gasOrder->special_instructions . "\nسبب الرفض: " . $request->rejection_reason
        ]);

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

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

    /**
     * تحديث حالة الطلب
     */
    public function updateOrderStatus(Request $request, GasOrder $gasOrder): JsonResponse
    {
        $request->validate([
            'status' => 'required|in:pending,confirmed,preparing,picked_up,delivered,cancelled',
            'notes' => 'nullable|string|max:500'
        ]);

        $user = Auth::user();
        $gasOffice = GasOffice::where('owner_id', $user->id)->first();

        if (!$gasOffice || $gasOrder->gas_office_id !== $gasOffice->id) {
            return response()->json([
                'success' => false,
                'message' => 'طلب غير موجود أو غير مصرح لك بتحديثه'
            ], 404);
        }

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

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

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

        // إضافة ملاحظات إذا تم توفيرها
        if ($request->has('notes')) {
            $updateData['special_instructions'] = $gasOrder->special_instructions . "\nملاحظة: " . $request->notes;
        }

        // تحديث وقت التسليم الفعلي عند التسليم
        if ($newStatus === 'delivered') {
            $updateData['actual_delivery_time'] = now();
        }

        $gasOrder->update($updateData);

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

        // حساب أرباح الإحالات عند التوصيل
        if ($newStatus === 'delivered') {
            try {
                $customer = $gasOrder->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', $gasOrder->id)
                            ->first();

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

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

    /**
     * تعيين سائق للطلب
     */
    public function assignDriver(Request $request, GasOrder $gasOrder): JsonResponse
    {
        $request->validate([
            'driver_id' => 'required|exists:drivers,id'
        ]);

        $user = Auth::user();
        $gasOffice = GasOffice::where('owner_id', $user->id)->first();

        if (!$gasOffice || $gasOrder->gas_office_id !== $gasOffice->id) {
            return response()->json([
                'success' => false,
                'message' => 'طلب غير موجود أو غير مصرح لك بتحديثه'
            ], 404);
        }

        if (!in_array($gasOrder->status, ['confirmed', 'preparing'])) {
            return response()->json([
                'success' => false,
                'message' => 'لا يمكن تعيين سائق في هذه المرحلة'
            ], 400);
        }

        $gasOrder->update([
            'driver_id' => $request->driver_id,
            'status' => 'preparing'
        ]);

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

    /**
     * إحصائيات الطلبات
     */
    public function getStats(Request $request): JsonResponse
    {
        $user = Auth::user();
        $gasOffice = GasOffice::where('owner_id', $user->id)->first();

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

        $stats = [
            'total_orders' => $gasOffice->gasOrders()->count(),
            'pending_orders' => $gasOffice->gasOrders()->where('status', 'pending')->count(),
            'confirmed_orders' => $gasOffice->gasOrders()->where('status', 'confirmed')->count(),
            'preparing_orders' => $gasOffice->gasOrders()->where('status', 'preparing')->count(),
            'picked_up_orders' => $gasOffice->gasOrders()->where('status', 'picked_up')->count(),
            'delivered_orders' => $gasOffice->gasOrders()->where('status', 'delivered')->count(),
            'cancelled_orders' => $gasOffice->gasOrders()->where('status', 'cancelled')->count(),
            'total_revenue' => $gasOffice->gasOrders()->where('status', 'delivered')->sum('total'),
            'average_order_value' => $gasOffice->gasOrders()->where('status', 'delivered')->avg('total'),
            'urgent_orders' => $gasOffice->gasOrders()->where('is_urgent', true)->count(),
        ];

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

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

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