<?php

namespace App\Http\Controllers\Api;

use App\Http\Controllers\Controller;
use App\Models\User;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Http;
use Illuminate\Support\Facades\Log;

class NotificationController extends Controller
{
    private $firebaseServerKey;
    private $firebaseProjectId;

    public function __construct()
    {
        $this->firebaseServerKey = env('FIREBASE_SERVER_KEY');
        $this->firebaseProjectId = env('FIREBASE_PROJECT_ID');
    }

    /**
     * إرسال إشعار للسائقين المتاحين
     */
    public function sendToDrivers(Request $request)
    {
        try {
            $validator = \Validator::make($request->all(), [
                'title' => 'required|string|max:255',
                'body' => 'required|string|max:500',
                'data' => 'nullable|array',
            ]);

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

            // جلب السائقين المتاحين
            $drivers = User::where('user_type', 'driver')
                ->where('is_active', true)
                ->whereNotNull('fcm_token')
                ->get();

            if ($drivers->isEmpty()) {
                return response()->json([
                    'success' => false,
                    'message' => 'لا يوجد سائقون متاحون'
                ], 404);
            }

            $results = [];
            foreach ($drivers as $driver) {
                $result = $this->sendNotificationToDevice(
                    $driver->fcm_token,
                    $request->title,
                    $request->body,
                    $request->data ?? []
                );
                
                $results[] = [
                    'driver_id' => $driver->id,
                    'driver_name' => $driver->name,
                    'success' => $result['success'],
                    'message' => $result['message']
                ];
            }

            return response()->json([
                'success' => true,
                'message' => 'تم إرسال الإشعارات',
                'data' => $results
            ]);

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

    /**
     * إرسال إشعار لراكب محدد
     */
    public function sendToPassenger(Request $request)
    {
        try {
            $validator = \Validator::make($request->all(), [
                'passenger_id' => 'required|string',
                'title' => 'required|string|max:255',
                'body' => 'required|string|max:500',
                'data' => 'nullable|array',
            ]);

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

            $passenger = User::find($request->passenger_id);
            if (!$passenger) {
                return response()->json([
                    'success' => false,
                    'message' => 'الراكب غير موجود'
                ], 404);
            }

            if (!$passenger->fcm_token) {
                return response()->json([
                    'success' => false,
                    'message' => 'الراكب غير مسجل للإشعارات'
                ], 400);
            }

            $result = $this->sendNotificationToDevice(
                $passenger->fcm_token,
                $request->title,
                $request->body,
                $request->data ?? []
            );

            return response()->json([
                'success' => $result['success'],
                'message' => $result['message'],
                'data' => [
                    'passenger_id' => $passenger->id,
                    'passenger_name' => $passenger->name,
                    'success' => $result['success']
                ]
            ]);

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

    /**
     * إرسال إشعار لسائق محدد
     */
    public function sendToDriver(Request $request)
    {
        try {
            $validator = \Validator::make($request->all(), [
                'driver_id' => 'required|string',
                'title' => 'required|string|max:255',
                'body' => 'required|string|max:500',
                'data' => 'nullable|array',
            ]);

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

            $driver = User::find($request->driver_id);
            if (!$driver) {
                return response()->json([
                    'success' => false,
                    'message' => 'السائق غير موجود'
                ], 404);
            }

            if (!$driver->fcm_token) {
                return response()->json([
                    'success' => false,
                    'message' => 'السائق غير مسجل للإشعارات'
                ], 400);
            }

            $result = $this->sendNotificationToDevice(
                $driver->fcm_token,
                $request->title,
                $request->body,
                $request->data ?? []
            );

            return response()->json([
                'success' => $result['success'],
                'message' => $result['message'],
                'data' => [
                    'driver_id' => $driver->id,
                    'driver_name' => $driver->name,
                    'success' => $result['success']
                ]
            ]);

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

    /**
     * تحديث FCM Token للمستخدم
     */
    public function updateFCMToken(Request $request)
    {
        try {
            $user = $request->user();
            
            $validator = \Validator::make($request->all(), [
                'fcm_token' => 'required|string',
            ]);

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

            $user->update([
                'fcm_token' => $request->fcm_token
            ]);

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

        } catch (\Exception $e) {
            Log::error('خطأ في تحديث FCM Token: ' . $e->getMessage());
            return response()->json([
                'success' => false,
                'message' => 'خطأ في تحديث FCM Token: ' . $e->getMessage()
            ], 500);
        }
    }

    /**
     * إرسال إشعار لجهاز محدد عبر Firebase
     */
    private function sendNotificationToDevice($fcmToken, $title, $body, $data = [])
    {
        try {
            if (!$this->firebaseServerKey) {
                return [
                    'success' => false,
                    'message' => 'FIREBASE_SERVER_KEY غير محدد'
                ];
            }

            $url = 'https://fcm.googleapis.com/fcm/send';
            
            $payload = [
                'to' => $fcmToken,
                'notification' => [
                    'title' => $title,
                    'body' => $body,
                    'sound' => 'default',
                    'click_action' => 'FLUTTER_NOTIFICATION_CLICK'
                ],
                'data' => $data,
                'priority' => 'high'
            ];

            $response = Http::withHeaders([
                'Authorization' => 'key=' . $this->firebaseServerKey,
                'Content-Type' => 'application/json',
            ])->post($url, $payload);

            if ($response->successful()) {
                $responseData = $response->json();
                if (isset($responseData['success']) && $responseData['success'] == 1) {
                    return [
                        'success' => true,
                        'message' => 'تم إرسال الإشعار بنجاح'
                    ];
                } else {
                    return [
                        'success' => false,
                        'message' => 'فشل في إرسال الإشعار: ' . ($responseData['results'][0]['error'] ?? 'خطأ غير معروف')
                    ];
                }
            } else {
                return [
                    'success' => false,
                    'message' => 'خطأ في الاتصال بـ Firebase: ' . $response->status()
                ];
            }

        } catch (\Exception $e) {
            return [
                'success' => false,
                'message' => 'خطأ في إرسال الإشعار: ' . $e->getMessage()
            ];
        }
    }

    /**
     * إشعار طلب تاكسي جديد للسائقين
     */
    public function notifyNewTaxiRequest(Request $request)
    {
        try {
            $validator = \Validator::make($request->all(), [
                'request_id' => 'required|string',
                'passenger_name' => 'required|string',
                'from_address' => 'required|string',
                'to_address' => 'required|string',
                'price' => 'required|numeric',
            ]);

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

            $title = 'طلب تاكسي جديد';
            $body = "طلب من {$request->passenger_name} من {$request->from_address} إلى {$request->to_address} - {$request->price} د.ع";
            
            $data = [
                'type' => 'new_taxi_request',
                'request_id' => $request->request_id,
                'passenger_name' => $request->passenger_name,
                'from_address' => $request->from_address,
                'to_address' => $request->to_address,
                'price' => $request->price,
            ];

            return $this->sendToDrivers(new Request([
                'title' => $title,
                'body' => $body,
                'data' => $data
            ]));

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

    /**
     * إشعار قبول الطلب للراكب
     */
    public function notifyRequestAccepted(Request $request)
    {
        try {
            $validator = \Validator::make($request->all(), [
                'passenger_id' => 'required|string',
                'request_id' => 'required|string',
                'driver_name' => 'required|string',
                'driver_phone' => 'required|string',
            ]);

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

            $title = 'تم قبول طلبك';
            $body = "السائق {$request->driver_name} قبل طلبك. رقم الهاتف: {$request->driver_phone}";
            
            $data = [
                'type' => 'request_accepted',
                'request_id' => $request->request_id,
                'driver_name' => $request->driver_name,
                'driver_phone' => $request->driver_phone,
            ];

            return $this->sendToPassenger(new Request([
                'passenger_id' => $request->passenger_id,
                'title' => $title,
                'body' => $body,
                'data' => $data
            ]));

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

    /**
     * إشعار وصول السائق للراكب
     */
    public function notifyDriverArrived(Request $request)
    {
        try {
            $validator = \Validator::make($request->all(), [
                'passenger_id' => 'required|string',
                'request_id' => 'required|string',
                'driver_name' => 'required|string',
            ]);

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

            $title = 'وصل السائق';
            $body = "السائق {$request->driver_name} وصل إلى موقعك";
            
            $data = [
                'type' => 'driver_arrived',
                'request_id' => $request->request_id,
                'driver_name' => $request->driver_name,
            ];

            return $this->sendToPassenger(new Request([
                'passenger_id' => $request->passenger_id,
                'title' => $title,
                'body' => $body,
                'data' => $data
            ]));

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