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.automirrored.filled.ArrowBack import androidx.compose.material.icons.automirrored.filled.ArrowForwardIos import androidx.compose.material.icons.filled.Folder import androidx.compose.material.icons.filled.MusicNote import androidx.compose.material.icons.filled.PlayArrow 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.draw.clip 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.SurfaceSecondary import com.example.ui.theme.TextPrimary import com.example.ui.theme.TextSecondary import com.example.ui.viewmodel.MainViewModel @OptIn(UnstableApi::class) @Composable fun FoldersScreen( viewModel: MainViewModel, onPlayMedia: (MediaItemData) -> Unit, modifier: Modifier = Modifier ) { val allMedia by viewModel.allMedia.collectAsState() val activeFolder by viewModel.activeFolder.collectAsState() val foldersMap = allMedia.groupBy { it.folderName } Column( modifier = modifier .fillMaxSize() .background(AmoledBlack) .statusBarsPadding() .testTag("folders_screen") ) { // Header Row( modifier = Modifier .fillMaxWidth() .padding(horizontal = 16.dp, vertical = 12.dp), verticalAlignment = Alignment.CenterVertically ) { if (activeFolder != null) { IconButton( onClick = { viewModel.setActiveFolder(null) }, modifier = Modifier.testTag("folder_back_btn") ) { Icon( imageVector = Icons.AutoMirrored.Filled.ArrowBack, contentDescription = "Back to Folders", tint = TextPrimary ) } } Text( text = activeFolder ?: "Media Folders", color = TextPrimary, style = MaterialTheme.typography.headlineMedium, fontWeight = FontWeight.Bold ) } if (activeFolder == null) { // List of Folders if (foldersMap.isEmpty()) { Box(modifier = Modifier.fillMaxSize(), contentAlignment = Alignment.Center) { Text("No media folders detected.", color = TextSecondary) } } else { LazyColumn( modifier = Modifier .fillMaxSize() .padding(horizontal = 16.dp), verticalArrangement = Arrangement.spacedBy(10.dp) ) { foldersMap.forEach { (folderName, items) -> item(key = folderName) { val audioCount = items.count { !it.isVideo } val videoCount = items.count { it.isVideo } Surface( modifier = Modifier .fillMaxWidth() .clip(RoundedCornerShape(12.dp)) .clickable { viewModel.setActiveFolder(folderName) }, color = SurfaceSecondary ) { Row( modifier = Modifier.padding(14.dp), verticalAlignment = Alignment.CenterVertically ) { Box( modifier = Modifier .size(46.dp) .clip(RoundedCornerShape(10.dp)) .background(SurfaceElevated), contentAlignment = Alignment.Center ) { Icon( imageVector = Icons.Default.Folder, contentDescription = null, tint = AccentViolet, modifier = Modifier.size(26.dp) ) } Spacer(modifier = Modifier.width(14.dp)) Column(modifier = Modifier.weight(1f)) { Text( text = folderName, color = TextPrimary, fontSize = 15.sp, fontWeight = FontWeight.SemiBold ) Spacer(modifier = Modifier.height(2.dp)) Text( text = "${items.size} files • $audioCount audio, $videoCount video", color = TextSecondary, fontSize = 12.sp ) } Icon( imageVector = Icons.AutoMirrored.Filled.ArrowForwardIos, contentDescription = null, tint = TextSecondary, modifier = Modifier.size(16.dp) ) } } } } } } } else { // Media inside active folder val folderItems = foldersMap[activeFolder] ?: emptyList() Row( modifier = Modifier .fillMaxWidth() .padding(horizontal = 16.dp, vertical = 6.dp), horizontalArrangement = Arrangement.SpaceBetween, verticalAlignment = Alignment.CenterVertically ) { Text("${folderItems.size} files", color = TextSecondary, fontSize = 13.sp) Surface( onClick = { if (folderItems.isNotEmpty()) { PlaybackManager.setQueue(folderItems, 0, autoPlay = true) } }, shape = RoundedCornerShape(8.dp), color = AccentViolet ) { Row( modifier = Modifier.padding(horizontal = 10.dp, vertical = 6.dp), verticalAlignment = Alignment.CenterVertically ) { Icon(imageVector = Icons.Default.PlayArrow, contentDescription = null, tint = AmoledBlack, modifier = Modifier.size(16.dp)) Spacer(modifier = Modifier.width(4.dp)) Text("Play Folder", color = AmoledBlack, fontWeight = FontWeight.Bold, fontSize = 12.sp) } } } LazyColumn(modifier = Modifier.fillMaxSize()) { items(folderItems, 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.formattedDuration} • ${item.formattedSize}", color = TextSecondary, fontSize = 12.sp ) } IconButton(onClick = { onPlayMedia(item) }) { Icon(imageVector = Icons.Default.PlayArrow, contentDescription = "Play", tint = TextPrimary) } } } } } } }