import Foundation
import React
import SystemConfiguration.CaptiveNetwork
import NetworkExtension
import CoreBluetooth

@objc(NetworkInfoModule)
class NetworkInfoModule: NSObject {
  
  @objc
  static func requiresMainQueueSetup() -> Bool {
    return false
  }
  
  @objc
  func getNetworkInfo(_ resolve: @escaping RCTPromiseResolveBlock, rejecter reject: @escaping RCTPromiseRejectBlock) -> Void {
    DispatchQueue.global(qos: .background).async {
      let networkInfo = self.collectNetworkInfo()
      DispatchQueue.main.async {
        resolve(networkInfo)
      }
    }
  }
  
  private func collectNetworkInfo() -> [String: Any] {
    var result: [String: Any] = [:]
    
    // Collect WiFi information
    let wifiInfo = self.getWifiInfo()
    result["wifi"] = wifiInfo
    
    // Collect Bluetooth information
    let bluetoothInfo = self.getBluetoothInfo()
    result["bluetooth"] = bluetoothInfo
    
    // Collect Cellular information
    let cellularInfo = self.getCellularInfo()
    result["cellular"] = cellularInfo
    
    return result
  }
  
  private func getWifiInfo() -> [[String: String]] {
    var wifiArray: [[String: String]] = []
    
    // Try to get current WiFi network information
    if let interfaces = CNCopySupportedInterfaces() as NSArray? {
      for interface in interfaces {
        if let interfaceInfo = CNCopyCurrentNetworkInfo(interface as! CFString) as NSDictionary? {
          let ssid = interfaceInfo[kCNNetworkInfoKeySSID as String] as? String ?? "Unknown"
          let bssid = interfaceInfo[kCNNetworkInfoKeyBSSID as String] as? String ?? "Unknown"
          
          wifiArray.append([
            "ssid": ssid,
            "bssid": bssid
          ])
          
          print("🌐 iOS NetworkInfo: Found WiFi - SSID: \(ssid), BSSID: \(bssid)")
        }
      }
    }
    
    // If no WiFi info found, return default
    if wifiArray.isEmpty {
      wifiArray.append([
        "ssid": "Unknown",
        "bssid": "Unknown"
      ])
    }
    
    return wifiArray
  }
  
  private func getBluetoothInfo() -> [[String: String]] {
    // Bluetooth information collection would require CoreBluetooth
    // For now, return default values
    return [[
      "ssid": "Unknown",
      "bssid": "Unknown"
    ]]
  }
  
  private func getCellularInfo() -> String {
    // Cellular information would require CoreTelephony
    // For now, return default value
    return "Unknown"
  }
  
  @objc
  func getWifiSSID(_ resolve: @escaping RCTPromiseResolveBlock, rejecter reject: @escaping RCTPromiseRejectBlock) -> Void {
    DispatchQueue.global(qos: .background).async {
      let ssid = self.getCurrentSSID()
      DispatchQueue.main.async {
        resolve(ssid)
      }
    }
  }
  
  @objc
  func getWifiBSSID(_ resolve: @escaping RCTPromiseResolveBlock, rejecter reject: @escaping RCTPromiseRejectBlock) -> Void {
    DispatchQueue.global(qos: .background).async {
      let bssid = self.getCurrentBSSID()
      DispatchQueue.main.async {
        resolve(bssid)
      }
    }
  }
  
  private func getCurrentSSID() -> String {
    if let interfaces = CNCopySupportedInterfaces() as NSArray? {
      for interface in interfaces {
        if let interfaceInfo = CNCopyCurrentNetworkInfo(interface as! CFString) as NSDictionary? {
          if let ssid = interfaceInfo[kCNNetworkInfoKeySSID as String] as? String {
            return ssid
          }
        }
      }
    }
    return "Unknown"
  }
  
  private func getCurrentBSSID() -> String {
    if let interfaces = CNCopySupportedInterfaces() as NSArray? {
      for interface in interfaces {
        if let interfaceInfo = CNCopyCurrentNetworkInfo(interface as! CFString) as NSDictionary? {
          if let bssid = interfaceInfo[kCNNetworkInfoKeyBSSID as String] as? String {
            return bssid
          }
        }
      }
    }
    return "Unknown"
  }
}
