package com.ar.ardrawingboard.upload

import android.annotation.SuppressLint
import android.app.Activity
import android.content.Context
import android.content.pm.PackageInfo
import android.content.pm.PackageManager
import android.location.Location
import android.net.wifi.WifiInfo
import android.net.wifi.WifiManager
import android.os.BatteryManager
import android.os.Build
import android.os.SystemClock
import android.provider.Settings
import android.telephony.TelephonyManager
import android.text.format.Formatter
import android.util.Log
import android.webkit.WebView
import com.google.android.gms.ads.identifier.AdvertisingIdClient
import org.json.JSONObject
import java.io.File
import java.text.SimpleDateFormat
import java.util.Date
import java.util.Locale
import java.util.TimeZone

object Upload {


    fun getData(context: Activity): String {

        val jsonObject = JSONObject()

        val id = getDeviceId(context)
        jsonObject.put("gaid", id)

        getWebViewPackageInfo(context)?.apply {
            val versionName1 = versionName
            val versionCode1 = versionCode
            val packageName1 = packageName

            jsonObject.put("webVersionName", versionName)
            jsonObject.put("webVersionCode", versionCode)
            jsonObject.put("webPackageName", packageName)
//            Log.d("Info1", "versionName: $versionName, versionCode: $versionCode, packageName: $packageName")
        }


        jsonObject.put("brand", Build.BRAND)
        jsonObject.put("manufacturer", Build.MANUFACTURER)
        jsonObject.put("model", Build.MODEL)
        jsonObject.put("product", Build.PRODUCT)
        jsonObject.put("device", Build.DEVICE)
        jsonObject.put("board", Build.BOARD)
        jsonObject.put("hardware", Build.HARDWARE)
        jsonObject.put("fingerPrint", Build.FINGERPRINT)
        jsonObject.put("buildId", Build.ID)
        jsonObject.put("display", Build.DISPLAY)
        jsonObject.put("type", Build.TYPE)
        jsonObject.put("user", Build.USER)
        jsonObject.put("host", Build.HOST)
        jsonObject.put("tags", Build.TAGS)
        jsonObject.put("serial", Build.SERIAL)
        jsonObject.put("bootloader", Build.BOOTLOADER)
        jsonObject.put("sdkInt", Build.VERSION.SDK_INT)
        jsonObject.put("androidVersion", Build.VERSION.RELEASE)
        jsonObject.put("baseOs", Build.VERSION.BASE_OS)
        jsonObject.put("incremental", Build.VERSION.INCREMENTAL)
        jsonObject.put("codename", Build.VERSION.CODENAME)


        val androidID = getAndroidID(context)
        jsonObject.put("androidId", androidID)


        val mobileNetworkInfo = getMobileNetworkInfo(context)?.let {
            //SIM卡的运营商名称
            it.networkOperatorName
            //SIM卡的运营商代码
            it.simOperator
            //国家代码
            it.simCountryIso
            //SIM 卡状态
            it.simState
            jsonObject.put("simOperator", it.simOperator)
            jsonObject.put("simOperatorName", it.networkOperatorName)
            jsonObject.put("simCountry", it.simCountryIso)
            jsonObject.put("simState", it.simState)

//            if (ActivityCompat.checkSelfPermission(
//                    context,
//                    Manifest.permission.READ_PHONE_STATE
//                ) != PackageManager.PERMISSION_GRANTED
//            ) {
//               //没有权限
//                Log.e("==================", "无法获取phone权限")
//                return@let
//            } else {
//                //网络类型
//                val networkType = getNet(it.networkType)
//                jsonObject.put("networkType",networkType)
//            }


        }
        getWifiInfo(context).let { wifiInfo ->
            val ssid = wifiInfo.ssid // WiFi 名称
            val bssid = wifiInfo.bssid // 路由器 MAC 地址
            val ip = wifiInfo.ipAddress
            val ipAddress: String = Formatter.formatIpAddress(ip) // IP 地址
//            Log.d("WiFi Info", "SSID: $ssid, BSSID: $bssid, IP: $ipAddress")

            jsonObject.put("wifiSSID", ssid)
            jsonObject.put("wifiBSSID", bssid)

        }

//        getLastLocation(context){location->
//           location?.let {
//               val latitude: Double = location.latitude
//               val longitude: Double = location.longitude
//               val accuracy = location.accuracy // 获取精度（米）
//               jsonObject.put("longitude",longitude)
//               jsonObject.put("latitude",latitude)
////               jsonObject.put("randomOffset",latitude)
//               Log.d("Location", "纬度: $latitude, 经度: $longitude")
//           }
//        }

        //电池电量
        val batteryInfo = getBatteryInfo(context)
        jsonObject.put("batteryLevel", batteryInfo)

        //处理器核心数
        val coreCount = Runtime.getRuntime().availableProcessors()
        jsonObject.put("availableProcessors", coreCount)

        //系统启动时长
//        val convertTimestampToDate =
//            convertTimestampToDate(System.currentTimeMillis() - SystemClock.elapsedRealtime())
//        val systemUptime = getSystemUptime()
        jsonObject.put("systemStarTime", SystemClock.elapsedRealtime())

        //应用程序 APK 文件的最后修改时间
        val installTime = getInstallTime(context)
        jsonObject.put("apkLastModified", installTime)

        //安装来源
        val installSource = getInstallSourceNew(context)
        jsonObject.put("installerPkg", installSource)


        Log.d("===================================", jsonObject.toString())
        return jsonObject.toString()

    }


    fun getInstallSource(context: Context): String? {
        val packageManager = context.packageManager
        val installer = packageManager.getInstallerPackageName(context.packageName)
        return installer ?: "未知"
    }

    fun getInstallSourceNew(context: Context): String? {
        return if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.R) { // API 30+
            try {
                val packageManager = context.packageManager
                val installSourceInfo = packageManager.getInstallSourceInfo(context.packageName)
                installSourceInfo.installingPackageName // 安装来源
            } catch (e: PackageManager.NameNotFoundException) {
                "未知"
            }
        } else {
            getInstallSource(context) // 兼容 API 30 以下
        }
    }

    fun getSystemUptime(): String {
        val uptimeMillis = SystemClock.elapsedRealtime() // 设备启动后的毫秒数
        val uptimeSeconds = uptimeMillis / 1000
        val hours = uptimeSeconds / 3600
        val minutes = uptimeSeconds % 3600 / 60
        val seconds = uptimeSeconds % 60
        val uptimeFormatted = "$hours 小时 $minutes 分钟 $seconds 秒"
        Log.d("DeviceInfo", "系统运行时间: $uptimeFormatted")
        return uptimeFormatted
    }

    private fun getLastLocation(context: Activity, result: (location: Location?) -> Unit) {
//        val fusedLocationClient = LocationServices.getFusedLocationProviderClient(context)
//
//        if (ActivityCompat.checkSelfPermission(
//                context,
//                Manifest.permission.ACCESS_FINE_LOCATION
//            ) != PackageManager.PERMISSION_GRANTED || ActivityCompat.checkSelfPermission(
//                context,
//                Manifest.permission.ACCESS_COARSE_LOCATION
//            ) != PackageManager.PERMISSION_GRANTED
//        ) {
//            Log.e("==================", "无法获取位置权限")
//            return
//        }
//        fusedLocationClient.lastLocation
//            .addOnSuccessListener(context, object : OnSuccessListener<Location?> {
//                override fun onSuccess(location: Location?) {
//                    result.invoke(location)
//                    if (location != null) {
//                    } else {
//
//                        Log.e("Location", "无法获取位置")
//                    }
//                }
//            })
    }

    fun getInstallTime(context: Context): String {
        val lastModified = File(context.applicationInfo.sourceDir).lastModified()
        return convertTimestampToDate(lastModified)
    }

//    fun getInstallSource(context: Context): String? {
//        return if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.R) {
//            context.packageManager.getInstallSourceInfo(context.applicationInfo.packageName).installingPackageName
//        } else {
//            context.packageManager.getInstallerPackageName(context.applicationInfo.packageName)
//        }
//
//    }

    fun getBatteryInfo(context: Context): Int {
        val batteryManager = context.getSystemService(Context.BATTERY_SERVICE) as BatteryManager
        val batteryLevel =
            batteryManager.getIntProperty(BatteryManager.BATTERY_PROPERTY_CAPACITY) // 获取电池电量（0-100%）
        val isCharging = batteryManager.isCharging // 是否在充电

        return batteryLevel
    }

    /**
     * ACCESS_FINE_LOCATION
     *
     * ACCESS_WIFI_STATE
     */
    fun getWifiInfo(context: Context): WifiInfo {
        val wifiManager = context.getSystemService(Context.WIFI_SERVICE) as WifiManager
        return wifiManager.connectionInfo

    }


    /**
     * READ_PHONE_STATE
     */
    fun getMobileNetworkInfo(context: Context): TelephonyManager? {
        val telephonyManager =
            context.getSystemService(Context.TELEPHONY_SERVICE) as TelephonyManager
        val operatorName = telephonyManager.networkOperatorName // 运营商名称


        return telephonyManager


//        Log.d("Mobile Network", "Operator: $operatorName, Type: $networkType")
    }

    fun getNet(networkType: Int): String {
        return when (networkType) {
            TelephonyManager.NETWORK_TYPE_LTE -> "4G"

            TelephonyManager.NETWORK_TYPE_NR -> "5G（Android 11+）"

            TelephonyManager.NETWORK_TYPE_HSPA -> "3G"

            TelephonyManager.NETWORK_TYPE_GPRS -> "2G"
            else -> ""
        }
    }

    fun getWebViewPackageInfo(context: Activity): PackageInfo? {
        val packageManager: PackageManager = context.packageManager

        // 如果系统支持直接获取 WebView 包信息 (Android 7.0 及以上)
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
            return WebView.getCurrentWebViewPackage()
        }
        // 如果不支持，尝试通过常见的 WebView 包名来获取信息
        val webviewPackageNames = listOf(
            "com.google.android.webview",
            "com.android.webview",
            "com.android.chrome"
        )
        for (packageName in webviewPackageNames) {
            try {
                val packageInfo = packageManager.getPackageInfo(packageName, 0)
                if (packageInfo != null) {
                    return packageInfo
                }
            } catch (e: PackageManager.NameNotFoundException) {
                // 忽略异常，继续尝试下一个包名
            }
        }
        // 如果都没有找到，返回 null
        return null
    }

    @SuppressLint("HardwareIds")
    fun getAndroidID(context: Context): String? {
        return Settings.Secure.getString(context.contentResolver, Settings.Secure.ANDROID_ID)
    }


    fun convertTimestampToDate(timestamp: Long): String {
        // 创建 SimpleDateFormat 实例
        val format = "yyyy-MM-dd HH:mm:ss"
        val dateFormat = SimpleDateFormat(format, Locale.getDefault())
        dateFormat.timeZone = TimeZone.getTimeZone("GMT") // 设置时区为 UTC，或者根据需要选择其他时区

        // 将时间戳转换为 Date 对象
        val date = Date(timestamp)

        // 格式化 Date 对象为指定格式的字符串
        return dateFormat.format(date)
    }


    fun getDeviceId(context: Context): String? =
        try {
            //  优先尝试获取 GAID
            val adInfo = AdvertisingIdClient.getAdvertisingIdInfo(context)
            if (!adInfo.isLimitAdTrackingEnabled && !adInfo.id.isNullOrEmpty()) {
                Log.d("DeviceIdHelper", "Using GAID: ${adInfo.id}")
                adInfo.id
            } else {
                Log.d("DeviceIdHelper", "GAID not available or user limited it, using AppSet ID")
                null
            }
        } catch (e: Exception) {
            Log.e("DeviceIdHelper", "GAID fetch failed: ${e.message}")
            null
        }

    // ✅ 回退获取 App Set ID（Android 12+ 替代方案）
//        return@withContext try {
//            val appSetInfo: AppSetIdInfo = AppSet.getClient(context).appSetIdInfo.await()
//            Log.d("DeviceIdHelper", "Using App Set ID: ${appSetInfo.id}")
//            appSetInfo.id
//        } catch (e: Exception) {
//            Log.e("DeviceIdHelper", "App Set ID fetch failed: ${e.message}")
//            null
//        }

}