package com.example.ui.screens 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.Spacer import androidx.compose.foundation.layout.fillMaxSize import androidx.compose.foundation.layout.fillMaxWidth import androidx.compose.foundation.layout.height import androidx.compose.foundation.layout.padding import androidx.compose.foundation.layout.size import androidx.compose.foundation.layout.statusBarsPadding import androidx.compose.foundation.layout.width 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.CheckCircle import androidx.compose.material.icons.filled.ClearAll import androidx.compose.material.icons.filled.History import androidx.compose.material.icons.filled.MusicNote import androidx.compose.material.icons.filled.PlayArrow import androidx.compose.material.icons.filled.Replay import androidx.compose.material.icons.filled.Videocam import androidx.compose.material3.AlertDialog import androidx.compose.material3.Button import androidx.compose.material3.ButtonDefaults import androidx.compose.material3.Icon import androidx.compose.material3.IconButton import androidx.compose.material3.LinearProgressIndicator import androidx.compose.material3.MaterialTheme import androidx.compose.material3.Surface import androidx.compose.material3.Text import androidx.compose.material3.TextButton import androidx.compose.runtime.Composable import androidx.compose.runtime.collectAsState import androidx.compose.runtime.getValue import androidx.compose.runtime.mutableStateOf import androidx.compose.runtime.remember import androidx.compose.runtime.setValue import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier import androidx.compose.ui.draw.clip import androidx.compose.ui.graphics.Color import androidx.compose.ui.platform.testTag import androidx.compose.ui.text.font.FontWeight import androidx.compose.ui.text.style.TextOverflow import androidx.compose.ui.unit.dp import androidx.compose.ui.unit.sp import androidx.media3.common.util.UnstableApi import com.example.playback.PlaybackManager import com.example.ui.components.formatTime import com.example.ui.theme.AccentViolet import com.example.ui.theme.AmoledBlack import com.example.ui.theme.DividerSubtle import com.example.ui.theme.ErrorRed import com.example.ui.theme.SurfaceElevated import com.example.ui.theme.SurfaceSecondary import com.example.ui.theme.TextPrimary import com.example.ui.theme.TextSecondary import com.example.ui.viewmodel.MainViewModel @OptIn(UnstableApi::class) @Composable fun HistoryScreen( viewModel: MainViewModel, modifier: Modifier = Modifier ) { val historyList by viewModel.history.collectAsState() var showClearConfirm by remember { mutableStateOf(false) } Column( modifier = modifier .fillMaxSize() .background(AmoledBlack) .statusBarsPadding() .testTag("history_screen") ) { // Header Row( modifier = Modifier .fillMaxWidth() .padding(horizontal = 16.dp, vertical = 12.dp), verticalAlignment = Alignment.CenterVertically, horizontalArrangement = Arrangement.SpaceBetween ) { Text( text = "Playback History", color = TextPrimary, style = MaterialTheme.typography.headlineMedium, fontWeight = FontWeight.Bold ) if (historyList.isNotEmpty()) { IconButton( onClick = { showClearConfirm = true }, modifier = Modifier.testTag("history_clear_btn") ) { Icon(imageVector = Icons.Default.ClearAll, contentDescription = "Clear History", tint = TextSecondary) } } } if (historyList.isEmpty()) { Box( modifier = Modifier .fillMaxSize() .padding(32.dp), contentAlignment = Alignment.Center ) { Column(horizontalAlignment = Alignment.CenterHorizontally) { Icon(imageVector = Icons.Default.History, contentDescription = null, tint = AccentViolet, modifier = Modifier.size(56.dp)) Spacer(modifier = Modifier.height(12.dp)) Text("No playback history yet.", color = TextSecondary) Text("Played audio and videos will appear here with saved progress.", color = TextSecondary, fontSize = 12.sp) } } } else { LazyColumn( modifier = Modifier .fillMaxSize() .padding(horizontal = 16.dp), verticalArrangement = Arrangement.spacedBy(10.dp) ) { items(historyList, key = { it.id }) { item -> val progress = if (item.durationMs > 0) { (item.lastPositionMs.toFloat() / item.durationMs.toFloat()).coerceIn(0f, 1f) } else 0f Surface( modifier = Modifier .fillMaxWidth() .clip(RoundedCornerShape(12.dp)) .clickable { viewModel.resumeFromHistory(item) } .testTag("history_item_${item.id}"), color = SurfaceSecondary ) { Column(modifier = Modifier.padding(14.dp)) { Row(verticalAlignment = Alignment.CenterVertically) { Box( modifier = Modifier .size(42.dp) .clip(RoundedCornerShape(8.dp)) .background(SurfaceElevated), contentAlignment = Alignment.Center ) { Icon( imageVector = if (item.isVideo) Icons.Default.Videocam else Icons.Default.MusicNote, contentDescription = null, tint = AccentViolet, modifier = Modifier.size(22.dp) ) } Spacer(modifier = Modifier.width(12.dp)) Column(modifier = Modifier.weight(1f)) { Text( text = item.title, color = TextPrimary, fontSize = 14.sp, fontWeight = FontWeight.SemiBold, maxLines = 1, overflow = TextOverflow.Ellipsis ) Text( text = "${item.artist} • ${if (item.completed) "Completed" else "At ${formatTime(item.lastPositionMs)}"}", color = TextSecondary, fontSize = 12.sp ) } // Resume or Restart Button Surface( onClick = { viewModel.resumeFromHistory(item) }, shape = RoundedCornerShape(8.dp), color = if (item.completed) SurfaceElevated else AccentViolet ) { Row( modifier = Modifier.padding(horizontal = 10.dp, vertical = 6.dp), verticalAlignment = Alignment.CenterVertically ) { Icon( imageVector = if (item.completed) Icons.Default.Replay else Icons.Default.PlayArrow, contentDescription = null, tint = if (item.completed) TextPrimary else AmoledBlack, modifier = Modifier.size(16.dp) ) Spacer(modifier = Modifier.width(4.dp)) Text( text = if (item.completed) "Replay" else "Resume", color = if (item.completed) TextPrimary else AmoledBlack, fontWeight = FontWeight.Bold, fontSize = 12.sp ) } } } // Progress bar if (!item.completed && progress > 0.02f) { Spacer(modifier = Modifier.height(10.dp)) LinearProgressIndicator( progress = { progress }, modifier = Modifier .fillMaxWidth() .height(3.dp) .clip(RoundedCornerShape(2.dp)), color = AccentViolet, trackColor = DividerSubtle ) } } } } } } } // Clear History Dialog if (showClearConfirm) { AlertDialog( onDismissRequest = { showClearConfirm = false }, confirmButton = { Button( onClick = { viewModel.clearHistory() showClearConfirm = false }, colors = ButtonDefaults.buttonColors(containerColor = ErrorRed) ) { Text("Clear", color = Color.White) } }, dismissButton = { TextButton(onClick = { showClearConfirm = false }) { Text("Cancel", color = TextSecondary) } }, title = { Text("Clear Playback History?", color = TextPrimary) }, text = { Text( "This will reset all saved playback timestamps and history entries. Original media files will not be modified.", color = TextSecondary ) }, containerColor = SurfaceElevated ) } }