package com.google.chip.chiptool.clusterclient.clusterinteraction

import android.util.Log
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import android.widget.EditText
import android.widget.LinearLayout
import android.widget.TextView
import androidx.constraintlayout.widget.ConstraintLayout
import androidx.recyclerview.widget.RecyclerView
import chip.clusterinfo.CommandResponseInfo
import com.google.chip.chiptool.R

/**
 * HistoryCommandAdapter implements the historyCommandList(RecycleView) Adapter and associates different
 * history command with the same onClick function provided in [ClusterInteractionHistoryFragment.HistoryCommandListener]
 */
class HistoryCommandAdapter(
  private val HistoryCommandList: List<HistoryCommand>,
  private val listener: ClusterInteractionHistoryFragment.HistoryCommandListener,
  private val inflater: LayoutInflater,
) : RecyclerView.Adapter<HistoryCommandAdapter.HistoryCommandViewHolder>() {

  inner class HistoryCommandViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView),
                                                         View.OnClickListener {
    var historyInfo: LinearLayout = itemView.findViewById(R.id.historyBasicInfo)
    var parameterList: LinearLayout = itemView.findViewById(R.id.historyParameterList)
    var responseValueList: LinearLayout = itemView.findViewById(R.id.historyResponseValueList)
    var statusCode: LinearLayout = itemView.findViewById(R.id.historyItemStatus)

    init {
      itemView.setOnClickListener(this)
    }

    override fun onClick(endpointItem: View) {
      val position = this.adapterPosition
      if (position != RecyclerView.NO_POSITION) {
        listener.onItemClick(position)
      }
    }
  }

  interface OnItemClickListener {
    fun onItemClick(position: Int)
  }

  override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): HistoryCommandViewHolder {
    val itemView =
      LayoutInflater.from(parent.context)
        .inflate(R.layout.cluster_interaction_history_item, parent, false)
    return HistoryCommandViewHolder(itemView)
  }

  override fun getItemCount(): Int {
    return HistoryCommandList.size
  }

  override fun getItemId(position: Int): Long {
    return position.toLong()
  }

  override fun getItemViewType(position: Int): Int {
    return position
  }

  override fun onBindViewHolder(
    holder: HistoryCommandAdapter.HistoryCommandViewHolder,
    position: Int
  ) {
    // go through each element and fill the data
    // fill out cluster name and command name
    clearPreviousReview(holder)
    val info = inflater.inflate(
      R.layout.cluster_interaction_history_item_info,
      null,
      false
    ) as ConstraintLayout
    val historyClusterNameTv: TextView = info.findViewById(R.id.historyClusterNameTv)
    val historyCommandNameTv: TextView = info.findViewById(R.id.historyCommandNameTv)

    historyClusterNameTv.text = HistoryCommandList[position].clusterName
    historyCommandNameTv.text = HistoryCommandList[position].commandName
    holder.historyInfo.addView(info)
    // fill out parameterList
    if (HistoryCommandList[position].parameterList.isEmpty()) {
      val emptyParameterList =
        inflater.inflate(android.R.layout.simple_list_item_1, null, false) as TextView
      emptyParameterList.text = "No parameter"
      holder.parameterList.addView(emptyParameterList)
    } else {
      HistoryCommandList[position].parameterList.forEach {
        val param =
          inflater.inflate(R.layout.cluster_parameter_item, null, false) as ConstraintLayout
        val clusterParameterNameTv: TextView = info.findViewById(R.id.clusterParameterNameTv)
        val clusterParameterTypeTv: TextView = info.findViewById(R.id.clusterParameterTypeTv)
        val clusterParameterData: EditText = info.findViewById(R.id.clusterParameterData)

        clusterParameterData.setText(it.parameterData)
        clusterParameterNameTv.text = it.parameterName
        clusterParameterTypeTv.text = formatParameterType(it.parameterType)
        holder.parameterList.addView(param)
      }
    }
    // fill out responseList
    if (HistoryCommandList[position].responseValue == null || HistoryCommandList[position].responseValue!!.isEmpty()) {
      val emptyResponseInfo =
        inflater.inflate(android.R.layout.simple_list_item_1, null, false) as TextView
      emptyResponseInfo.text = "No response"
      holder.responseValueList.addView(emptyResponseInfo)
    } else {
      populateCallbackResult(
        HistoryCommandList[position].responseValue!!,
        inflater,
        holder.responseValueList
      )
    }
    // fill out status
    val statusInfo = inflater.inflate(android.R.layout.simple_list_item_1, null, false) as TextView
    statusInfo.text = "Status: " + HistoryCommandList[position].status
    holder.statusCode.addView(statusInfo)
  }

  private fun populateCallbackResult(
    responseValues: Map<CommandResponseInfo, Any>,
    inflater: LayoutInflater,
    callbackList: LinearLayout
  ) {
    responseValues.forEach { (variableNameType, response) ->
      if (response is List<*>) {
        createListResponseView(response, inflater, callbackList, variableNameType)
      } else {
        createBasicResponseView(response, inflater, callbackList, variableNameType)
      }
    }
  }

  private fun createBasicResponseView(
    response: Any,
    inflater: LayoutInflater,
    callbackList: LinearLayout,
    variableNameType: CommandResponseInfo
  ) {
    val callbackItem =
      inflater.inflate(R.layout.cluster_callback_item, null, false) as ConstraintLayout
    val clusterCallbackNameTv: TextView = callbackItem.findViewById(R.id.clusterCallbackNameTv)
    val clusterCallbackDataTv: TextView = callbackItem.findViewById(R.id.clusterCallbackDataTv)
    val clusterCallbackTypeTv: TextView = callbackItem.findViewById(R.id.clusterCallbackTypeTv)

    clusterCallbackNameTv.text = variableNameType.name
    clusterCallbackDataTv.text = if (response.javaClass == ByteArray::class.java) {
      (response as ByteArray).decodeToString()
    } else {
      response.toString()
    }
    clusterCallbackTypeTv.text = variableNameType.type
    callbackList.addView(callbackItem)
  }

  private fun createListResponseView(
    response: List<*>,
    inflater: LayoutInflater,
    callbackList: LinearLayout,
    variableNameType: CommandResponseInfo
  ) {
    if (response.isEmpty()) {
      val emptyCallback =
        inflater.inflate(R.layout.cluster_callback_item, null, false) as ConstraintLayout
      val clusterCallbackNameTv: TextView = emptyCallback.findViewById(R.id.clusterCallbackNameTv)

      clusterCallbackNameTv.text = "Result is empty"
      callbackList.addView(emptyCallback)
    } else {
      response.forEachIndexed { index, it ->
        val attributeCallbackItem =
          inflater.inflate(R.layout.cluster_callback_item, null, false) as ConstraintLayout
        val clusterCallbackNameTv: TextView = attributeCallbackItem.findViewById(R.id.clusterCallbackNameTv)
        val clusterCallbackDataTv: TextView = attributeCallbackItem.findViewById(R.id.clusterCallbackDataTv)
        val clusterCallbackTypeTv: TextView = attributeCallbackItem.findViewById(R.id.clusterCallbackTypeTv)

        clusterCallbackNameTv.text = variableNameType.name + "[$index]"
        val objectString = if (it!!.javaClass == ByteArray::class.java) {
          (it as ByteArray).contentToString()
        } else {
          it.toString()
        }
        var callbackClassName = if (it!!.javaClass == ByteArray::class.java) {
          "Byte[]"
        } else {
          it!!.javaClass.toString().split('$').last()
        }
        clusterCallbackDataTv.text = objectString
        clusterCallbackTypeTv.text = "List<$callbackClassName>"
        callbackList.addView(attributeCallbackItem)
      }
    }
  }

  private fun formatParameterType(castType: Class<*>): String {
    return if (castType == ByteArray::class.java) {
      "Byte[]"
    } else {
      castType.toString()
    }
  }

  private fun clearPreviousReview(holder: HistoryCommandAdapter.HistoryCommandViewHolder) {
    holder.historyInfo.removeAllViews()
    holder.parameterList.removeAllViews()
    holder.responseValueList.removeAllViews()
    holder.statusCode.removeAllViews()
  }
}