package com.base.locationsharewhite.ui.locationmap

import android.annotation.SuppressLint
import android.app.Activity
import android.location.Location
import androidx.lifecycle.LifecycleCoroutineScope
import com.base.locationsharewhite.BuildConfig
import com.base.locationsharewhite.location.LocationPositionUtils.uploadMyLocation
import com.base.locationsharewhite.map.MapUtils.getLatLngByLocationManager
import com.base.locationsharewhite.utils.BatteryUtils.getBatteryLevel
import com.google.android.gms.location.FusedLocationProviderClient
import com.google.android.gms.location.LocationServices
import com.google.android.gms.maps.model.LatLng
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.Job
import kotlinx.coroutines.delay
import kotlinx.coroutines.isActive
import kotlinx.coroutines.launch

class LocationPresenter(
    val activity: Activity,
    val lifecycleCoroutineScope: LifecycleCoroutineScope
) {

    private var TAG = "LocationPresenter"
    private var uploadJob: Job? = null


    //google的地理位置服务
    private var fusedLocationClient: FusedLocationProviderClient = LocationServices.getFusedLocationProviderClient(activity)
    var googleLocation: LatLng? = null

    //一次性更新自己的位置
    var oneShotLocationCallBack: (() -> Unit)? = null

    //刷新自己的位置
    var refreshLocationCallBack: ((latLng: LatLng?) -> Unit)? = null

    fun getMyLocation(): LatLng? {
        var latLng = activity.getLatLngByLocationManager()
        if (latLng == null) {
            latLng = googleLocation
        }
        return latLng
    }

    fun startUploadMyLocation() {
        if (uploadJob == null) {
            uploadJob = lifecycleCoroutineScope.launch(Dispatchers.IO) {
                while (isActive) {
                    getGoogleServiceLocation()

                    val latLng = getMyLocation()

                    val power = activity.getBatteryLevel()
                    latLng?.let {
                        launch(Dispatchers.Main) {
                            refreshLocationCallBack?.invoke(it)
                        }
                        uploadMyLocation(latLng, power)
                    }
                    delay(10 * 1000L)
                }
            }
        }
    }


    @SuppressLint("MissingPermission")
    fun getGoogleServiceLocation() {
        fusedLocationClient.lastLocation
            .addOnSuccessListener { location: Location? ->
                if (location != null) {
                    val latLng = LatLng(location.latitude, location.longitude)
                    googleLocation = latLng

                    oneShotLocationCallBack?.invoke()
                    oneShotLocationCallBack = null

                }
            }
    }

    fun cancelUploadJob() {
        uploadJob?.cancel()
        uploadJob = null
    }

}