package br.com.alura.orgs.ui.recyclerview.adapter
import android.content.Context
import android.content.Intent
import android.view.LayoutInflater
import android.view.MenuItem
import android.view.View
import android.view.ViewGroup
import android.widget.PopupMenu
import androidx.recyclerview.widget.RecyclerView
import br.com.alura.orgs.R
import br.com.alura.orgs.database.AppDatabase
import br.com.alura.orgs.database.dao.ProdutoDao
import br.com.alura.orgs.databinding.ProdutoItemBinding
import br.com.alura.orgs.extensions.formataParaMoedaBrasileira
import br.com.alura.orgs.extensions.tentaCarregarImagem
import br.com.alura.orgs.model.Produto
class ListaProdutosAdapter(
private val context: Context,
produtos: List<Produto> = emptyList(),
var quandoClicaNoItem: (produto: Produto) -> Unit = {},
var quandoClicaEmEditar: (produto:Produto) -> Unit = {},
var quandoClicaEmRemover: (produto:Produto) -> Unit = {}
) : RecyclerView.Adapter<ListaProdutosAdapter.ViewHolder>() {
private val produtos = produtos.toMutableList()
inner class ViewHolder(private val binding: ProdutoItemBinding) :
RecyclerView.ViewHolder(binding.root), PopupMenu.OnMenuItemClickListener{
private lateinit var produto: Produto
init {
itemView.setOnClickListener {
if (::produto.isInitialized) {
quandoClicaNoItem(produto)
}
}
itemView.setOnLongClickListener{
PopupMenu(context, itemView).apply {
menuInflater.inflate(R.menu.menu_detalhes_produto,menu)
setOnMenuItemClickListener(this@ViewHolder)
}.show()
true
}
}
override fun onMenuItemClick(item: MenuItem?): Boolean {
item?.let {
val produtoDao: ProdutoDao by lazy {
val db = AppDatabase.instancia(context)
db.produtoDao()
}
when(it.itemId){
R.id.menu_detalhes_produto_editar ->{
quandoClicaEmEditar(produto)
}
R.id.menu_detalhes_produto_remover -> {
quandoClicaEmRemover(produto)
produtoDao.remove(produto)
}
}
}
return true
}
fun vincula(produto: Produto) {
this.produto = produto
val nome = binding.produtoItemNome
nome.text = produto.nome
val descricao = binding.produtoItemDescricao
descricao.text = produto.descricao
val valor = binding.produtoItemValor
val valorEmMoeda: String = produto.valor
.formataParaMoedaBrasileira()
valor.text = valorEmMoeda
val visibilidade = if (produto.imagem != null) {
View.VISIBLE
} else {
View.GONE
}
binding.imageView.visibility = visibilidade
binding.imageView.tentaCarregarImagem(produto.imagem)
}
}
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ViewHolder {
val inflater = LayoutInflater.from(context)
val binding = ProdutoItemBinding.inflate(inflater, parent, false)
return ViewHolder(binding)
}
override fun onBindViewHolder(holder: ViewHolder, position: Int) {
val produto = produtos[position]
holder.vincula(produto)
}
override fun getItemCount(): Int = produtos.size
fun atualiza(produtos: List<Produto>) {
this.produtos.clear()
this.produtos.addAll(produtos)
notifyDataSetChanged()
}
}