package com.covalima.rekomendasaunaihan.ui.rekomendasi import android.content.Intent import android.view.LayoutInflater import android.view.ViewGroup import android.widget.Toast import androidx.recyclerview.widget.RecyclerView import com.bumptech.glide.Glide import com.covalima.rekomendasaunaihan.R import com.covalima.rekomendasaunaihan.databinding.ItemRekomendasaunHasilBinding import com.covalima.rekomendasaunaihan.model.FavoritoToggleRequest import com.covalima.rekomendasaunaihan.model.FavoritoToggleResponse import com.covalima.rekomendasaunaihan.model.Rekomendasi import com.covalima.rekomendasaunaihan.network.ApiClient import com.covalima.rekomendasaunaihan.ui.detail.DetailAihanActivity import com.covalima.rekomendasaunaihan.util.DeviceUtil import retrofit2.Call import retrofit2.Callback import retrofit2.Response /** * Adapter ba lista rezultadu rekomendasaun kompletu (tuir formátu * Tabela 3.9-3.11 iha proposta: Rank, Ai-han, Similarity, Status). * Aumenta buton "Aumenta ba Favoritu" (ikon fuik/heart) atu utilizadór * bele rai rezultadu ne'ebé nia hakarak, haree fila iha "Lista Favoritu". */ class RekomendasaunHasilAdapter( private var listaHasil: List ) : RecyclerView.Adapter() { inner class HasilViewHolder(val binding: ItemRekomendasaunHasilBinding) : RecyclerView.ViewHolder(binding.root) override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): HasilViewHolder { val binding = ItemRekomendasaunHasilBinding.inflate(LayoutInflater.from(parent.context), parent, false) return HasilViewHolder(binding) } override fun onBindViewHolder(holder: HasilViewHolder, position: Int) { val item = listaHasil[position] val rank = position + 1 val context = holder.itemView.context holder.binding.tvRank.text = rank.toString() holder.binding.tvNaranAihan.text = item.naranAihan holder.binding.tvKategoria.text = "Kategoria: ${item.naranKategoria ?: "-"}" holder.binding.tvSimilaridade.text = String.format("%.2f", item.similaridade) holder.binding.tvStatus.text = statusHanesan(item.similaridade) Glide.with(context) .load(ApiClient.getFotoUrl(item.foto)) .into(holder.binding.imgAihan) // Buton "Aumenta ba Favoritu" (ikon fuik/heart) - toggle add/remove var isFavorito = false // estadu lokál de'it (server mak "fonte verdade") holder.binding.imgFavorito.setImageResource(R.drawable.ic_heart_outline) holder.binding.imgFavorito.setOnClickListener { val deviceId = DeviceUtil.getDeviceId(context) val request = FavoritoToggleRequest(idAihan = item.idAihan, idUser = deviceId) ApiClient.apiService.toggleFavorito(request).enqueue(object : Callback { override fun onResponse(call: Call, response: Response) { val body = response.body() if (body?.status == "success") { isFavorito = body.isFavorito holder.binding.imgFavorito.setImageResource( if (isFavorito) R.drawable.ic_heart_filled else R.drawable.ic_heart_outline ) val msg = if (isFavorito) "Aumenta ba Favoritu: ${item.naranAihan}" else "Hamos husi Favoritu: ${item.naranAihan}" Toast.makeText(context, msg, Toast.LENGTH_SHORT).show() } } override fun onFailure(call: Call, t: Throwable) { Toast.makeText(context, "Konesaun falha: ${t.message}", Toast.LENGTH_SHORT).show() } }) } holder.itemView.setOnClickListener { val intent = Intent(context, DetailAihanActivity::class.java) intent.putExtra("id_aihan", item.idAihan) context.startActivity(intent) } } override fun getItemCount() = listaHasil.size fun updateData(newList: List) { listaHasil = newList notifyDataSetChanged() } /** * Klasifika nivel semellansa tuir valor Cosine Similarity, * hanesan iha tabela "Status" iha proposta (Kapítulu 3.11-3.12). */ private fun statusHanesan(similaridade: Double): String { return when { similaridade >= 0.85 -> "Hanesan Tebes" similaridade >= 0.60 -> "Hanesan" similaridade >= 0.30 -> "Hanesan" else -> "La Hanesan" } } }