package xyz.apiote.bimba.czwek.search

import android.annotation.SuppressLint
import android.content.Context
import android.content.Intent
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import android.widget.ImageView
import android.widget.TextView
import androidx.recyclerview.widget.RecyclerView
import xyz.apiote.bimba.czwek.R
import xyz.apiote.bimba.czwek.departures.DeparturesActivity
import xyz.apiote.bimba.czwek.repo.Line
import xyz.apiote.bimba.czwek.repo.Queryable
import xyz.apiote.bimba.czwek.repo.Stop
import xyz.apiote.bimba.czwek.repo.StopStub

class BimbaViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView) {
	val root: View = itemView.findViewById(R.id.suggestion)
	val icon: ImageView = itemView.findViewById(R.id.suggestion_image)
	val title: TextView = itemView.findViewById(R.id.suggestion_title)
	val description: TextView = itemView.findViewById(R.id.suggestion_description)

	companion object {
		fun bind(
			queryable: Queryable,
			holder: BimbaViewHolder?,
			context: Context?,
			onClickListener: (Queryable) -> Unit
		) {
			when (queryable) {
				is Stop -> bindStop(queryable, holder, context)
				is Line -> bindLine(queryable, holder, context)
			}
			holder?.root?.setOnClickListener {
				onClickListener(queryable)
			}
		}

		fun bind(
			stopStub: StopStub,
			holder: BimbaViewHolder?,
			context: Context?,
			onClickListener: (StopStub) -> Unit
		) {
			holder?.title?.text = stopStub.name
			holder?.icon?.apply {
				setImageDrawable(stopStub.icon(context!!))
				contentDescription = context.getString(R.string.stop_content_description)
			}
			holder?.description?.text = when {
				stopStub.zone != "" && stopStub.onDemand -> context?.getString(
					R.string.stop_stub_on_demand_in_zone,
					stopStub.zone
				)

				stopStub.zone == "" && stopStub.onDemand -> context?.getString(R.string.stop_stub_on_demand)
				stopStub.zone != "" && !stopStub.onDemand -> context?.getString(
					R.string.stop_stub_in_zone,
					stopStub.zone
				)

				else -> ""
			}
			holder?.root?.setOnClickListener {
				onClickListener(stopStub)
			}
		}

		private fun bindStop(stop: Stop, holder: BimbaViewHolder?, context: Context?) {
			holder?.icon?.apply {
				setImageDrawable(stop.icon(context!!))
				contentDescription = context.getString(R.string.stop_content_description)
			}
			holder?.title?.text = stop.name
			context?.let {
				stop.changeOptions(it).let { changeOptions ->
					holder?.description?.apply {
						text = changeOptions.first
						contentDescription = changeOptions.second
					}
				}
			}
		}

		private fun bindLine(line: Line, holder: BimbaViewHolder?, context: Context?) {
			holder?.icon?.apply {
				setImageDrawable(line.icon(context!!))
				contentDescription = line.type.name
				colorFilter = null
			}
			holder?.title?.text = line.name
			holder?.description?.text = if (line.headsigns.size == 1) {
				context?.getString(
					R.string.line_headsign,
					line.headsigns[0].joinToString { it })
			} else {
				context?.getString(
					R.string.line_headsigns,
					line.headsigns[0].joinToString { it },
					line.headsigns[1].joinToString { it })
			}
			holder?.description?.contentDescription =if (line.headsigns.size == 1) {
				context?.getString(
					R.string.line_headsign_content_description,
					line.headsigns[0].joinToString { it })
			} else {
				context?.getString(
					R.string.line_headsigns_content_description,
					line.headsigns[0].joinToString { it },
					line.headsigns[1].joinToString { it })
			}
		}
	}
}


class BimbaResultsAdapter(
	private val inflater: LayoutInflater,
	private val context: Context?,
	private var queryables: List<Queryable>,
) :
	RecyclerView.Adapter<BimbaViewHolder>() {
	private val onClickListener: ((Queryable) -> Unit) = {
		when (it) {
			is Stop -> {
				val intent = Intent(context, DeparturesActivity::class.java).apply {
					putExtra("code", it.code)
					putExtra("name", it.name)
					putExtra("feedID", it.feedID)
				}
				context!!.startActivity(intent)
			}

			is Line -> {
				val intent = Intent(context, LineGraphActivity::class.java).apply {
					putExtra("line", it.name)
					putExtra("feedID", it.feedID)
				}
				context!!.startActivity(intent)
			}
		}
	}

	override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): BimbaViewHolder {
		val rowView = inflater.inflate(R.layout.result, parent, false)
		return BimbaViewHolder(rowView)
	}

	override fun onBindViewHolder(holder: BimbaViewHolder, position: Int) {
		BimbaViewHolder.bind(queryables[position], holder, context, onClickListener)
	}

	override fun getItemCount(): Int = queryables.size

	@SuppressLint("NotifyDataSetChanged") // todo [3.2] DiffUtil
	fun update(queryables: List<Queryable>?) {
		this.queryables = queryables ?: emptyList()
		notifyDataSetChanged()
	}

	fun click(position: Int) {
		onClickListener(queryables[position])
	}
}