package com.parkplants.ui.addplant import android.annotation.SuppressLint import android.content.Context import android.location.Location import androidx.lifecycle.ViewModel import androidx.lifecycle.viewModelScope import com.google.android.gms.location.* import dagger.hilt.android.lifecycle.HiltViewModel import dagger.hilt.android.qualifiers.ApplicationContext import kotlinx.coroutines.flow.MutableStateFlow import kotlinx.coroutines.flow.asStateFlow import kotlinx.coroutines.launch import kotlinx.coroutines.suspendCancellableCoroutine import javax.inject.Inject import kotlin.coroutines.resume data class GpsState( val lat: Double? = null, val lng: Double? = null, val accuracy: Float? = null, val isLoading: Boolean = false, val error: String? = null, ) @HiltViewModel class GpsViewModel @Inject constructor( @ApplicationContext private val context: Context, ) : ViewModel() { private val fusedClient = LocationServices.getFusedLocationProviderClient(context) private val _gpsState = MutableStateFlow(GpsState()) val gpsState = _gpsState.asStateFlow() @SuppressLint("MissingPermission") fun requestLocation() { _gpsState.value = GpsState(isLoading = true) val request = CurrentLocationRequest.Builder() .setDurationMillis(15_000) .setMaxUpdateAgeMillis(0) .setPriority(Priority.PRIORITY_HIGH_ACCURACY) .build() viewModelScope.launch { try { val location = suspendCancellableCoroutine { cont -> fusedClient.getCurrentLocation(request, null) .addOnSuccessListener { cont.resume(it) } .addOnFailureListener { cont.resume(null) } } if (location != null) { _gpsState.value = GpsState( lat = location.latitude, lng = location.longitude, accuracy = location.accuracy, ) } else { _gpsState.value = GpsState(error = "Не удалось получить координаты") } } catch (e: Exception) { _gpsState.value = GpsState(error = e.message ?: "Ошибка GPS") } } } fun setManualLocation(lat: Double, lng: Double) { _gpsState.value = GpsState(lat = lat, lng = lng, accuracy = null) } fun clearLocation() { _gpsState.value = GpsState() } }