package com.example.tabbuy.ui

import android.app.Application
import androidx.lifecycle.AndroidViewModel
import androidx.lifecycle.LiveData
import androidx.lifecycle.MutableLiveData
import androidx.lifecycle.switchMap
import androidx.lifecycle.viewModelScope
import com.example.tabbuy.data.local.AppDatabase
import com.example.tabbuy.data.local.entity.KeranjangEntity
import com.example.tabbuy.data.local.entity.PelangganEntity
import com.example.tabbuy.data.local.entity.ProdukEntity
import com.example.tabbuy.data.repository.MainRepository
import kotlinx.coroutines.launch

class MainViewModel(application: Application) : AndroidViewModel(application) {
    private val repository: MainRepository
    
    private val _searchQuery = MutableLiveData<String>("")
    
    // LiveData untuk menyimpan produk yang sedang dipilih untuk dilihat detailnya
    private val _selectedProduk = MutableLiveData<ProdukEntity?>()
    val selectedProduk: LiveData<ProdukEntity?> = _selectedProduk

    val allProduk: LiveData<List<ProdukEntity>> = _searchQuery.switchMap { query ->
        if (query.isNullOrEmpty()) {
            repository.getAllProduk()
        } else {
            repository.searchProduk("%$query%")
        }
    }

    private val _allKeranjang = MutableLiveData<List<KeranjangEntity>>()
    val allKeranjang: LiveData<List<KeranjangEntity>> = _allKeranjang

    private val _allPelanggan = MutableLiveData<List<PelangganEntity>>()
    val allPelanggan: LiveData<List<PelangganEntity>> = _allPelanggan

    init {
        val db = AppDatabase.getDatabase(application)
        repository = MainRepository(db.pelangganDao(), db.produkDao(), db.keranjangDao())
        loadKeranjang()
        loadPelanggan()
    }

    // Fungsi untuk memilih produk
    fun selectProduk(produk: ProdukEntity) {
        _selectedProduk.value = produk
    }

    // Produk
    fun searchProduk(query: String) {
        _searchQuery.value = query
    }

    fun addProduk(produk: ProdukEntity) = viewModelScope.launch {
        repository.insertProduk(produk)
    }

    fun updateProduk(produk: ProdukEntity) = viewModelScope.launch {
        repository.updateProduk(produk)
    }

    fun deleteProduk(produk: ProdukEntity) = viewModelScope.launch {
        repository.deleteProduk(produk)
    }

    // Pelanggan (CRUD)
    fun loadPelanggan() = viewModelScope.launch {
        _allPelanggan.postValue(repository.getAllPelanggan())
    }

    fun register(pelanggan: PelangganEntity) = viewModelScope.launch {
        repository.insertPelanggan(pelanggan)
        loadPelanggan()
    }

    suspend fun login(email: String): PelangganEntity? {
        return repository.getPelangganByEmail(email)
    }

    fun updatePelanggan(pelanggan: PelangganEntity) = viewModelScope.launch {
        repository.updatePelanggan(pelanggan)
        loadPelanggan()
    }

    fun deletePelanggan(pelanggan: PelangganEntity) = viewModelScope.launch {
        repository.deletePelanggan(pelanggan)
        loadPelanggan()
    }

    // Keranjang
    fun loadKeranjang() = viewModelScope.launch {
        _allKeranjang.postValue(repository.getAllKeranjang())
    }

    fun addToCart(produk: ProdukEntity) = viewModelScope.launch {
        val currentCart = repository.getAllKeranjang()
        val existingItem = currentCart.find { it.produkId == produk.id }

        if (existingItem != null) {
            val updatedItem = existingItem.copy(jumlah = existingItem.jumlah + 1)
            repository.addToCart(updatedItem)
        } else {
            repository.addToCart(KeranjangEntity(
                produkId = produk.id,
                namaProduk = produk.nama,
                harga = produk.harga,
                gambar = produk.gambar,
                jumlah = 1
            ))
        }
        loadKeranjang()
    }

    fun updateKeranjang(keranjang: KeranjangEntity) = viewModelScope.launch {
        repository.addToCart(keranjang)
        loadKeranjang()
    }

    fun removeFromCart(keranjang: KeranjangEntity) = viewModelScope.launch {
        repository.removeFromCart(keranjang)
        loadKeranjang()
    }
    
    fun clearCart() = viewModelScope.launch {
        repository.clearCart()
        loadKeranjang()
    }
}
