<?php

namespace App\Http\Controllers\Api;

use App\Http\Controllers\Controller;
use App\Models\AppSetting;
use App\Models\TripRequest;
use App\Models\TaxiRequest;
use App\Services\PartnerWalletService;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Auth;
use Illuminate\Support\Facades\Validator;

class TripRequestController extends Controller
{
    /**
     * جلب الطلبات الواردة للسائق
     */
    public function getIncomingRequests(Request $request)
    {
        try {
            $driver = Auth::user();
            
            // التحقق من أن المستخدم سائق
            if ($driver->user_type !== 'driver') {
                return response()->json([
                    'success' => false,
                    'message' => 'هذا المستخدم ليس سائق'
                ], 403);
            }

            // جلب موقع السائق
            $driverLat = $driver->latitude ?? 31.0437; // الناصرية كموقع افتراضي
            $driverLng = $driver->longitude ?? 46.2575;
            
            // جلب الطلبات من trip_requests
            $tripRequests = TripRequest::with(['passenger:id,name,phone,profile_image'])
                ->pending()
                ->byArea($driverLat, $driverLng, 5)
                ->orderBy('created_at', 'desc')
                ->get()
                ->map(function ($request) {
                    $passenger = $request->passenger;
                    
                    return [
                        'id' => $request->id,
                        'type' => 'trip_request',
                        'passenger' => [
                            'id' => $passenger->id ?? null,
                            'name' => $passenger->name ?? 'غير محدد',
                            'phone' => $passenger->phone ?? 'غير محدد',
                            'rating' => 0.0,
                            'profile_image' => $passenger->profile_image ?? null,
                        ],
                        'pickup' => $request->pickup_location ?? 'غير محدد',
                        'pickup_ar' => $request->pickup_location_ar ?? $request->pickup_location ?? 'غير محدد',
                        'destination' => $request->destination_location ?? 'غير محدد',
                        'destination_ar' => $request->destination_location_ar ?? $request->destination_location ?? 'غير محدد',
                        'pickup_lat' => $request->pickup_lat ?? 0,
                        'pickup_lng' => $request->pickup_lng ?? 0,
                        'destination_lat' => $request->destination_lat ?? 0,
                        'destination_lng' => $request->destination_lng ?? 0,
                        'distance' => $request->distance ? number_format($request->distance, 1) . ' كم' : 'غير محدد',
                        'distance_value' => $request->distance ?? 0,
                        'duration' => $request->duration ? $request->duration . ' دقيقة' : 'غير محدد',
                        'duration_value' => $request->duration ?? 0,
                        'proposed_price' => $request->proposed_price ?? 0,
                        'proposed_price_formatted' => $request->proposed_price ? number_format($request->proposed_price, 0) . ' د.ع' : 'غير محدد',
                        'notes' => $request->notes ?? '',
                        'request_time' => $request->request_time ? $request->request_time->format('H:i') : ($request->created_at->format('H:i')),
                        'request_date' => $request->request_time ? $request->request_time->format('Y-m-d H:i:s') : ($request->created_at->format('Y-m-d H:i:s')),
                        'status' => $request->status ?? 'pending',
                        'status_arabic' => $request->status_arabic ?? 'معلق',
                        'status_color' => $request->status_color ?? 'orange',
                    ];
                })
                ->filter(function ($request) {
                    return !empty($request['pickup']) && $request['pickup'] !== 'غير محدد' &&
                           !empty($request['destination']) && $request['destination'] !== 'غير محدد';
                });

            // جلب الطلبات من taxi_requests
            $taxiRequests = TaxiRequest::where('status', 'pending')
                ->whereNull('driver_id')
                ->orderBy('created_at', 'desc')
                ->get()
                ->map(function ($request) {
                    return [
                        'id' => $request->id,
                        'type' => 'taxi_request',
                        'passenger' => [
                            'id' => $request->passenger_id ?? null,
                            'name' => $request->passenger_name ?? 'غير محدد',
                            'phone' => $request->passenger_phone ?? 'غير محدد',
                            'rating' => 0.0,
                            'profile_image' => null,
                        ],
                        'pickup' => $request->from_address ?? 'غير محدد',
                        'pickup_ar' => $request->from_address ?? 'غير محدد',
                        'destination' => $request->to_address ?? 'غير محدد',
                        'destination_ar' => $request->to_address ?? 'غير محدد',
                        'pickup_lat' => $request->from_latitude ?? 0,
                        'pickup_lng' => $request->from_longitude ?? 0,
                        'destination_lat' => $request->to_latitude ?? 0,
                        'destination_lng' => $request->to_longitude ?? 0,
                        'distance' => $request->estimated_distance ? number_format($request->estimated_distance, 1) . ' كم' : 'غير محدد',
                        'distance_value' => $request->estimated_distance ?? 0,
                        'duration' => $request->estimated_duration ? $request->estimated_duration . ' دقيقة' : 'غير محدد',
                        'duration_value' => $request->estimated_duration ?? 0,
                        'proposed_price' => $request->price ?? 0,
                        'proposed_price_formatted' => $request->price ? number_format($request->price, 0) . ' د.ع' : 'غير محدد',
                        'notes' => $request->notes ?? '',
                        'request_time' => $request->created_at->format('H:i'),
                        'request_date' => $request->created_at->format('Y-m-d H:i:s'),
                        'status' => $request->status ?? 'pending',
                        'status_arabic' => 'معلق',
                        'status_color' => 'orange',
                    ];
                })
                ->filter(function ($request) {
                    return !empty($request['pickup']) && $request['pickup'] !== 'غير محدد' &&
                           !empty($request['destination']) && $request['destination'] !== 'غير محدد';
                });

            // دمج الطلبات وترتيبها حسب التاريخ
            $requests = $tripRequests->concat($taxiRequests)
                ->sortByDesc('request_date')
                ->values();

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

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

    /**
     * قبول طلب رحلة
     */
    public function acceptRequest(Request $request)
    {
        try {
            $validator = Validator::make($request->all(), [
                'request_id' => 'required|integer',
                'type' => 'nullable|string|in:trip_request,taxi_request',
            ]);

            if ($validator->fails()) {
                return response()->json([
                    'success' => false,
                    'message' => 'بيانات غير صحيحة',
                    'errors' => $validator->errors()
                ], 422);
            }

            $driver = Auth::user();
            
            // التحقق من أن المستخدم سائق
            if ($driver->user_type !== 'driver') {
                return response()->json([
                    'success' => false,
                    'message' => 'هذا المستخدم ليس سائق'
                ], 403);
            }

            $requestId = $request->request_id;
            $requestType = $request->type ?? null;

            // محاولة تحديد نوع الطلب تلقائياً إذا لم يتم تحديده
            // الأفضلية للطلب المعلق (pending) عند وجود نفس الـ ID في الجدولين
            if (!$requestType) {
                $tripRequest = TripRequest::find($requestId);
                $taxiRequest = TaxiRequest::find($requestId);

                $tripPending = $tripRequest && $tripRequest->status === 'pending';
                $taxiPending = $taxiRequest && $taxiRequest->status === 'pending';

                if ($tripPending && $taxiPending) {
                    $requestType = 'trip_request'; // كلا الطلبين معلق - نفضل trip_request
                } elseif ($tripPending) {
                    $requestType = 'trip_request';
                } elseif ($taxiPending) {
                    $requestType = 'taxi_request';
                } elseif ($tripRequest) {
                    $requestType = 'trip_request';
                } elseif ($taxiRequest) {
                    $requestType = 'taxi_request';
                } else {
                    return response()->json([
                        'success' => false,
                        'message' => 'الطلب غير موجود'
                    ], 404);
                }
            }

            // التحقق من أن السائق لا يوجد لديه طلب مقبول آخر
            $activeTripRequest = TripRequest::where('driver_id', $driver->id)
                ->whereIn('status', ['accepted', 'in_progress', 'active', 'started'])
                ->first();
            
            $activeTaxiRequest = TaxiRequest::where('driver_id', $driver->id)
                ->whereIn('status', ['accepted', 'in_progress', 'active', 'started'])
                ->first();

            if ($activeTripRequest || $activeTaxiRequest) {
                return response()->json([
                    'success' => false,
                    'message' => 'لديك رحلة نشطة بالفعل. يجب إكمال أو إلغاء الرحلة الحالية قبل قبول طلب جديد.',
                ], 400);
            }

            // معالجة قبول الطلب حسب النوع
            if ($requestType === 'trip_request') {
                $tripRequest = TripRequest::findOrFail($requestId);
                
                // التحقق من أن الطلب معلق
                if ($tripRequest->status !== 'pending') {
                    return response()->json([
                        'success' => false,
                        'message' => 'هذا الطلب لا يمكن قبوله'
                    ], 400);
                }

                // قبول الطلب
                $tripRequest->update([
                    'status' => 'accepted',
                    'driver_id' => $driver->id,
                    'accepted_time' => now(),
                ]);

                // خصم نسبة العمولة من محفظة السائق عند تفعيل الاشتراك
                $this->deductDriverCommission($driver, $tripRequest->proposed_price ?? 0, $tripRequest->id, 'trip_request');

                return response()->json([
                    'success' => true,
                    'message' => 'تم قبول الطلب بنجاح',
                    'data' => [
                        'request_id' => $tripRequest->id,
                        'type' => 'trip_request',
                        'status' => 'accepted',
                        'accepted_time' => now()->format('Y-m-d H:i:s'),
                    ]
                ]);
            } else {
                // قبول طلب taxi_request
                $taxiRequest = TaxiRequest::findOrFail($requestId);
                
                // التحقق من أن الطلب معلق
                if ($taxiRequest->status !== 'pending') {
                    return response()->json([
                        'success' => false,
                        'message' => 'هذا الطلب لا يمكن قبوله'
                    ], 400);
                }

                // قبول الطلب
                $taxiRequest->update([
                    'status' => 'accepted',
                    'driver_id' => $driver->id,
                    'driver_name' => $driver->name,
                    'driver_phone' => $driver->phone,
                    'accepted_at' => now(),
                ]);

                // خصم نسبة العمولة من محفظة السائق عند تفعيل الاشتراك
                $this->deductDriverCommission($driver, $taxiRequest->price ?? 0, $taxiRequest->id, 'taxi_request');

                return response()->json([
                    'success' => true,
                    'message' => 'تم قبول الطلب بنجاح',
                    'data' => [
                        'request_id' => $taxiRequest->id,
                        'type' => 'taxi_request',
                        'status' => 'accepted',
                        'accepted_time' => now()->format('Y-m-d H:i:s'),
                    ]
                ]);
            }

        } catch (\Illuminate\Database\Eloquent\ModelNotFoundException $e) {
            return response()->json([
                'success' => false,
                'message' => 'الطلب غير موجود'
            ], 404);
        } catch (\Exception $e) {
            return response()->json([
                'success' => false,
                'message' => 'خطأ في قبول الطلب: ' . $e->getMessage()
            ], 500);
        }
    }

    /**
     * رفض طلب رحلة (يدعم trip_request و taxi_request - مثل acceptRequest)
     */
    public function rejectRequest(Request $request)
    {
        try {
            $validator = Validator::make($request->all(), [
                'request_id' => 'required|integer',
                'type' => 'nullable|string|in:trip_request,taxi_request',
                'reason' => 'nullable|string|max:255',
            ]);

            if ($validator->fails()) {
                return response()->json([
                    'success' => false,
                    'message' => 'بيانات غير صحيحة',
                    'errors' => $validator->errors()
                ], 422);
            }

            $driver = Auth::user();
            
            // التحقق من أن المستخدم سائق
            if ($driver->user_type !== 'driver') {
                return response()->json([
                    'success' => false,
                    'message' => 'هذا المستخدم ليس سائق'
                ], 403);
            }

            $requestId = $request->request_id;
            $requestType = $request->type ?? null;

            // تحديد نوع الطلب تلقائياً إذا لم يُحدد (مثل acceptRequest)
            if (!$requestType) {
                $tripRequest = TripRequest::find($requestId);
                $taxiRequest = TaxiRequest::find($requestId);

                $tripPending = $tripRequest && in_array($tripRequest->status, ['pending', 'accepted', 'in_progress']);
                $taxiPending = $taxiRequest && in_array($taxiRequest->status, ['pending', 'accepted', 'in_progress']);

                if ($tripPending && $taxiPending) {
                    $requestType = 'trip_request';
                } elseif ($tripPending) {
                    $requestType = 'trip_request';
                } elseif ($taxiPending) {
                    $requestType = 'taxi_request';
                } elseif ($tripRequest) {
                    $requestType = 'trip_request';
                } elseif ($taxiRequest) {
                    $requestType = 'taxi_request';
                } else {
                    return response()->json([
                        'success' => false,
                        'message' => 'الطلب غير موجود'
                    ], 404);
                }
            }

            if ($requestType === 'trip_request') {
                // للطلبات المعلقة: driver_id يكون null - نبحث بالـ id فقط
                // للطلبات المقبولة: نتحقق أن الطلب مخصص لهذا السائق
                $tripRequest = TripRequest::where('id', $requestId)
                    ->where(function ($q) use ($driver) {
                        $q->whereNull('driver_id')
                          ->orWhere('driver_id', $driver->id);
                    })
                    ->first();
                
                if (!$tripRequest) {
                    return response()->json([
                        'success' => false,
                        'message' => 'الطلب غير موجود أو لا يمكنك رفضه'
                    ], 404);
                }
                
                if (!in_array($tripRequest->status, ['pending', 'accepted', 'in_progress', 'active', 'started'])) {
                    return response()->json([
                        'success' => false,
                        'message' => 'هذا الطلب لا يمكن رفضه'
                    ], 400);
                }

                $updateData = ['status' => 'rejected', 'driver_id' => $driver->id];
                if ($request->filled('reason')) {
                    $updateData['rejection_reason'] = $request->reason;
                }
                $tripRequest->update($updateData);

                return response()->json([
                    'success' => true,
                    'message' => 'تم رفض الطلب بنجاح',
                    'data' => [
                        'request_id' => $tripRequest->id,
                        'type' => 'trip_request',
                        'status' => 'rejected',
                        'rejected_time' => now()->format('Y-m-d H:i:s'),
                    ]
                ]);
            }

            // معالجة taxi_request
            $taxiRequest = TaxiRequest::where('id', $requestId)
                ->where(function ($q) use ($driver) {
                    $q->whereNull('driver_id')
                      ->orWhere('driver_id', $driver->id);
                })
                ->first();
            
            if (!$taxiRequest) {
                return response()->json([
                    'success' => false,
                    'message' => 'الطلب غير موجود أو لا يمكنك رفضه'
                ], 404);
            }
            
            if (!in_array($taxiRequest->status, ['pending', 'accepted', 'in_progress', 'active', 'started'])) {
                return response()->json([
                    'success' => false,
                    'message' => 'هذا الطلب لا يمكن رفضه'
                ], 400);
            }

            $taxiRequest->update(['status' => 'rejected']);

            return response()->json([
                'success' => true,
                'message' => 'تم رفض الطلب بنجاح',
                'data' => [
                    'request_id' => $taxiRequest->id,
                    'type' => 'taxi_request',
                    'status' => 'rejected',
                    'rejected_time' => now()->format('Y-m-d H:i:s'),
                ]
            ]);

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

    /**
     * إتمام طلب رحلة
     */
    public function completeRequest(Request $request)
    {
        try {
            $validator = Validator::make($request->all(), [
                'request_id' => 'required|integer|exists:trip_requests,id',
            ]);

            if ($validator->fails()) {
                return response()->json([
                    'success' => false,
                    'message' => 'بيانات غير صحيحة',
                    'errors' => $validator->errors()
                ], 422);
            }

            $driver = Auth::user();
            
            // التحقق من أن المستخدم سائق
            if ($driver->user_type !== 'driver') {
                return response()->json([
                    'success' => false,
                    'message' => 'هذا المستخدم ليس سائق'
                ], 403);
            }

            $tripRequest = TripRequest::where('id', $request->request_id)
                ->where('driver_id', $driver->id)
                ->first();
            
            if (!$tripRequest) {
                return response()->json([
                    'success' => false,
                    'message' => 'الطلب غير موجود أو ليس لك'
                ], 404);
            }

            // التحقق من أن الطلب مقبول أو قيد التنفيذ أو نشط
            if (!in_array($tripRequest->status, ['accepted', 'in_progress', 'active', 'started'])) {
                return response()->json([
                    'success' => false,
                    'message' => 'لا يمكن إتمام هذا الطلب. الحالة الحالية: ' . ($tripRequest->status ?? 'غير معروف')
                ], 400);
            }

            // تحديث حالة الطلب إلى مكتمل
            $tripRequest->update([
                'status' => 'completed',
            ]);

            // إضافة كاش باك للسائق
            try {
                $fare = (float) ($tripRequest->proposed_price ?? 0);
                if ($fare > 0) {
                    \App\Services\DriverCashbackService::addCashbackForCompletedTrip(
                        $driver->id,
                        $fare,
                        $tripRequest->id,
                        null,
                        null
                    );
                }
            } catch (\Exception $e) {
                \Log::warning('Driver cashback error: ' . $e->getMessage());
            }

            return response()->json([
                'success' => true,
                'message' => 'تم إتمام الرحلة بنجاح. يمكنك الآن قبول رحلة جديدة',
                'data' => [
                    'request_id' => $tripRequest->id,
                    'status' => 'completed',
                ]
            ]);

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

    /**
     * خصم نسبة العمولة من محفظة السائق عند قبول الرحلة (حسب إعدادات لوحة التحكم)
     */
    private function deductDriverCommission($driver, float $fare, int $requestId, string $refType): void
    {
        $settings = AppSetting::first();
        if (!$settings || !($settings->driver_subscription_enabled ?? false)) {
            return;
        }

        $type = $settings->driver_subscription_type ?? 'percentage';
        $value = (float) ($settings->driver_subscription_value ?? 0);

        if ($value <= 0 || $fare <= 0) {
            return;
        }

        $amount = 0.0;
        if ($type === 'percentage') {
            $amount = round($fare * ($value / 100), 0);
        } elseif ($type === 'monthly') {
            // للاشتراك الشهري لا نخصم عند كل رحلة
            return;
        }

        if ($amount <= 0) {
            return;
        }

        try {
            PartnerWalletService::deductForOrder(
                'driver',
                (int) $driver->id,
                $amount,
                $refType,
                $requestId,
                ($refType === 'trip_request' ? 'TR' : 'TX') . '-' . $requestId,
                'عمولة التطبيق - نسبة ' . ($type === 'percentage' ? $value . '%' : '') . ' من الرحلة #' . $requestId
            );
        } catch (\Exception $e) {
            \Log::warning('Driver commission deduction error: ' . $e->getMessage());
        }
    }
}
