package uts.sdk.modules.baidumapView

import android.content.Context
import android.view.View
import android.util.Log
import com.baidu.mapapi.map.BaiduMap
import com.baidu.mapapi.map.MapView
import com.baidu.mapapi.map.BaiduMapOptions;
import com.baidu.mapapi.model.LatLng
import com.baidu.mapapi.model.LatLngBounds
import com.baidu.mapapi.utils.CoordinateConverter
import com.baidu.mapapi.utils.DistanceUtil
import com.baidu.mapapi.utils.SpatialRelationUtil

/**
 * 百度地图实现类
 * 
 * 遵循百度地图 Android SDK 规范：
 * 1. 隐私合规（v7.5.0+）：setAgreePrivacy 必须在 initialize 之前调用
 * 2. 坐标系：默认 BD09LL，可配置为 GCJ02
 * 3. MapView 生命周期：必须在 Activity 生命周期中正确调用 onResume/onPause/onDestroy
 */
class BmapMapImpl {
    
    private var mapView: MapView? = null
    private var baiduMap: BaiduMap? = null
    
    companion object {
        @JvmStatic
        fun bd09llToGcj02(lat: Double, lng: Double): DoubleArray {
            val converter = CoordinateConverter()
            converter.from(CoordinateConverter.CoordType.BD09LL)
            converter.coord(LatLng(lat, lng))
            val result = converter.convert()
            return doubleArrayOf(result.latitude, result.longitude)
        }

        @JvmStatic
        fun gcj02ToBd09ll(lat: Double, lng: Double): DoubleArray {
            val converter = CoordinateConverter()
            converter.from(CoordinateConverter.CoordType.COMMON)
            converter.coord(LatLng(lat, lng))
            val result = converter.convert()
            return doubleArrayOf(result.latitude, result.longitude)
        }

        @JvmStatic
        fun getDistance(fromLat: Double, fromLng: Double, toLat: Double, toLng: Double): Double {
            return DistanceUtil.getDistance(LatLng(fromLat, fromLng), LatLng(toLat, toLng))
        }

        @JvmStatic
        fun isPointInPolygon(pointLat: Double, pointLng: Double, polygonLatList: DoubleArray, polygonLngList: DoubleArray): Boolean {
            val polygonPoints = ArrayList<LatLng>()
            for (index in polygonLatList.indices) {
                polygonPoints.add(LatLng(polygonLatList[index], polygonLngList[index]))
            }
            return SpatialRelationUtil.isPolygonContainsPoint(polygonPoints, LatLng(pointLat, pointLng))
        }

        @JvmStatic
        fun isPointInBounds(pointLat: Double, pointLng: Double, northeastLat: Double, northeastLng: Double, southwestLat: Double, southwestLng: Double): Boolean {
            val bounds = LatLngBounds.Builder()
                .include(LatLng(southwestLat, southwestLng))
                .include(LatLng(northeastLat, northeastLng))
                .build()
            return bounds.contains(LatLng(pointLat, pointLng))
        }
    }
    
    /**
     * 初始化并获取地图 View
     * 
     * 初始化流程：
     * 1. 设置隐私合规（必须在 initialize 之前）
     * 2. 初始化 SDK
     * 3. 设置坐标系（BD09LL 或 GCJ02）
     * 4. 创建 MapView 并配置
     */
     fun getMap(context: Context,option : BaiduMapOptions): View {
        
        // 创建 MapView
        mapView = MapView(context,option)
        baiduMap = mapView?.map
        
        return mapView as MapView
    }
	
	fun getController():BaiduMap{
		return baiduMap as BaiduMap
	}
    
    // ==================== 生命周期方法（必须正确调用） ====================
    
     fun onStart() {
        // 百度地图 MapView 没有 onStart 方法
    }
    
     fun onResume() {
        mapView?.onResume()
    }
    
     fun onPause() {
        mapView?.onPause()
    }
    
     fun onStop() {
        // 百度地图 MapView 没有 onStop 方法
    }
    
     fun onDestroy() {
        // 销毁地图
        mapView?.onDestroy()
        mapView = null
        baiduMap = null
    }
}