package mx.trackermap.TrackerMap.android.details.reports import android.util.Log import androidx.lifecycle.MutableLiveData import androidx.lifecycle.SavedStateHandle import androidx.lifecycle.ViewModel import androidx.lifecycle.asFlow import androidx.lifecycle.viewModelScope import java.text.SimpleDateFormat import java.util.Calendar import java.util.Date import kotlinx.coroutines.flow.collect import kotlinx.coroutines.launch import mx.trackermap.TrackerMap.client.apis.ReportsApi import mx.trackermap.TrackerMap.client.models.Event import mx.trackermap.TrackerMap.client.models.Position import mx.trackermap.TrackerMap.client.models.Stop import org.koin.core.component.KoinComponent class UnitReportsViewModel( private val reportsApi: ReportsApi, savedStateHandle: SavedStateHandle ) : ViewModel(), KoinComponent { sealed class Report { class PositionsReport(val positions: Array) : Report() class EventsReport(val events: Array) : Report() class StopsReport(val stops: Array) : Report() } enum class ReportType { POSITIONS, EVENTS, STOPS } enum class ReportPeriod { DAY, WEEK, MONTH } var deviceId = savedStateHandle.getLiveData("deviceId", 0) val reportType: MutableLiveData = savedStateHandle.getLiveData("reportType", null) val reportPeriod: MutableLiveData = savedStateHandle.getLiveData("reportPeriod", null) val report: MutableLiveData = MutableLiveData() val dateFormat = SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss'Z'") init { viewModelScope.launch { setupTypeObserver() } viewModelScope.launch { setupPeriodObserver() } } private suspend fun setupTypeObserver() { reportType.asFlow().collect { fetchReport() } } private suspend fun setupPeriodObserver() { reportPeriod.asFlow().collect { fetchReport() } } private fun fetchReport() { if (reportType.value == null || reportPeriod.value == null) { return } val (currentDate, previousDate) = getDates() Log.d("UnitReportsVM", "Current report type: ${reportType.value.toString()}") Log.d("UnitReportsVM", "Current report period: ${reportPeriod.value.toString()}") Log.d("UnitReportsVM", "Current date:${dateFormat.format(currentDate)}") Log.d("UnitReportsVM", "Previous date:${dateFormat.format(previousDate)}") viewModelScope.launch { when (reportType.value!!) { ReportType.POSITIONS -> fetchPositions(previousDate, currentDate) ReportType.EVENTS -> fetchEvents(previousDate, currentDate) ReportType.STOPS -> fetchStops(previousDate, currentDate) } } } private fun getDates(): Pair { val calendar = Calendar.getInstance() val currentDate = calendar.time calendar.add( Calendar.DATE, when (reportPeriod.value!!) { ReportPeriod.DAY -> -1 ReportPeriod.WEEK -> -7 ReportPeriod.MONTH -> -30 } ) val previousDate = calendar.time return Pair(currentDate, previousDate) } private suspend fun fetchPositions(from: Date, to: Date) { Log.d("UnitReportsVM", "Fetching positions") val result = reportsApi.reportsRouteGet( dateFormat.format(from), dateFormat.format(to), deviceId.value!! ) Log.d("UnitReportsVM", "Positions report: $result") report.postValue(Report.PositionsReport(result)) } private suspend fun fetchEvents(from: Date, to: Date) { Log.d("UnitReportsVM", "Fetching events") val result = reportsApi.reportsEventsGet( dateFormat.format(from), dateFormat.format(to), deviceId.value!! ) Log.d("UnitReportsVM", "Events report: $result") report.postValue(Report.EventsReport(result)) } private suspend fun fetchStops(from: Date, to: Date) { Log.d("UnitReportsVM", "Fetching stops") val result = reportsApi.reportsStopsGet( dateFormat.format(from), dateFormat.format(to), deviceId.value!! ) Log.d("UnitReportsVM", "Stops report: $result") report.postValue(Report.StopsReport(result)) } }