package fr.plnech.dunbar.ui

import android.text.format.DateUtils
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import android.widget.Toast
import androidx.recyclerview.widget.RecyclerView
import fr.plnech.dunbar.R
import fr.plnech.dunbar.model.Friend
import kotlinx.android.synthetic.main.contact.view.*


class FriendsAdapter(
    private var friends: List<Friend> = mutableListOf()
) : RecyclerView.Adapter<FriendsViewHolder>() {

    override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): FriendsViewHolder =
        FriendsViewHolder(
            LayoutInflater.from(parent.context).inflate(
                viewType,
                parent,
                false
            )
        )

    override fun getItemCount(): Int = friends.size

    override fun getItemViewType(position: Int): Int = R.layout.contact

    override fun onBindViewHolder(holder: FriendsViewHolder, position: Int): Unit =
        holder.bind(friends[position])
}

class FriendsViewHolder(private val view: View) : RecyclerView.ViewHolder(view) {
    private val name = view.contactName
    private val data = view.contactData
    private val phone = view.contactPhone
    private val callButton = view.contactCall
    private val smsButton = view.contactText
    private val pic = view.pic

    fun bind(friend: Friend) {
        name.text = friend.name
        data.text = buildDataString(friend)
        bindPhone(friend)

        bindPic(friend)
        bindClick(friend)
    }

    private fun buildDataString(friend: Friend): String {
        return buildString {
            if (friend.lastDate != null) {
                append(friend.timesContacted)
                append(" interactions, last ")
                append(DateUtils.getRelativeTimeSpanString(friend.lastTimeStamp))
            } else {
                append("Never interacted")
            }
        }
    }

    private fun bindClick(friend: Friend) {
        view.setOnClickListener {
            Toast.makeText(view.context, friend.mapString(), Toast.LENGTH_LONG).show()
            println(friend.mapString())
        }
    }

    private fun bindPic(friend: Friend) {
        friend.photo?.let {
            pic.setImageBitmap(it)
        }
    }

    private fun bindPhone(friend: Friend) {
        friend.phone?.let {
            phone.text = it

            mapOf(
                callButton to friend.callIntent(),
                smsButton to friend.smsIntent()
            ).entries.forEach { pair ->
                pair.key.apply {
                    visibility = View.VISIBLE
                    setOnClickListener {
                        view.context.startActivity(pair.value)
                    }
                }
            }
        }
    }

}