/** * TrackerMap * Copyright (C) 2021-2022 Iván Ávalos , Henoch Ojeda * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU Affero General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Affero General Public License for more details. * * You should have received a copy of the GNU Affero General Public License * along with this program. If not, see . */ package mx.trackermap.TrackerMap.controllers import kotlinx.coroutines.DelicateCoroutinesApi import kotlinx.coroutines.GlobalScope import kotlinx.coroutines.flow.MutableStateFlow import kotlinx.coroutines.launch import mx.trackermap.TrackerMap.Injectable import mx.trackermap.TrackerMap.client.apis.GeofencesApi import mx.trackermap.TrackerMap.client.apis.ReportsApi import mx.trackermap.TrackerMap.client.models.EventInformation import mx.trackermap.TrackerMap.client.models.Position import mx.trackermap.TrackerMap.client.models.Stop import mx.trackermap.TrackerMap.utils.ReportDates @DelicateCoroutinesApi class ReportController( private val reportsApi: ReportsApi, private val geofencesApi: GeofencesApi ): Injectable { sealed class Report { class PositionsReport(val positions: List) : Report() class EventsReport(val events: List) : Report() class StopsReport(val stops: List) : Report() class XlsxReport(val data: ByteArray) : Report() object LoadingReport: Report() } enum class ReportType { POSITIONS, EVENTS, STOPS } val reportFlow: MutableStateFlow = MutableStateFlow(Report.LoadingReport) fun fetchReport( deviceId: Int, reportType: ReportType?, reportPeriod: ReportDates.ReportPeriod?, xlsx: Boolean = false, eventTypes: List = listOf() ) { if (reportType == null || reportPeriod == null) { return } val (currentDate, previousDate) = ReportDates.getDates(reportPeriod) if (!xlsx) { reportFlow.value = Report.LoadingReport } GlobalScope.launch { when (reportType) { ReportType.POSITIONS -> fetchPositions(deviceId, previousDate, currentDate, xlsx) ReportType.EVENTS -> fetchEvents(deviceId, previousDate, currentDate, eventTypes, xlsx) ReportType.STOPS -> fetchStops(deviceId, previousDate, currentDate, xlsx) } } } private suspend fun fetchPositions( deviceId: Int, from: String, to: String, xlsx: Boolean ) { if (!xlsx) { val result = reportsApi.reportsRouteGet(from, to, deviceId) reportFlow.value = Report.PositionsReport(result.toList()) } else { val result = reportsApi.reportsRouteGetXlsx(from, to, deviceId) reportFlow.value = Report.XlsxReport(result) } } private suspend fun fetchEvents( deviceId: Int, from: String, to: String, types: List, xlsx: Boolean ) { if (!xlsx) { val positionsResult = reportsApi.reportsRouteGet(from, to, deviceId) val eventsResult = reportsApi.reportsEventsGet( from, to, EventInformation.reportTypesToStrings(types), deviceId ) val geofencesResult = geofencesApi.geofencesGet() val result = mutableListOf() eventsResult.forEach { event -> result.add(EventInformation( event = event, position = positionsResult.find { it.id == event.positionId }, geofence = geofencesResult.find { it.id == event.geofenceId } )) } reportFlow.value = Report.EventsReport(result) } else { val result = reportsApi.reportsEventsGetXlsx( from, to, EventInformation.reportTypesToStrings(types), deviceId ) reportFlow.value = Report.XlsxReport(result) } } private suspend fun fetchStops( deviceId: Int, from: String, to: String, xlsx: Boolean ) { if (!xlsx) { val result = reportsApi.reportsStopsGet(from, to, deviceId) reportFlow.value = Report.StopsReport(result.toList()) } else { val result = reportsApi.reportsStopsGetXlsx(from, to, deviceId) reportFlow.value = Report.XlsxReport(result) } } }