<?php

namespace App\Http\Controllers\Api;

use App\Http\Controllers\Controller;
use App\Models\DriverReferral;
use App\Models\DriverReferralCode;
use App\Models\User;
use App\Services\BulkSmsIraqService;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Auth;
use Illuminate\Support\Facades\DB;
use Illuminate\Support\Facades\Hash;
use Illuminate\Support\Facades\Validator;

class AuthController extends Controller
{
    /** بيانات المستخدم التجريبي (للفحص قبل رفع المتجر) */
    private const TEST_PHONE = '07701234567';
    private const TEST_PASSWORD = '123321001';

    public function login(Request $request)
    {
        \Log::info('🔐 محاولة تسجيل دخول برقم الهاتف', [
            'phone' => $request->phone,
            'request_data' => $request->all()
        ]);

        $validator = Validator::make($request->all(), [
            'phone' => 'required|string|max:255',
            'password' => 'required|string',
        ]);

        if ($validator->fails()) {
            \Log::warning('❌ فشل في التحقق من البيانات', [
                'errors' => $validator->errors()
            ]);
            return response()->json([
                'success' => false,
                'message' => 'Validation errors',
                'errors' => $validator->errors()
            ], 422);
        }

        $loginInput = trim((string) $request->phone);
        \Log::info('🔍 البحث عن المستخدم: ' . $loginInput);

        $user = str_contains($loginInput, '@')
            ? User::where('email', $loginInput)->first()
            : $this->findUserByPhone($loginInput);

        // إنشاء المستخدم التجريبي تلقائياً إذا طلب الدخول بالبيانات التجريبية ولم يوجد
        if (!$user && $this->isTestLoginCredentials($loginInput, $request->password)) {
            $user = $this->createTestUser();
            \Log::info('✅ تم إنشاء المستخدم التجريبي للفحص');
        }

        if (!$user) {
            \Log::warning('❌ لم يتم العثور على مستخدم برقم الهاتف: ' . $request->phone);
            return response()->json([
                'success' => false,
                'message' => 'Invalid phone number or password'
            ], 401);
        }

        \Log::info('✅ تم العثور على المستخدم', [
            'user_id' => $user->id,
            'user_name' => $user->name,
            'user_type' => $user->user_type
        ]);

        if (!Hash::check($request->password, $user->password)) {
            // إصلاح كلمة المرور والدور التجريبي إن وُجد خطأ
            if ($this->isTestLoginCredentials($loginInput, $request->password)
                && $this->isTestUser($user)) {
                $user->forceFill([
                    'password' => self::TEST_PASSWORD,
                    'user_type' => 'passenger',
                ])->save();
                $user = $user->fresh();
                \Log::info('🔧 تم إصلاح بيانات المستخدم التجريبي (كلمة مرور + دور راكب)');
            } else {
                \Log::warning('❌ كلمة المرور غير صحيحة للمستخدم: ' . $user->id);
                return response()->json([
                    'success' => false,
                    'message' => 'Invalid phone number or password'
                ], 401);
            }
        }

        // التأكد من أن المستخدم التجريبي دائماً برتبة راكب
        if ($this->isTestUser($user) && $user->user_type !== 'passenger') {
            $user->update(['user_type' => 'passenger']);
            $user = $user->fresh();
            \Log::info('🔧 تم تصحيح دور المستخدم التجريبي إلى راكب');
        }

        \Log::info('🔑 كلمة المرور صحيحة، إنشاء token');
        $token = $user->createToken('auth_token')->plainTextToken;

        \Log::info('✅ تم تسجيل الدخول بنجاح', [
            'user_id' => $user->id,
            'user_name' => $user->name,
            'token_created' => true
        ]);

        $userPayload = [
            'id' => $user->id,
            'name' => $user->name,
            'phone' => $user->phone,
            'email' => $user->email,
            'user_type' => $user->user_type,
        ];
        if ($user->user_type === 'driver') {
            $userPayload['account_verified'] = (bool) ($user->account_verified ?? false);
            $userPayload['driver_verification_status'] = $user->driver_verification_status ?? 'none';
            $userPayload['driver_legal_accepted_at'] = $user->driver_legal_accepted_at;
            $userPayload['is_verified'] = (bool) ($user->account_verified ?? false);
        }

        $response = [
            'success' => true,
            'message' => 'Login successful',
            'token' => $token,
            'user' => $userPayload,
        ];

        \Log::info('📤 إرسال استجابة تسجيل الدخول', $response);

        return response()->json($response);
    }

    public function register(Request $request)
    {
        \Log::info('📝 محاولة تسجيل مستخدم جديد', [
            'name' => $request->name,
            'email' => $request->email,
            'phone' => $request->phone,
            'user_type' => $request->user_type,
            'request_data' => $request->all()
        ]);

        $normalizedPhone = $this->normalizePhone($request->phone ?? '');

        $validator = Validator::make($request->all(), [
            'name' => 'required|string|max:255',
            'email' => 'required|email|unique:users',
            'password' => 'required|string|min:8',
            'password_confirmation' => 'required|same:password',
            'phone' => 'required|string|max:20',
            'user_type' => 'required|in:passenger,driver',
            'referral_code' => 'nullable|string|max:20',
        ]);
        $validator->after(function ($validator) {
            if ($this->findUserByPhone(request('phone'))) {
                $validator->errors()->add('phone', 'رقم الهاتف مسجل مسبقاً');
            }
        });

        if ($validator->fails()) {
            \Log::warning('❌ فشل في التحقق من البيانات', [
                'errors' => $validator->errors()
            ]);
            return response()->json([
                'success' => false,
                'message' => 'Validation errors',
                'errors' => $validator->errors()
            ], 422);
        }

        try {
            $user = User::create([
                'name' => $request->name,
                'email' => $request->email,
                'phone' => $normalizedPhone,
                'password' => Hash::make($request->password),
                'user_type' => $request->user_type,
            ]);

            $referralCode = trim((string) ($request->referral_code ?? ''));
            if ($request->user_type === 'driver' && $referralCode !== '') {
                $refRecord = DriverReferralCode::where('code', strtoupper($referralCode))->first();
                if ($refRecord && $refRecord->driver_id != $user->id) {
                    DriverReferral::create([
                        'referrer_driver_id' => $refRecord->driver_id,
                        'referred_driver_id' => $user->id,
                        'referral_code' => $refRecord->code,
                        'referred_at' => now(),
                        'bonus_months_remaining' => 1,
                    ]);
                }
            }

            $token = $user->createToken('auth_token')->plainTextToken;

            \Log::info('✅ تم تسجيل المستخدم بنجاح', [
                'user_id' => $user->id,
                'user_name' => $user->name,
                'user_type' => $user->user_type
            ]);

            return response()->json([
                'success' => true,
                'message' => 'User registered successfully',
                'data' => [
                    'user' => [
                        'id' => $user->id,
                        'name' => $user->name,
                        'email' => $user->email,
                        'phone' => $user->phone,
                        'user_type' => $user->user_type,
                    ],
                    'token' => $token,
                    'token_type' => 'Bearer'
                ]
            ], 201);
        } catch (\Exception $e) {
            \Log::error('❌ خطأ في تسجيل المستخدم: ' . $e->getMessage());
            return response()->json([
                'success' => false,
                'message' => 'خطأ في تسجيل المستخدم: ' . $e->getMessage()
            ], 500);
        }
    }

    public function registerWithPhone(Request $request)
    {
        $validator = Validator::make($request->all(), [
            'name' => 'required|string|max:255',
            'phone' => 'required|string|max:20',
            'password' => 'required|string|min:8|confirmed',
            'user_type' => 'nullable|string|in:passenger,driver',
            'referral_code' => 'nullable|string|max:20',
        ]);
        $validator->after(function ($validator) {
            if ($this->findUserByPhone(request('phone'))) {
                $validator->errors()->add('phone', 'رقم الهاتف مسجل مسبقاً');
            }
        });

        if ($validator->fails()) {
            return response()->json([
                'success' => false,
                'message' => 'Validation errors',
                'errors' => $validator->errors()
            ], 422);
        }

        $normalizedPhone = $this->normalizePhone($request->phone);
        $userType = in_array($request->user_type, ['passenger', 'driver']) ? $request->user_type : 'passenger';

        $user = User::create([
            'name' => $request->name,
            'phone' => $normalizedPhone,
            'password' => Hash::make($request->password),
            'email' => 'phone_' . $normalizedPhone . '@taxiapp.com',
            'user_type' => $userType,
        ]);

        $referralCode = trim((string) ($request->referral_code ?? ''));
        if ($userType === 'driver' && $referralCode !== '') {
            $refRecord = DriverReferralCode::where('code', strtoupper($referralCode))->first();
            if ($refRecord && $refRecord->driver_id != $user->id) {
                DriverReferral::create([
                    'referrer_driver_id' => $refRecord->driver_id,
                    'referred_driver_id' => $user->id,
                    'referral_code' => $refRecord->code,
                    'referred_at' => now(),
                    'bonus_months_remaining' => 1,
                ]);
            }
        }

        $token = $user->createToken('auth_token')->plainTextToken;

        return response()->json([
            'success' => true,
            'message' => 'User registered successfully',
            'data' => [
                'user' => $user,
                'token' => $token,
                'token_type' => 'Bearer'
            ]
        ], 201);
    }

    /** تسجيل الدخول بـ OTP: إرسال كود التحقق عبر واتساب (BulkSMS Iraq). حد 5 رسائل/يوم و 5 دقائق بين كل طلب. */
    public function sendOtp(Request $request)
    {
        $validator = Validator::make($request->all(), [
            'phone' => 'required|string|max:20',
        ]);
        if ($validator->fails()) {
            return response()->json([
                'success' => false,
                'message' => 'يرجى إدخال رقم الهاتف',
                'errors' => $validator->errors(),
            ], 422);
        }

        $phone = $this->normalizePhoneForOtp($request->phone);

        // الحد اليومي: 5 رسائل كحد أقصى في اليوم الواحد
        $todayStart = now()->startOfDay();
        $countToday = DB::table('otp_requests')
            ->where('phone', $phone)
            ->where('sent_at', '>=', $todayStart)
            ->count();
        if ($countToday >= 5) {
            return response()->json([
                'success' => false,
                'message' => 'تجاوزت الحد المسموح (5 رسائل في اليوم). يرجى المحاولة غداً.',
            ], 429);
        }

        // 5 دقائق بين كل طلب وآخر
        $lastSent = DB::table('otp_requests')
            ->where('phone', $phone)
            ->orderByDesc('sent_at')
            ->value('sent_at');
        if ($lastSent && now()->diffInMinutes($lastSent, false) > -5) {
            $waitMinutes = (int) ceil(5 + (strtotime($lastSent) - time()) / 60);
            return response()->json([
                'success' => false,
                'message' => "يرجى الانتظار 5 دقائق بين كل طلب. يمكنك المحاولة بعد {$waitMinutes} دقيقة.",
            ], 429);
        }

        $code = (string) random_int(100000, 999999);
        $useFakeOtp = config('services.bulksms_iraq.use_fake_otp', false);
        $apiKey = config('services.bulksms_iraq.api_key', '');

        // وضع التطوير: كود ثابت 123456 بدون إرسال واتساب (عند عدم وجود API key أو تفعيل use_fake_otp)
        if ($useFakeOtp || empty(trim($apiKey))) {
            $code = '123456';
            \Log::info('BulkSMS: استخدام كود تجريبي (وضع التطوير) - الرقم: ' . $phone);
        } else {
            try {
                $sms = new BulkSmsIraqService();
                $result = $sms->sendOtpWhatsApp($phone, $code);
                if (!($result['success'] ?? false)) {
                    return response()->json([
                        'success' => false,
                        'message' => $result['message'] ?? 'فشل إرسال كود التحقق. حاول لاحقاً.',
                    ], 502);
                }
            } catch (\Throwable $e) {
                \Log::error('BulkSMS OTP send error: ' . $e->getMessage());
                return response()->json([
                    'success' => false,
                    'message' => 'خطأ في إرسال كود التحقق. حاول لاحقاً.',
                ], 502);
            }
        }

        DB::table('otp_requests')->insert([
            'phone' => $phone,
            'code' => $code,
            'sent_at' => now(),
            'created_at' => now(),
            'updated_at' => now(),
        ]);

        return response()->json([
            'success' => true,
            'message' => 'تم إرسال كود التحقق إلى واتساب.',
        ]);
    }

    /** التحقق من كود OTP وتسجيل الدخول (إنشاء مستخدم جديد إذا لم يكن الرقم مسجلاً). */
    public function verifyOtp(Request $request)
    {
        $validator = Validator::make($request->all(), [
            'phone' => 'required|string|max:20',
            'code' => 'required|string|size:6',
            'name' => 'nullable|string|max:255',
            'email' => 'nullable|email|max:255',
            'user_type' => 'nullable|string|in:passenger,driver,restaurant_manager,gas_manager,restaurant_owner,gas_owner',
            'referral_code' => 'nullable|string|max:20',
        ]);
        if ($validator->fails()) {
            return response()->json([
                'success' => false,
                'message' => 'يرجى إدخال رقم الهاتف وكود التحقق (6 أرقام)',
                'errors' => $validator->errors(),
            ], 422);
        }

        $phone = $this->normalizePhoneForOtp($request->phone);
        $code = preg_replace('/\D/', '', $request->code);

        // صلاحية الكود 10 دقائق، وأحدث طلب غير مُتحقق منه
        $otp = DB::table('otp_requests')
            ->where('phone', $phone)
            ->where('code', $code)
            ->whereNull('verified_at')
            ->where('sent_at', '>=', now()->subMinutes(10))
            ->orderByDesc('sent_at')
            ->first();

        if (!$otp) {
            return response()->json([
                'success' => false,
                'message' => 'كود التحقق غير صحيح أو منتهي الصلاحية. اطلب كوداً جديداً.',
            ], 400);
        }

        DB::table('otp_requests')
            ->where('id', $otp->id)
            ->update(['verified_at' => now(), 'updated_at' => now()]);

        // البحث عن مستخدم موجود برقم الهاتف (بأي تنسيق) - مهم جداً لحفظ النقاط والهدايا
        $user = $this->findUserByPhone($request->phone);
        if (!$user) {
            // المستخدم غير موجود = تسجيل جديد بتنسيق موحد
            $name = trim((string) ($request->name ?? ''));
            $email = trim((string) ($request->email ?? ''));
            $userType = $this->normalizeUserType($request->user_type);
            if ($name === '') {
                $name = 'مستخدم ' . substr($phone, -4);
            }
            if ($email === '' || !filter_var($email, FILTER_VALIDATE_EMAIL)) {
                $email = 'phone_' . $phone . '@taxiapp.com';
            } else {
                // التحقق من عدم تكرار البريد الإلكتروني
                if (User::where('email', $email)->exists()) {
                    return response()->json([
                        'success' => false,
                        'message' => 'البريد الإلكتروني مسجل مسبقاً. استخدم بريداً آخر أو اترك الحقل فارغاً.',
                    ], 422);
                }
            }
            try {
                $user = User::create([
                    'name' => $name,
                    'phone' => $phone,
                    'email' => $email,
                    'password' => Hash::make(\Str::random(32)),
                    'user_type' => $userType,
                ]);

                // إذا سجّل كسائق وأدخل كود دعوة صحيح، ربطه بالمُحيل
                $referralCode = trim((string) ($request->referral_code ?? ''));
                if ($userType === 'driver' && $referralCode !== '') {
                    $refRecord = DriverReferralCode::where('code', strtoupper($referralCode))->first();
                    if ($refRecord && $refRecord->driver_id != $user->id) {
                        DriverReferral::create([
                            'referrer_driver_id' => $refRecord->driver_id,
                            'referred_driver_id' => $user->id,
                            'referral_code' => $refRecord->code,
                            'referred_at' => now(),
                            'bonus_months_remaining' => 1,
                        ]);
                    }
                }
            } catch (\Illuminate\Database\QueryException $e) {
                if ($e->getCode() === '23000' && str_contains($e->getMessage(), 'users_email_unique')) {
                    return response()->json([
                        'success' => false,
                        'message' => 'البريد الإلكتروني مسجل مسبقاً. استخدم بريداً آخر أو اترك الحقل فارغاً.',
                    ], 422);
                }
                throw $e;
            }
        } else {
            // تحديث الرقم للتنسيق الموحد لضمان عدم التكرار مستقبلاً
            if ($user->phone !== $phone) {
                $user->update(['phone' => $phone]);
            }
        }

        $token = $user->createToken('auth_token')->plainTextToken;

        $otpUserPayload = [
            'id' => $user->id,
            'name' => $user->name,
            'phone' => $user->phone,
            'email' => $user->email,
            'user_type' => $user->user_type,
        ];
        if ($user->user_type === 'driver') {
            $otpUserPayload['account_verified'] = (bool) ($user->account_verified ?? false);
            $otpUserPayload['driver_verification_status'] = $user->driver_verification_status ?? 'none';
            $otpUserPayload['driver_legal_accepted_at'] = $user->driver_legal_accepted_at;
            $otpUserPayload['is_verified'] = (bool) ($user->account_verified ?? false);
        }

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

    /** التحقق من وجود رقم الهاتف في قاعدة البيانات (للتسجيل: يجب أن لا يكون موجوداً) */
    public function checkPhone(Request $request)
    {
        $validator = Validator::make($request->all(), [
            'phone' => 'required|string|max:20',
        ]);
        if ($validator->fails()) {
            return response()->json([
                'success' => false,
                'message' => 'يرجى إدخال رقم الهاتف',
                'errors' => $validator->errors(),
            ], 422);
        }

        $user = $this->findUserByPhone($request->phone);
        return response()->json([
            'success' => true,
            'exists' => $user !== null,
        ]);
    }

    /** توحيد رقم الهاتف العراقي للبحث والتخزين (964xxxxxxxxx) */
    protected function normalizePhone(string $phone): string
    {
        $phone = preg_replace('/\D/', '', $phone);
        if (strlen($phone) === 10 && (str_starts_with($phone, '07') || str_starts_with($phone, '01'))) {
            return '964' . substr($phone, 1);
        }
        if (strlen($phone) === 11 && str_starts_with($phone, '964')) {
            return $phone;
        }
        if (!str_starts_with($phone, '964')) {
            $phone = '964' . ltrim($phone, '0');
        }
        return $phone;
    }

    /** للتوافق مع الاسم القديم */
    protected function normalizePhoneForOtp(string $phone): string
    {
        return $this->normalizePhone($phone);
    }

    /** توحيد نوع المستخدم (restaurant_owner→restaurant_manager, gas_owner→gas_manager) */
    protected function normalizeUserType(?string $type): string
    {
        $t = strtolower(trim((string) $type));
        $allowed = ['passenger', 'driver', 'restaurant_manager', 'gas_manager', 'restaurant_owner', 'gas_owner'];
        if (!in_array($t, $allowed)) {
            return 'passenger';
        }
        if ($t === 'restaurant_owner') return 'restaurant_manager';
        if ($t === 'gas_owner') return 'gas_manager';
        return $t;
    }

    /** التحقق من أن المستخدم هو المستخدم التجريبي */
    protected function isTestUser(User $user): bool
    {
        if ($user->email === 'passenger@test.com') {
            return true;
        }
        $userDigits = preg_replace('/\D/', '', $user->phone ?? '');
        $testDigits = preg_replace('/\D/', '', self::TEST_PHONE);
        $testNormalized = '964' . ltrim($testDigits, '0');
        return $userDigits === $testDigits || $userDigits === $testNormalized;
    }

    /** التحقق من بيانات الدخول التجريبية (للفحص قبل رفع المتجر) */
    protected function isTestLoginCredentials(?string $loginInput, ?string $password): bool
    {
        if ($password !== self::TEST_PASSWORD) {
            return false;
        }
        $input = trim((string) $loginInput);
        if (str_contains($input, '@')) {
            return $input === 'passenger@test.com';
        }
        $digits = preg_replace('/\D/', '', $input);
        $testDigits = preg_replace('/\D/', '', self::TEST_PHONE);
        return $digits === $testDigits;
    }

    /** إنشاء المستخدم التجريبي للفحص (أو تحديثه إن وُجد) - دائماً كراكب */
    protected function createTestUser(): User
    {
        $phone = $this->normalizePhone(self::TEST_PHONE);
        $user = User::where('email', 'passenger@test.com')->first();
        if ($user) {
            $user->update([
                'phone' => $phone,
                'password' => self::TEST_PASSWORD,
                'user_type' => 'passenger', // التأكد من أنه راكب وليس أدمن
            ]);
            return $user->fresh();
        }
        return User::create([
            'name' => 'راكب تجريبي',
            'email' => 'passenger@test.com',
            'password' => self::TEST_PASSWORD,
            'phone' => $phone,
            'user_type' => 'passenger',
            'status' => 'active',
            'service_type' => 'all',
            'email_verified_at' => now(),
        ]);
    }

    /**
     * البحث عن مستخدم برقم الهاتف بأي تنسيق (مهم جداً لحفظ النقاط والهدايا)
     * يبحث بـ: 964xxx، 07xxx، 01xxx، 0xxx
     */
    protected function findUserByPhone(string $phone): ?User
    {
        $normalized = $this->normalizePhone($phone);
        $digits = preg_replace('/\D/', '', $phone);

        // البحث بالتنسيق الموحد أولاً
        $user = User::where('phone', $normalized)->first();
        if ($user) {
            return $user;
        }

        // البحث بتنسيق 07xxx أو 01xxx (الشائع في العراق)
        if (strlen($digits) >= 10) {
            $localFormat = (str_starts_with($digits, '964') ? '0' . substr($digits, 3) : $digits);
            if (strlen($localFormat) === 11 && str_starts_with($localFormat, '07')) {
                $user = User::where('phone', $localFormat)->first();
                if ($user) {
                    return $user;
                }
            }
            if (strlen($localFormat) === 11 && str_starts_with($localFormat, '01')) {
                $user = User::where('phone', $localFormat)->first();
                if ($user) {
                    return $user;
                }
            }
        }

        // البحث بالرقم الخام (أرقام فقط) للتوافق مع البيانات القديمة
        $cleaned = preg_replace('/\D/', '', $phone);
        if (strlen($cleaned) >= 10) {
            $user = User::where('phone', $cleaned)->first();
            if ($user) {
                return $user;
            }
            $user = User::where('phone', $phone)->first();
            if ($user) {
                return $user;
            }
        }

        return null;
    }

    public function logout(Request $request)
    {
        $request->user()->currentAccessToken()->delete();
        return response()->json(['success' => true, 'message' => 'Logged out']);
    }

    public function user(Request $request)
    {
        try {
            $user = $request->user();
            
            if (!$user) {
                return response()->json([
                    'success' => false,
                    'message' => 'المستخدم غير مسجل دخول'
                ], 401);
            }
            
            // جلب بيانات إضافية
            $userData = [
                'id' => $user->id,
                'name' => $user->name ?? '',
                'email' => $user->email ?? '',
                'phone' => $user->phone ?? '',
                'user_type' => $user->user_type ?? '',
                'address' => $user->address ?? '',
                'bio' => $user->bio ?? '',
                'birth_date' => $user->birth_date ?? '',
                'profile_image' => $user->profile_image ?? '',
                'governorate_id' => $user->governorate_id,
                'city_id' => $user->city_id,
                'created_at' => $user->created_at,
                'updated_at' => $user->updated_at,
            ];
            if (($user->user_type ?? '') === 'driver') {
                $userData['account_verified'] = (bool) ($user->account_verified ?? false);
                $userData['driver_verification_status'] = $user->driver_verification_status ?? 'none';
                $userData['driver_legal_accepted_at'] = $user->driver_legal_accepted_at;
                $userData['vehicle_type'] = $user->vehicle_type;
                $userData['vehicle_color'] = $user->vehicle_color;
                $userData['license_plate'] = $user->license_plate;
                $userData['vehicle_model_year'] = $user->vehicle_model_year;
                $userData['is_verified'] = (bool) ($user->account_verified ?? false);
            }
            
            \Log::info('🔍 بيانات المستخدم المرجعة:', $userData);
            
            return response()->json(['success' => true, 'data' => $userData]);
        } catch (\Exception $e) {
            \Log::error('❌ خطأ في جلب بيانات المستخدم: ' . $e->getMessage());
            return response()->json([
                'success' => false,
                'message' => 'خطأ في جلب بيانات المستخدم: ' . $e->getMessage()
            ], 500);
        }
    }

    public function updateUser(Request $request)
    {
        $user = $request->user();
        
        $validator = Validator::make($request->all(), [
            'name' => 'sometimes|string|max:255',
            'email' => 'sometimes|email|unique:users,email,' . $user->id,
            'phone' => 'sometimes|string|max:20',
            'address' => 'sometimes|string|max:500',
            'bio' => 'sometimes|string|max:1000',
            'birth_date' => 'sometimes|date',
            'governorate_id' => 'sometimes|integer|exists:governorates,id',
            'city_id' => 'sometimes|integer|exists:cities,id',
            // بيانات السائق
            'name_ar' => 'sometimes|string|max:255',
            'vehicle_type' => 'sometimes|string|max:100',
            'vehicle_color' => 'sometimes|string|max:100',
            'license_plate' => 'sometimes|string|max:20',
            'latitude' => 'sometimes|numeric',
            'longitude' => 'sometimes|numeric',
        ]);

        if ($validator->fails()) {
            return response()->json([
                'success' => false,
                'message' => 'خطأ في التحقق من البيانات',
                'errors' => $validator->errors()
            ], 422);
        }

        try {
            // تحديث بيانات المستخدم الأساسية
            $user->update($request->only([
                'name', 'email', 'phone', 'address', 'bio', 
                'birth_date', 'governorate_id', 'city_id'
            ]));

            // إذا كان المستخدم سائق، تحديث بيانات السائق
            if ($user->user_type === 'driver') {
                $driverData = $request->only([
                    'name_ar', 'vehicle_type', 'vehicle_color', 
                    'license_plate', 'latitude', 'longitude'
                ]);
                
                // إزالة القيم الفارغة
                $driverData = array_filter($driverData, function($value) {
                    return $value !== null && $value !== '';
                });
                
                if (!empty($driverData)) {
                    $user->update($driverData);
                }
            }

            return response()->json([
                'success' => true,
                'message' => 'تم تحديث البيانات بنجاح',
                'data' => $user->fresh()
            ]);
        } catch (\Exception $e) {
            \Log::error('❌ خطأ في تحديث بيانات المستخدم: ' . $e->getMessage());
            return response()->json([
                'success' => false,
                'message' => 'خطأ في تحديث البيانات: ' . $e->getMessage()
            ], 500);
        }
    }

    public function uploadProfileImage(Request $request)
    {
        try {
            $user = $request->user();
            
            $validator = Validator::make($request->all(), [
                'profile_image' => 'required|image|mimes:jpeg,png,jpg,gif|max:2048',
            ]);

            if ($validator->fails()) {
                return response()->json([
                    'success' => false,
                    'message' => 'خطأ في التحقق من الصورة',
                    'errors' => $validator->errors()
                ], 422);
            }

            if ($request->hasFile('profile_image')) {
                $file = $request->file('profile_image');
                $filename = time() . '_' . $user->id . '.' . $file->getClientOriginalExtension();
                $path = $file->storeAs('profile_images', $filename, 'public');
                
                // حذف الصورة القديمة إذا كانت موجودة
                if ($user->profile_image) {
                    $oldPath = storage_path('app/public/' . $user->profile_image);
                    if (file_exists($oldPath)) {
                        unlink($oldPath);
                    }
                }
                
                $user->update(['profile_image' => $path]);
                
                return response()->json([
                    'success' => true,
                    'message' => 'تم رفع الصورة بنجاح',
                    'data' => [
                        'image_url' => $path,
                        'full_url' => url('storage/' . $path)
                    ]
                ]);
            }

            return response()->json([
                'success' => false,
                'message' => 'لم يتم العثور على صورة'
            ], 400);

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

    public function changePassword(Request $request)
    {
        try {
            $user = $request->user();
            
            $validator = Validator::make($request->all(), [
                'current_password' => 'required|string',
                'new_password' => 'required|string|min:8',
                'new_password_confirmation' => 'required|string|same:new_password',
            ]);

            if ($validator->fails()) {
                return response()->json([
                    'success' => false,
                    'message' => 'خطأ في التحقق من البيانات',
                    'errors' => $validator->errors()
                ], 422);
            }

            // التحقق من كلمة المرور الحالية
            if (!Hash::check($request->current_password, $user->password)) {
                return response()->json([
                    'success' => false,
                    'message' => 'كلمة المرور الحالية غير صحيحة'
                ], 400);
            }

            // تحديث كلمة المرور
            $user->update([
                'password' => Hash::make($request->new_password)
            ]);

            return response()->json([
                'success' => true,
                'message' => 'تم تغيير كلمة المرور بنجاح'
            ]);

        } catch (\Exception $e) {
            \Log::error('❌ خطأ في تغيير كلمة المرور: ' . $e->getMessage());
            return response()->json([
                'success' => false,
                'message' => 'خطأ في تغيير كلمة المرور: ' . $e->getMessage()
            ], 500);
        }
    }
}
