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.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.Favorite import androidx.compose.material.icons.filled.MusicNote import androidx.compose.material.icons.filled.PlayArrow import androidx.compose.material.icons.filled.Shuffle import androidx.compose.material.icons.filled.Videocam import androidx.compose.material3.Icon import androidx.compose.material3.IconButton import androidx.compose.material3.MaterialTheme import androidx.compose.material3.Surface import androidx.compose.material3.Text import androidx.compose.runtime.Composable import androidx.compose.runtime.collectAsState import androidx.compose.runtime.getValue import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier import androidx.compose.ui.platform.testTag import androidx.compose.ui.text.font.FontWeight import androidx.compose.ui.unit.dp import androidx.compose.ui.unit.sp import androidx.media3.common.util.UnstableApi import com.example.data.model.MediaItemData import com.example.playback.PlaybackManager import com.example.ui.theme.AccentViolet import com.example.ui.theme.AmoledBlack import com.example.ui.theme.SurfaceElevated import com.example.ui.theme.TextPrimary import com.example.ui.theme.TextSecondary import com.example.ui.viewmodel.MainViewModel @OptIn(UnstableApi::class) @Composable fun FavoritesScreen( viewModel: MainViewModel, onPlayMedia: (MediaItemData) -> Unit, modifier: Modifier = Modifier ) { val favorites by viewModel.favorites.collectAsState() val allMedia by viewModel.allMedia.collectAsState() val favoriteMediaItems = favorites.mapNotNull { fav -> allMedia.find { it.id == fav.id || it.contentUri == fav.mediaUri } ?: MediaItemData( id = fav.id, contentUri = fav.mediaUri, title = fav.title, artist = fav.artist, album = fav.album, durationMs = fav.durationMs, isVideo = fav.isVideo ) } Column( modifier = modifier .fillMaxSize() .background(AmoledBlack) .statusBarsPadding() .testTag("favorites_screen") ) { Text( text = "Favorites", color = TextPrimary, style = MaterialTheme.typography.headlineMedium, fontWeight = FontWeight.Bold, modifier = Modifier.padding(horizontal = 16.dp, vertical = 12.dp) ) if (favoriteMediaItems.isNotEmpty()) { Row( modifier = Modifier .fillMaxWidth() .padding(horizontal = 16.dp, vertical = 6.dp), horizontalArrangement = Arrangement.spacedBy(12.dp) ) { Surface( onClick = { PlaybackManager.setQueue(favoriteMediaItems, 0, autoPlay = true) }, shape = RoundedCornerShape(10.dp), color = AccentViolet, modifier = Modifier.weight(1f) ) { Row( modifier = Modifier.padding(vertical = 10.dp), horizontalArrangement = Arrangement.Center, verticalAlignment = Alignment.CenterVertically ) { Icon(imageVector = Icons.Default.PlayArrow, contentDescription = null, tint = AmoledBlack) Spacer(modifier = Modifier.width(6.dp)) Text("Play All (${favoriteMediaItems.size})", color = AmoledBlack, fontWeight = FontWeight.Bold) } } Surface( onClick = { PlaybackManager.toggleShuffle() PlaybackManager.setQueue(favoriteMediaItems.shuffled(), 0, autoPlay = true) }, shape = RoundedCornerShape(10.dp), color = SurfaceElevated, modifier = Modifier.weight(1f) ) { Row( modifier = Modifier.padding(vertical = 10.dp), horizontalArrangement = Arrangement.Center, verticalAlignment = Alignment.CenterVertically ) { Icon(imageVector = Icons.Default.Shuffle, contentDescription = null, tint = AccentViolet) Spacer(modifier = Modifier.width(6.dp)) Text("Shuffle", color = TextPrimary, fontWeight = FontWeight.Bold) } } } } if (favoriteMediaItems.isEmpty()) { Box(modifier = Modifier.fillMaxSize().padding(32.dp), contentAlignment = Alignment.Center) { Column(horizontalAlignment = Alignment.CenterHorizontally) { Icon(imageVector = Icons.Default.Favorite, contentDescription = null, tint = AccentViolet, modifier = Modifier.size(52.dp)) Text("No favorites yet.", color = TextSecondary, modifier = Modifier.padding(top = 12.dp)) Text("Tap the heart icon on any song or video to save here.", color = TextSecondary, fontSize = 12.sp) } } } else { LazyColumn(modifier = Modifier.fillMaxSize()) { items(favoriteMediaItems, key = { it.id }) { item -> Row( modifier = Modifier .fillMaxWidth() .clickable { onPlayMedia(item) } .padding(horizontal = 16.dp, vertical = 10.dp), verticalAlignment = Alignment.CenterVertically ) { Icon( imageVector = if (item.isVideo) Icons.Default.Videocam else Icons.Default.MusicNote, contentDescription = null, tint = AccentViolet, modifier = Modifier.size(24.dp) ) Spacer(modifier = Modifier.width(14.dp)) Column(modifier = Modifier.weight(1f)) { Text(text = item.title, color = TextPrimary, fontSize = 14.sp, fontWeight = FontWeight.Medium) Text(text = "${item.artist} • ${item.formattedDuration}", color = TextSecondary, fontSize = 12.sp) } IconButton(onClick = { viewModel.toggleFavorite(item) }) { Icon(imageVector = Icons.Default.Favorite, contentDescription = "Unfavorite", tint = AccentViolet) } } } } } } }