package com.example.ui.components import androidx.compose.animation.AnimatedVisibility import androidx.compose.animation.fadeIn import androidx.compose.animation.fadeOut import androidx.compose.foundation.background import androidx.compose.foundation.layout.Arrangement import androidx.compose.foundation.layout.Column import androidx.compose.foundation.layout.Row import androidx.compose.foundation.layout.Spacer 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.width import androidx.compose.foundation.shape.RoundedCornerShape import androidx.compose.foundation.text.KeyboardActions import androidx.compose.foundation.text.KeyboardOptions import androidx.compose.material.icons.Icons import androidx.compose.material.icons.filled.Clear import androidx.compose.material.icons.filled.MusicNote import androidx.compose.material.icons.filled.Search import androidx.compose.material.icons.filled.Videocam import androidx.compose.material.icons.filled.VideoLibrary import androidx.compose.material3.FilterChip import androidx.compose.material3.FilterChipDefaults import androidx.compose.material3.Icon import androidx.compose.material3.IconButton import androidx.compose.material3.MaterialTheme import androidx.compose.material3.OutlinedTextField import androidx.compose.material3.OutlinedTextFieldDefaults import androidx.compose.material3.Surface 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.platform.LocalFocusManager import androidx.compose.ui.platform.testTag import androidx.compose.ui.text.font.FontWeight import androidx.compose.ui.text.input.ImeAction import androidx.compose.ui.unit.dp import androidx.compose.ui.unit.sp import com.example.data.model.MediaTypeFilter import com.example.ui.theme.AccentViolet import com.example.ui.theme.AmoledBlack import com.example.ui.theme.DividerSubtle import com.example.ui.theme.SurfaceElevated import com.example.ui.theme.SurfaceSecondary import com.example.ui.theme.TextPrimary import com.example.ui.theme.TextSecondary @Composable fun LibrarySearchBar( searchQuery: String, onQueryChange: (String) -> Unit, selectedFilter: MediaTypeFilter = MediaTypeFilter.ALL, onFilterChange: ((MediaTypeFilter) -> Unit)? = null, matchCount: Int? = null, placeholderText: String = "Filter by title or artist...", modifier: Modifier = Modifier, testTag: String = "library_search_bar" ) { val focusManager = LocalFocusManager.current Column( modifier = modifier .fillMaxWidth() .background(AmoledBlack) .padding(horizontal = 16.dp, vertical = 6.dp) ) { // Primary Search Text Field OutlinedTextField( value = searchQuery, onValueChange = onQueryChange, modifier = Modifier .fillMaxWidth() .testTag(testTag), placeholder = { Text( text = placeholderText, color = TextSecondary, fontSize = 14.sp ) }, leadingIcon = { Icon( imageVector = Icons.Default.Search, contentDescription = "Search Icon", tint = if (searchQuery.isNotEmpty()) AccentViolet else TextSecondary ) }, trailingIcon = { if (searchQuery.isNotEmpty()) { IconButton( onClick = { onQueryChange("") focusManager.clearFocus() }, modifier = Modifier.testTag("${testTag}_clear_btn") ) { Icon( imageVector = Icons.Default.Clear, contentDescription = "Clear search", tint = TextSecondary, modifier = Modifier.size(20.dp) ) } } }, singleLine = true, keyboardOptions = KeyboardOptions(imeAction = ImeAction.Search), keyboardActions = KeyboardActions(onSearch = { focusManager.clearFocus() }), shape = RoundedCornerShape(14.dp), colors = OutlinedTextFieldDefaults.colors( focusedBorderColor = AccentViolet, unfocusedBorderColor = DividerSubtle, focusedContainerColor = SurfaceSecondary, unfocusedContainerColor = SurfaceSecondary, focusedTextColor = TextPrimary, unfocusedTextColor = TextPrimary, cursorColor = AccentViolet ) ) // Optional Filter Chips Row (All / Music / Videos) if (onFilterChange != null) { Spacer(modifier = Modifier.height(8.dp)) Row( modifier = Modifier.fillMaxWidth(), horizontalArrangement = Arrangement.spacedBy(8.dp), verticalAlignment = Alignment.CenterVertically ) { MediaTypeFilter.values().forEach { filter -> val isSelected = selectedFilter == filter val icon = when (filter) { MediaTypeFilter.ALL -> Icons.Default.VideoLibrary MediaTypeFilter.MUSIC -> Icons.Default.MusicNote MediaTypeFilter.VIDEOS -> Icons.Default.Videocam } FilterChip( selected = isSelected, onClick = { onFilterChange(filter) }, leadingIcon = { Icon( imageVector = icon, contentDescription = null, tint = if (isSelected) AmoledBlack else TextSecondary, modifier = Modifier.size(16.dp) ) }, label = { Text( text = filter.label, fontSize = 12.sp, fontWeight = if (isSelected) FontWeight.Bold else FontWeight.Normal ) }, colors = FilterChipDefaults.filterChipColors( selectedContainerColor = AccentViolet, selectedLabelColor = AmoledBlack, containerColor = SurfaceElevated, labelColor = TextSecondary ), shape = RoundedCornerShape(16.dp), border = null, modifier = Modifier.testTag("lib_chip_${filter.name.lowercase()}") ) } } } // Results feedback bar when search query is active AnimatedVisibility( visible = searchQuery.isNotBlank() && matchCount != null, enter = fadeIn(), exit = fadeOut() ) { Row( modifier = Modifier .fillMaxWidth() .padding(top = 6.dp, start = 4.dp, end = 4.dp), horizontalArrangement = Arrangement.SpaceBetween, verticalAlignment = Alignment.CenterVertically ) { Text( text = if ((matchCount ?: 0) > 0) { "Found $matchCount matching item${if (matchCount == 1) "" else "s"}" } else { "No matching files found for \"$searchQuery\"" }, color = if ((matchCount ?: 0) > 0) AccentViolet else Color(0xFFEF4444), fontSize = 12.sp, fontWeight = FontWeight.Medium ) Surface( onClick = { onQueryChange("") }, color = Color.Transparent ) { Text( text = "Reset", color = TextSecondary, fontSize = 12.sp, fontWeight = FontWeight.SemiBold ) } } } } }