package com.aistudio.bonjuteri.jwlry.ui.screens.admin import androidx.compose.foundation.background 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.aspectRatio 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.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.filled.Add import androidx.compose.material.icons.filled.Delete import androidx.compose.material.icons.filled.Edit import androidx.compose.material.icons.filled.Image import androidx.compose.material3.AlertDialog import androidx.compose.material3.Button import androidx.compose.material3.ButtonDefaults import androidx.compose.material3.Card import androidx.compose.material3.CardDefaults import androidx.compose.material3.ExperimentalMaterial3Api import androidx.compose.material3.FloatingActionButton import androidx.compose.material3.Icon import androidx.compose.material3.IconButton import androidx.compose.material3.MaterialTheme import androidx.compose.material3.OutlinedButton import androidx.compose.material3.OutlinedTextField import androidx.compose.material3.Scaffold import androidx.compose.material3.SnackbarHostState import androidx.compose.material3.Switch import androidx.compose.material3.SwitchDefaults import androidx.compose.material3.Text import androidx.compose.material3.TopAppBar import androidx.compose.material3.TopAppBarDefaults import androidx.compose.runtime.Composable import androidx.compose.runtime.getValue import androidx.compose.runtime.mutableStateOf import androidx.compose.runtime.remember import androidx.compose.runtime.rememberCoroutineScope 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.layout.ContentScale import androidx.compose.ui.platform.LocalContext 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 coil.compose.AsyncImage import coil.request.ImageRequest import com.aistudio.bonjuteri.jwlry.model.Banner import com.aistudio.bonjuteri.jwlry.ui.components.EmptyStateView import com.aistudio.bonjuteri.jwlry.ui.theme.ErrorRed import com.aistudio.bonjuteri.jwlry.ui.theme.GoldPrimary import com.aistudio.bonjuteri.jwlry.ui.theme.LightSurface import com.aistudio.bonjuteri.jwlry.ui.theme.MutedGrey import com.aistudio.bonjuteri.jwlry.ui.theme.OffWhite import com.aistudio.bonjuteri.jwlry.ui.theme.PrimaryBlack import com.aistudio.bonjuteri.jwlry.ui.theme.PureWhite import kotlinx.coroutines.launch @OptIn(ExperimentalMaterial3Api::class) @Composable fun AdminBannerScreen( banners: List, onAddBanner: suspend (String, String, String, String, Long) -> Result, onUpdateBanner: suspend (Banner) -> Result, onDeleteBanner: suspend (String) -> Result, onBackClick: () -> Unit, snackbarHostState: SnackbarHostState, modifier: Modifier = Modifier ) { var showDialog by remember { mutableStateOf(false) } var editingBanner by remember { mutableStateOf(null) } val scope = rememberCoroutineScope() Scaffold( topBar = { TopAppBar( title = { Text("Banner & Kampanyalar (${banners.size})", fontWeight = FontWeight.Bold) }, navigationIcon = { IconButton(onClick = onBackClick) { Icon(Icons.AutoMirrored.Filled.ArrowBack, contentDescription = "Geri") } }, colors = TopAppBarDefaults.topAppBarColors(containerColor = PureWhite) ) }, floatingActionButton = { FloatingActionButton( onClick = { editingBanner = null showDialog = true }, containerColor = PrimaryBlack, contentColor = PureWhite, modifier = Modifier.testTag("admin_add_banner_fab") ) { Icon(Icons.Filled.Add, contentDescription = "Banner Ekle") } } ) { padding -> if (banners.isEmpty()) { EmptyStateView( icon = Icons.Filled.Image, title = "Banner Bulunmuyor", description = "Ana sayfa için promosyon veya kampanya afişleri ekleyebilirsiniz.", actionButtonText = "+ Yeni Banner Ekle", onActionClick = { editingBanner = null showDialog = true }, modifier = Modifier.padding(padding).fillMaxSize() ) } else { LazyColumn( modifier = modifier .fillMaxSize() .padding(padding) .background(OffWhite) .padding(14.dp), verticalArrangement = Arrangement.spacedBy(10.dp) ) { items(banners, key = { it.id }) { banner -> Card( modifier = Modifier.fillMaxWidth(), colors = CardDefaults.cardColors(containerColor = PureWhite), shape = RoundedCornerShape(12.dp), elevation = CardDefaults.cardElevation(defaultElevation = 1.dp) ) { Column { if (banner.imageUrl.isNotBlank()) { AsyncImage( model = ImageRequest.Builder(LocalContext.current) .data(banner.imageUrl) .crossfade(true) .build(), contentDescription = banner.title, modifier = Modifier .fillMaxWidth() .height(110.dp) .clip(RoundedCornerShape(topStart = 12.dp, topEnd = 12.dp)), contentScale = ContentScale.Crop ) } Row( modifier = Modifier .fillMaxWidth() .padding(12.dp), verticalAlignment = Alignment.CenterVertically ) { Column(modifier = Modifier.weight(1f)) { if (banner.subtitle.isNotBlank()) { Text(banner.subtitle, color = GoldPrimary, fontSize = 10.sp, fontWeight = FontWeight.Bold) } Text(banner.title, fontWeight = FontWeight.Bold, fontSize = 14.sp) } IconButton(onClick = { editingBanner = banner; showDialog = true }) { Icon(Icons.Filled.Edit, contentDescription = "Düzenle", tint = PrimaryBlack) } IconButton(onClick = { scope.launch { val res = onDeleteBanner(banner.id) if (res.isSuccess) snackbarHostState.showSnackbar("Banner silindi.") } }) { Icon(Icons.Filled.Delete, contentDescription = "Sil", tint = ErrorRed) } } } } } } } if (showDialog) { var title by remember { mutableStateOf(editingBanner?.title ?: "") } var subtitle by remember { mutableStateOf(editingBanner?.subtitle ?: "") } var imageUrl by remember { mutableStateOf(editingBanner?.imageUrl ?: "") } var linkTarget by remember { mutableStateOf(editingBanner?.linkTarget ?: "") } var orderStr by remember { mutableStateOf((editingBanner?.order ?: (banners.size + 1)).toString()) } AlertDialog( onDismissRequest = { showDialog = false }, title = { Text(if (editingBanner == null) "Yeni Banner Ekle" else "Bannerı Düzenle", fontWeight = FontWeight.Bold) }, text = { Column(verticalArrangement = Arrangement.spacedBy(10.dp)) { OutlinedTextField(value = title, onValueChange = { title = it }, label = { Text("Başlık *") }, modifier = Modifier.fillMaxWidth().testTag("admin_banner_title_input"), singleLine = true) OutlinedTextField(value = subtitle, onValueChange = { subtitle = it }, label = { Text("Alt Başlık") }, modifier = Modifier.fillMaxWidth(), singleLine = true) OutlinedTextField(value = imageUrl, onValueChange = { imageUrl = it }, label = { Text("Görsel URL *") }, modifier = Modifier.fillMaxWidth().testTag("admin_banner_image_input"), singleLine = true) OutlinedTextField(value = linkTarget, onValueChange = { linkTarget = it }, label = { Text("Yönlendirme Linki / Kategori") }, modifier = Modifier.fillMaxWidth(), singleLine = true) OutlinedTextField(value = orderStr, onValueChange = { orderStr = it }, label = { Text("Sıralama") }, modifier = Modifier.fillMaxWidth(), singleLine = true) } }, confirmButton = { Button( onClick = { val trimmedT = title.trim() val trimmedImg = imageUrl.trim() if (trimmedT.isBlank() || trimmedImg.isBlank()) return@Button val ord = orderStr.toLongOrNull() ?: 1L scope.launch { val res = if (editingBanner == null) { onAddBanner(trimmedT, subtitle.trim(), trimmedImg, linkTarget.trim(), ord) } else { onUpdateBanner(editingBanner!!.copy(title = trimmedT, subtitle = subtitle.trim(), imageUrl = trimmedImg, linkTarget = linkTarget.trim(), order = ord)) } if (res.isSuccess) { showDialog = false snackbarHostState.showSnackbar("Banner kaydedildi.") } else { snackbarHostState.showSnackbar(res.exceptionOrNull()?.message ?: "Hata oluştu.") } } }, colors = ButtonDefaults.buttonColors(containerColor = PrimaryBlack), modifier = Modifier.testTag("admin_save_banner_btn") ) { Text("Kaydet") } }, dismissButton = { OutlinedButton(onClick = { showDialog = false }) { Text("İptal") } } ) } } }