package com.acitelight.aether.view import androidx.compose.foundation.background import androidx.compose.foundation.clickable import androidx.compose.foundation.layout.Arrangement import androidx.compose.foundation.layout.Box import androidx.compose.foundation.layout.Column import androidx.compose.foundation.layout.Row import androidx.compose.foundation.layout.fillMaxWidth import androidx.compose.foundation.layout.height import androidx.compose.foundation.layout.heightIn import androidx.compose.foundation.layout.padding import androidx.compose.foundation.lazy.LazyColumn import androidx.compose.foundation.lazy.items import androidx.compose.foundation.shape.RoundedCornerShape import androidx.compose.material.icons.Icons import androidx.compose.material.icons.filled.Pause import androidx.compose.material.icons.filled.Stop import androidx.compose.material.icons.filled.Delete import androidx.compose.material.icons.filled.PlayArrow import androidx.compose.material3.Button import androidx.compose.material3.Card import androidx.compose.material3.CardDefaults import androidx.compose.material3.Icon import androidx.compose.material3.LinearProgressIndicator import androidx.compose.material3.MaterialTheme import androidx.compose.material3.ProgressIndicatorDefaults import androidx.compose.material3.Text import androidx.compose.runtime.Composable import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier import androidx.compose.ui.graphics.Color import androidx.compose.ui.layout.ContentScale import androidx.compose.ui.platform.LocalContext import androidx.compose.ui.text.font.FontWeight import androidx.compose.ui.unit.dp import androidx.compose.ui.unit.sp import androidx.hilt.lifecycle.viewmodel.compose.hiltViewModel import androidx.lifecycle.viewModelScope import androidx.navigation.NavHostController import coil3.compose.AsyncImage import coil3.request.ImageRequest import com.acitelight.aether.Global.updateRelate import com.acitelight.aether.model.VideoDownloadItemState import com.acitelight.aether.model.Video import com.acitelight.aether.viewModel.TransmissionScreenViewModel import com.tonyodev.fetch2.Status import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.launch import kotlinx.coroutines.withContext import kotlinx.serialization.json.Json import java.io.File import kotlin.collections.sortedWith @Composable fun TransmissionScreen( navigator: NavHostController, transmissionScreenViewModel: TransmissionScreenViewModel = hiltViewModel() ) { val downloads = transmissionScreenViewModel.downloads LazyColumn( modifier = Modifier.fillMaxWidth(), verticalArrangement = Arrangement.spacedBy(8.dp) ) { items(downloads.filter { it.type == "main" }, key = { it.id }) { item -> VideoDownloadCard( navigator = navigator, viewModel = transmissionScreenViewModel, model = item, onPause = { for (i in downloadToGroup( item, downloads )) transmissionScreenViewModel.pause(i.id) }, onResume = { for (i in downloadToGroup( item, downloads )) transmissionScreenViewModel.resume(i.id) }, onCancel = { for (i in downloadToGroup( item, downloads )) transmissionScreenViewModel.cancel(i.id) }, onDelete = { for (i in downloadToGroup( item, downloads )) transmissionScreenViewModel.delete(i.id, true) } ) } } } @Composable private fun VideoDownloadCard( navigator: NavHostController, viewModel: TransmissionScreenViewModel, model: VideoDownloadItemState, onPause: () -> Unit, onResume: () -> Unit, onCancel: () -> Unit, onDelete: () -> Unit ) { Card( shape = RoundedCornerShape(8.dp), elevation = CardDefaults.cardElevation(4.dp), modifier = Modifier .fillMaxWidth() .padding(8.dp) .background(Color.Transparent) .clickable(onClick = { if (model.status == Status.COMPLETED) { viewModel.viewModelScope.launch(Dispatchers.IO) { val downloaded = viewModel.fetchManager.getAllDownloadsAsync().filter { it.status == Status.COMPLETED && it.extras.getString( "class", "" ) != "comic" && it.extras.getString( "type", "" ) == "main" } val jsonQuery = downloaded.map { File( viewModel.context.getExternalFilesDir(null), "videos/${ it.extras.getString( "class", "" ) }/${it.extras.getString("id", "")}/summary.json" ).readText() } .map { Json.decodeFromString