package com.za.common.util

import android.content.Context
import android.content.Intent
import android.content.pm.PackageManager
import androidx.core.net.toUri
import androidx.exifinterface.media.ExifInterface
import com.amap.api.maps.model.LatLng
import com.amap.api.services.core.LatLonPoint
import com.amap.api.services.geocoder.GeocodeSearch
import com.amap.api.services.geocoder.RegeocodeQuery
import com.za.common.log.LogUtil
import com.za.ext.toJson
import java.io.IOException
import java.text.SimpleDateFormat
import java.util.Locale
import kotlin.math.atan2
import kotlin.math.cos
import kotlin.math.sin
import kotlin.math.sqrt


object MapUtil {

	const val PN_GAODE_MAP : String = "com.autonavi.minimap" // 高德地图包名
	const val PN_BAIDU_MAP : String = "com.baidu.BaiduMap" // 百度地图包名
	const val PN_TENCENT_MAP : String = "com.tencent.map" // 百度地图包名

	/**
	 * 火星坐标系 (GCJ-02) 与百度坐标系 (BD-09) 的转换
	 * 即谷歌、高德 转 百度
	 *
	 * @param latLng
	 * @returns
	 */
	fun gcj02ToBD09(latLng : LatLng) : LatLng {
		val xPI = 3.141592653589793 * 3000.0 / 180.0
		val z =
			sqrt(latLng.longitude * latLng.longitude + latLng.latitude * latLng.latitude) + 0.00002 * sin(
				latLng.latitude * xPI)
		val theta =
			atan2(latLng.latitude, latLng.longitude) + 0.000003 * cos(latLng.longitude * xPI)
		val bdLat = z * sin(theta) + 0.006
		val bdLng = z * cos(theta) + 0.0065
		return LatLng(bdLat, bdLng)
	}

	/**
	 * 检查应用是否安装
	 *
	 * @return
	 */
	fun isGdMapInstalled(context : Context) : Boolean {
		return isInstallPackage(context, PN_GAODE_MAP)
	}

	fun isBaiduMapInstalled(context : Context) : Boolean {
		return isInstallPackage(context, PN_BAIDU_MAP)
	}

	fun isTencentInstalled(context : Context) : Boolean {
		return isInstallPackage(context, PN_TENCENT_MAP)
	}

	private fun isInstallPackage(context : Context, packageName : String) : Boolean {
		try {
			val info = context.packageManager.getApplicationInfo(packageName,
				PackageManager.GET_UNINSTALLED_PACKAGES)
			return true
		} catch (e : PackageManager.NameNotFoundException) {
			return false
		}
	}


	//开启高德导航
	fun startNavigationGd(context : Context, lat : Double?, lng : Double?, address : String?) {
		val stringBuffer =
			"androidamap://route?sourceApplication=amap&dlat=$lat&dlon=$lng&dname=$address&dev=0&t=0"
		val intent = Intent("android.intent.action.VIEW", stringBuffer.toUri())
		intent.setPackage("com.autonavi.minimap")
		intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK)
		context.startActivity(intent)
	}

	//开启高德导航
	fun startNavigationBd(context : Context, lat : Double?, lng : Double?, address : String?) {
		val i1 = Intent("android.intent.action.VIEW")
		i1.setData("baidumap://map/navi?query=${address}&mode=driving&location=${lat},${lng}&coord_type=gcj02&src=com.za.servicing".toUri())
		context.startActivity(i1)
	}

	//开启高德导航
	fun startNavigationTencent(context : Context, lat : Double?, lng : Double?, address : String?) {
		val stringBuffer =
			"androidamap://route?sourceApplication=amap&dlat=$lat&dlon=$lng&dname=$address&dev=0&t=0"
		val intent = Intent("android.intent.action.VIEW", stringBuffer.toUri())
		intent.setPackage("com.autonavi.minimap")
		intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK)
		context.startActivity(intent)
	}


	fun getAddressFromLocation(context : Context, latLng : LatLng?) : String? {
		if (latLng == null) {
			return null
		}
		try {
			val geocoderSearch = GeocodeSearch(context)
			val point = LatLonPoint(latLng.latitude, latLng.longitude)
			val query = RegeocodeQuery(point, 200f, GeocodeSearch.AMAP)
			return geocoderSearch.getFromLocation(query).formatAddress
		} catch (e : Exception) {
			LogUtil.print("geoCoderFromPhoto 获取地址异常", e)
			return null
		}
	}

	//	fun getAddressFromLocation(context : Context, latLng : LatLng?) : String? {
	//		if (latLng == null) {
	//			return null
	//		}
	//		val geocoder = Geocoder(context, Locale.getDefault())
	//		try {
	//			val addresses = geocoder.getFromLocation(latLng.latitude, latLng.longitude, 1)
	//			if (addresses != null && ! addresses.isEmpty()) {
	//				val address = addresses[0]
	//				val sb = StringBuilder()
	//				for (i in 0 .. address.maxAddressLineIndex) {
	//					sb.append(address.getAddressLine(i))
	//					if (i < address.maxAddressLineIndex) {
	//						sb.append(", ")
	//					}
	//				}
	//				val addressStr = sb.toString()
	//				LogUtil.print("获取照片地址", addressStr)
	//				return addressStr
	//			}
	//		} catch (e : IOException) {
	//			LogUtil.print("获取照片地址异常", e)
	//		}
	//		return null
	//	}

	fun getExifLatLng(localPath : String) : LatLng? {
		try {
			val exif = ExifInterface(localPath)
			val latLong = exif.latLong
			if (exif.getLatLong() != null) {
				val lat = latLong?.get(0)
				val lng = latLong?.get(1)

				if (lat == 0.0 || lng == 0.0) {
					LogUtil.print("获取照片的经纬度为空", "null1")
					return null
				}

				val latlng = LatLng(lat !!, lng !!)
				LogUtil.print("获取照片的经纬度", latlng.toJson().toString())
				return latlng
			} else {
				LogUtil.print("获取照片的经纬度为空", "null2")
			}
		} catch (e : IOException) {
			LogUtil.print("获取照片拍摄时间异常", e)
			return null
		}
		return null
	}

	fun getPhotoTime(localPath : String) : String? {
		try {
			val exif = ExifInterface(localPath)            // 获取拍摄时间（格式通常为：YYYY:MM:DD HH:MM:SS）
			val dateTime = exif.getAttribute(ExifInterface.TAG_DATETIME)
			if (dateTime != null) {                // 转换时间格式（可选）
				val srcFormat = SimpleDateFormat("yyyy:MM:dd HH:mm:ss", Locale.getDefault())
				val destFormat = SimpleDateFormat("yyyy-MM-dd HH:mm:ss", Locale.getDefault())
				val date = srcFormat.parse(dateTime)
				return destFormat.format(date)
			}
		} catch (e : IOException) {
			LogUtil.print("获取照片拍摄时间异常", e)
		}
		return null
	}
}