import UIKit
import Flutter
import FirebaseCore

import CoreLocation

@main
@objc class AppDelegate: FlutterAppDelegate {
    
    let locationManager = CLLocationManager()

    override func application(
        _ application: UIApplication,
        didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?
    ) -> Bool {
        

        
        // Now continue with the rest of the app initialization.
        FirebaseApp.configure()
        GeneratedPluginRegistrant.register(with: self)

        // التأكد من أن الجهاز غير مخترق قبل تشغيل التطبيق
        if SecurityChecks.isDeviceCompromised() {
            showSecurityAlert()
            return false
        }

        // تهيئة قنوات الاتصال مع Flutter
        setupMethodChannel()

        // ضبط مدير الموقع لمتابعة تغييرات الأذونات
        locationManager.delegate = self
        locationManager.requestWhenInUseAuthorization()

        return super.application(application, didFinishLaunchingWithOptions: launchOptions)
    }

    // MARK: - تهيئة القناة بين Swift و Flutter
    func setupMethodChannel() {
        guard let controller = window?.rootViewController as? FlutterViewController else {
            return
        }

        let channel = FlutterMethodChannel(name: "com.siro.siro_driver/security",
                                           binaryMessenger: controller.binaryMessenger)
        channel.setMethodCallHandler { call, result in
            switch call.method {
            case "isNativeRooted":
                result(SecurityChecks.isDeviceCompromised())
            default:
                result(FlutterMethodNotImplemented)
            }
        }
    }

    // MARK: - عرض تنبيه عند اكتشاف جهاز مخترق
    func showSecurityAlert() {
        guard let rootVC = UIApplication.shared.keyWindow?.rootViewController else {
            exit(0)
        }

        let alert = UIAlertController(
            title: "Security Warning".localized,
            message: "Compromised device detected. Exiting.".localized,
            preferredStyle: .alert
        )

        alert.addAction(UIAlertAction(title: "OK".localized, style: .destructive) { _ in
            self.obfuscatedExit()
        })

        if #available(iOS 15.0, *) {
            alert.popoverPresentationController?.sourceView = rootVC.view
            alert.popoverPresentationController?.sourceRect = CGRect(x: rootVC.view.bounds.midX, y: rootVC.view.bounds.midY, width: 0, height: 0)
            alert.popoverPresentationController?.permittedArrowDirections = []
            alert.presentationController?.delegate = self

            if let presentationController = alert.presentationController as? UISheetPresentationController {
                presentationController.detents = [.medium()]
                presentationController.preferredCornerRadius = 20
                presentationController.prefersEdgeAttachedInCompactHeight = true
                presentationController.prefersGrabberVisible = false
            }
        }

        rootVC.present(alert, animated: true, completion: nil)
    }

    // MARK: - إخفاء عملية الخروج بطريقة مشفرة
    func obfuscatedExit() {
        let selector = NSSelectorFromString(String(format: "%@%@", "ex", "it:"))
        if responds(to: selector) {
            perform(selector, with: 0)
        }
    }


}

// MARK: - التعامل مع أذونات الموقع بطريقة آمنة
extension AppDelegate: CLLocationManagerDelegate {
    func locationManagerDidChangeAuthorization(_ manager: CLLocationManager) {
        if #available(iOS 14.0, *) {
            let status = manager.authorizationStatus
            switch status {
            case .authorizedWhenInUse, .authorizedAlways:
                print("Authorization granted")
            case .denied, .restricted:
                print("Authorization denied")
            case .notDetermined:
                manager.requestWhenInUseAuthorization()
            @unknown default:
                break
            }
        } else {
            // لنظام iOS 13 وما قبله، نستخدم الطريقة القديمة
            let status = CLLocationManager.authorizationStatus()
            switch status {
            case .authorizedWhenInUse, .authorizedAlways:
                print("Authorization granted")
            case .denied, .restricted:
                print("Authorization denied")
            case .notDetermined:
                manager.requestWhenInUseAuthorization()
            @unknown default:
                break
            }
        }
    }
}

// MARK: - منع إغلاق التنبيهات الأمنية
extension AppDelegate: UIAdaptivePresentationControllerDelegate {
    func presentationControllerShouldDismiss(_ presentationController: UIPresentationController) -> Bool {
        return false
    }
}

// MARK: - دعم الترجمة للنصوص
extension String {
    var localized: String {
        return NSLocalizedString(self, tableName: nil, bundle: Bundle.main, value: "", comment: "")
    }
}
