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.FrameLayout
import android.widget.ImageView
import android.widget.LinearLayout
import android.widget.TextView
import androidx.core.content.ContextCompat
import com.lukouguoji.module_base.R

/**
 * 手机版底部筛选弹层（5.5 寸手持端公共组件）
 *
 * 半透明遮罩 + 底部白色面板（顶部 20dp 圆角），面板内含标题行、内容插槽、重置/确认按钮行。
 * 对应设计稿各列表页的「筛选条件」弹层。
 *
 * **内容插槽**：直接把筛选项（一般是 [PhoneDataLayout]）写在本组件标签内即可，
 * [onFinishInflate] 会自动把它们移入面板中部，无需关心内部层级：
 *
 * ```xml
 * <com.lukouguoji.module_base.ui.weight.phone.PhoneFilterPanel
 *     android:layout_width="match_parent"
 *     android:layout_height="match_parent"
 *     panelVisible="@{activity.filterPanelVisible}"
 *     setOnResetClick="@{(v)-> activity.resetFilter()}"
 *     setOnConfirmClick="@{(v)-> activity.confirmFilter()}"
 *     setOnDismissClick="@{(v)-> activity.toggleFilterPanel()}">
 *
 *     <com.lukouguoji.module_base.ui.weight.phone.PhoneDataLayout ... />
 *     <com.lukouguoji.module_base.ui.weight.phone.PhoneDataLayout ... />
 *
 * </com.lukouguoji.module_base.ui.weight.phone.PhoneFilterPanel>
 * ```
 *
 * 相邻筛选项之间的 20dp 间距由本组件统一施加，使用方无需逐个写 marginTop。
 */
class PhoneFilterPanel @JvmOverloads constructor(
    context: Context,
    attrs: AttributeSet? = null,
    defStyleAttr: Int = 0
) : FrameLayout(context, attrs, defStyleAttr) {

    /**
     * 同一页面可能出现多个含内部 id 的手机版复合组件，系统按 id 保存/恢复视图状态会跨实例串档。
     * 这里只保存/恢复自身状态、不下发给子控件；筛选值由 ViewModel + DataBinding 持有，无需视图级恢复。
     */
    override fun dispatchSaveInstanceState(container: SparseArray<Parcelable>) {
        dispatchFreezeSelfOnly(container)
    }

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

    val llPanel: LinearLayout
    val llContent: LinearLayout
    val tvTitle: TextView
    val ivClose: ImageView
    val tvReset: TextView
    val tvConfirm: TextView

    /** 遮罩点击 / 关闭图标点击回调 */
    private var dismissListener: OnClickListener? = null

    var title: String = ""
        set(v) {
            field = v
            if (v.isNotEmpty()) tvTitle.text = v
        }

    /** 弹层显隐 */
    var panelVisible: Boolean = false
        set(v) {
            field = v
            visibility = if (v) VISIBLE else GONE
        }

    init {
        setBackgroundColor(ContextCompat.getColor(context, R.color.black_tran50))
        visibility = GONE

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

        llPanel = findViewById(R.id.ll_panel)
        llContent = findViewById(R.id.ll_content)
        tvTitle = findViewById(R.id.tv_title)
        ivClose = findViewById(R.id.iv_close)
        tvReset = findViewById(R.id.tv_reset)
        tvConfirm = findViewById(R.id.tv_confirm)

        // 遮罩点击关闭；面板自身已 clickable，不会穿透
        setOnClickListener { dismissListener?.onClick(this) }
        ivClose.setOnClickListener { dismissListener?.onClick(it) }
    }

    /**
     * 把 XML 中声明在本组件内的子 View 移入面板内容区，并统一施加 20dp 项间距。
     */
    override fun onFinishInflate() {
        super.onFinishInflate()

        // index 0 是内部面板（init 中 inflate 得到），其后才是使用方声明的子 View
        val declared = mutableListOf<View>()
        for (i in childCount - 1 downTo 1) {
            declared.add(0, getChildAt(i))
            removeViewAt(i)
        }

        declared.forEachIndexed { index, child ->
            llContent.addView(child)
            if (index > 0) {
                (child.layoutParams as? LinearLayout.LayoutParams)?.let { lp ->
                    lp.topMargin = (20 * resources.displayMetrics.density).toInt()
                    child.layoutParams = lp
                }
            }
        }
    }

    fun setOnDismiss(listener: OnClickListener?) {
        dismissListener = listener
    }

    /** 遍历内容区所有 [PhoneDataLayout] 并重置为空值 */
    fun resetAllFields() {
        for (i in 0 until llContent.childCount) {
            (llContent.getChildAt(i) as? PhoneDataLayout)?.reset()
        }
    }
}
