package com.lukouguoji.module_base.ui.weight.phone

import android.content.Context
import android.os.Parcelable
import android.util.AttributeSet
import android.util.SparseArray
import android.view.View
import android.widget.LinearLayout
import android.widget.TextView
import com.lukouguoji.module_base.R

/**
 * 手机版卡片统计框（5.5 寸手持端公共组件）
 *
 * 浅灰底 + 8dp 圆角，横向等宽 2~4 列，每列为「小号灰标签 + 加粗数值」，列间带竖分隔线。
 * 对应设计稿列表卡片中部的统计区（如「架子车号 / 目的港 / 装机重」）。
 *
 * XML 用法（列数由是否传 label 决定，未传的列自动隐藏）：
 * ```xml
 * <com.lukouguoji.module_base.ui.weight.phone.PhoneStatBox
 *     android:layout_width="match_parent"
 *     android:layout_height="wrap_content"
 *     label1="@{`架子车号`}" value1="@{bean.carId}"
 *     label2="@{`目的港`}"   value2="@{bean.fdest}"
 *     label3="@{`装机重`}"   value3='@{bean.netWeight + "kg"}' />
 * ```
 */
class PhoneStatBox @JvmOverloads constructor(
    context: Context,
    attrs: AttributeSet? = null,
    defStyleAttr: Int = 0
) : LinearLayout(context, attrs, defStyleAttr) {

    private val columns: List<LinearLayout>
    private val labels: List<TextView>
    private val values: List<TextView>

    /** 分隔线（下标 0 对应第 2 列左侧，依次类推） */
    private val dividers: List<View>

    init {
        orientation = HORIZONTAL
        setBackgroundResource(R.drawable.bg_phone_stat_box)
        val pad = (12 * resources.displayMetrics.density).toInt()
        setPadding(pad, pad, pad, pad)

        inflate(context, R.layout.layout_phone_stat_box, this)

        columns = listOf(
            findViewById(R.id.ll_col1),
            findViewById(R.id.ll_col2),
            findViewById(R.id.ll_col3),
            findViewById(R.id.ll_col4)
        )
        labels = listOf(
            findViewById(R.id.tv_label1),
            findViewById(R.id.tv_label2),
            findViewById(R.id.tv_label3),
            findViewById(R.id.tv_label4)
        )
        values = listOf(
            findViewById(R.id.tv_value1),
            findViewById(R.id.tv_value2),
            findViewById(R.id.tv_value3),
            findViewById(R.id.tv_value4)
        )
        dividers = listOf(
            findViewById(R.id.divider2),
            findViewById(R.id.divider3),
            findViewById(R.id.divider4)
        )

        // 默认只展示第 1 列，其余待 label 赋值后再显示
        for (i in 1..3) setColumnVisible(i, false)
    }

    /**
     * 只保存/恢复自身状态。列表中每个卡片都含一个本组件，内部子控件 id 相同，
     * 交由系统按 id 恢复会跨实例串档。
     */
    override fun dispatchSaveInstanceState(container: SparseArray<Parcelable>) {
        dispatchFreezeSelfOnly(container)
    }

    override fun dispatchRestoreInstanceState(container: SparseArray<Parcelable>) {
        dispatchThawSelfOnly(container)
    }

    /** 设置第 [index] 列（0 起）的标签，传空则隐藏该列 */
    fun setLabel(index: Int, text: String?) {
        if (index !in labels.indices) return
        labels[index].text = text.orEmpty()
        setColumnVisible(index, !text.isNullOrEmpty())
    }

    /** 设置第 [index] 列（0 起）的数值 */
    fun setValue(index: Int, text: String?) {
        if (index !in values.indices) return
        values[index].text = text.orEmpty()
    }

    private fun setColumnVisible(index: Int, visible: Boolean) {
        val flag = if (visible) VISIBLE else GONE
        columns[index].visibility = flag
        // 第 2~4 列连带其左侧分隔线一起显隐
        if (index in 1..3) dividers[index - 1].visibility = flag
    }
}
