package com.aistudio.bonjuteri.jwlry.data import android.content.Context import com.aistudio.bonjuteri.jwlry.model.OrderStatus import com.aistudio.bonjuteri.jwlry.model.PaymentStatus import com.aistudio.bonjuteri.jwlry.model.Product import com.google.firebase.firestore.FirebaseFirestore import kotlinx.coroutines.tasks.await data class AdminDashboardMetrics( val totalProducts: Long = 0L, val totalOrders: Long = 0L, val pendingOrders: Long = 0L, val totalUsers: Long = 0L, val lowStockCount: Long = 0L, val totalSalesAmount: Double = 0.0 ) class AdminDashboardRepository( private val firestore: FirebaseFirestore ) { companion object { @Volatile private var INSTANCE: AdminDashboardRepository? = null fun getInstance(context: Context): AdminDashboardRepository { return INSTANCE ?: synchronized(this) { INSTANCE ?: AdminDashboardRepository( FirestoreHelper.getFirestore(context) ).also { INSTANCE = it } } } } suspend fun getMetrics(): AdminDashboardMetrics { return try { val productsSnapshot = firestore.collection(ProductRepository.PRODUCTS_COLLECTION).get().await() val totalProducts = productsSnapshot.size().toLong() var lowStockCount = 0L for (doc in productsSnapshot.documents) { val stock = doc.getLong("stock") ?: 0L if (stock in 1..4) { lowStockCount++ } } val ordersSnapshot = firestore.collection(OrderRepository.ORDERS_COLLECTION).get().await() val totalOrders = ordersSnapshot.size().toLong() var pendingOrders = 0L var totalSales = 0.0 for (doc in ordersSnapshot.documents) { val orderStatus = doc.getString("orderStatus") val totalAmount = doc.getDouble("totalAmount") ?: 0.0 val paymentStatus = doc.getString("paymentStatus") if (orderStatus == OrderStatus.PREPARING.name || paymentStatus == PaymentStatus.PENDING.name) { pendingOrders++ } if (orderStatus != OrderStatus.CANCELLED.name) { totalSales += totalAmount } } val usersSnapshot = firestore.collection("users").get().await() val totalUsers = usersSnapshot.size().toLong() AdminDashboardMetrics( totalProducts = totalProducts, totalOrders = totalOrders, pendingOrders = pendingOrders, totalUsers = totalUsers, lowStockCount = lowStockCount, totalSalesAmount = totalSales ) } catch (e: Exception) { AdminDashboardMetrics() } } }