package com.lukouguoji.gjc.viewModel

import android.content.Intent
import androidx.lifecycle.MutableLiveData
import androidx.lifecycle.viewModelScope
import com.lukouguoji.gjc.R
import com.lukouguoji.gjc.dialog.IntExpArriveResetDialogModel
import com.lukouguoji.gjc.holder.IntExpArriveSubOrderViewHolder
import com.lukouguoji.module_base.base.BaseViewModel
import com.lukouguoji.module_base.bean.GjcHaWb
import com.lukouguoji.module_base.common.Constant
import com.lukouguoji.module_base.common.ConstantEvent
import com.lukouguoji.module_base.http.net.NetApply
import com.lukouguoji.module_base.impl.FlowBus
import com.lukouguoji.module_base.ktx.launchLoadingCollect
import com.lukouguoji.module_base.ktx.showToast
import com.lukouguoji.module_base.ktx.toRequestBody
import kotlinx.coroutines.launch

/**
 * 国际出港运抵-分单明细 ViewModel（5.5寸手机版专属页面）
 *
 * 数据直接复用主列表页已加载的 haWbList（Intent 传入），无需任何新增请求。
 * 筛选仅「分单号」在客户端生效——航班日期/航班号/代理等字段在单个运单的分单集合内
 * 恒为同一值，筛选它们没有实际意义（设计稿疑似沿用主列表筛选组件模板，未按此页场景定制）。
 */
class IntExpArriveSubOrderViewModel : BaseViewModel() {

    // 运单号（页面标题辅助展示，非必需）
    var wbNo: String = ""
        private set

    // 完整分单列表（Intent 传入，不随筛选变化）
    private var fullList: List<GjcHaWb> = emptyList()

    // 当前展示列表（按分单号筛选后的结果）
    val displayList = MutableLiveData<List<GjcHaWb>>(emptyList())

    // 筛选：分单号（客户端 contains 匹配）
    val hnoFilter = MutableLiveData("")

    // 全选状态与已选计数
    val isAllChecked = MutableLiveData(false)
    val selectedCount = MutableLiveData("0")

    // 适配器配置
    val itemViewHolder = IntExpArriveSubOrderViewHolder::class.java
    val itemLayoutId = R.layout.item_int_exp_arrive_sub_order

    @Suppress("UNCHECKED_CAST")
    fun initOnCreated(intent: Intent) {
        wbNo = intent.getStringExtra(KEY_WB_NO).orEmpty()
        val list = intent.getSerializableExtra(Constant.Key.DATA) as? ArrayList<GjcHaWb>
        // Java 序列化会跳过 checked/actionMenuVisible（标了 @Transient，即 JVM transient 修饰符），
        // 反序列化后这两个 ObservableBoolean 字段为 null。.copy() 会重新走一遍类体初始化逻辑，
        // 用全新的 ObservableBoolean(false) 补上，避免全选/长按时 NPE（已实机崩溃验证过）。
        fullList = (list ?: emptyList()).map { it.copy() }
        displayList.value = fullList
    }

    /**
     * 分单号筛选（客户端 contains 匹配，非后端查询）。
     */
    fun searchClick() {
        val key = hnoFilter.value?.trim().orEmpty()
        displayList.value = if (key.isEmpty()) {
            fullList
        } else {
            fullList.filter { it.hno?.contains(key, ignoreCase = true) == true }
        }
        updateCheckAllStatus()
    }

    fun onItemCheckChanged() {
        updateCheckAllStatus()
    }

    fun updateCheckAllStatus() {
        val list = displayList.value ?: return
        isAllChecked.value = list.isNotEmpty() && list.all { it.checked.get() }
        selectedCount.value = list.count { it.checked.get() }.toString()
    }

    fun checkAllClick() {
        val list = displayList.value ?: return
        val shouldCheckAll = !isAllChecked.value!!
        list.forEach { it.checked.set(shouldCheckAll) }
        isAllChecked.value = shouldCheckAll
        selectedCount.value = if (shouldCheckAll) list.size.toString() else "0"
    }

    /**
     * 长按菜单「重置」（单条分单）。
     */
    fun resetSingleClick(bean: GjcHaWb) {
        val dialog = IntExpArriveResetDialogModel { dialogModel ->
            val params = mutableMapOf<String, Any?>("haWbList" to listOf(bean))
            if (dialogModel.resetStatusCode != null) {
                params["restStatus"] = dialogModel.resetStatusCode
            }
            launchLoadingCollect({ NetApply.api.resetArriveDeclare(params.toRequestBody()) }) {
                onSuccess = {
                    showToast("状态重置成功，请返回列表页下拉刷新查看最新状态")
                    viewModelScope.launch {
                        FlowBus.with<String>(ConstantEvent.EVENT_REFRESH).emit("refresh")
                    }
                }
            }
        }
        dialog.show()
    }

    /**
     * 底部「申报」：批量申报当前选中的分单。
     */
    fun declareClick() {
        val selected = displayList.value?.filter { it.isSelected } ?: emptyList()
        if (selected.isEmpty()) {
            showToast("请选择要申报的分单")
            return
        }
        val params = mapOf("haWbList" to selected).toRequestBody()
        launchLoadingCollect({ NetApply.api.arriveDeclare(params) }) {
            onSuccess = {
                showToast("运抵申报成功")
                viewModelScope.launch {
                    FlowBus.with<String>(ConstantEvent.EVENT_REFRESH).emit("refresh")
                }
                getTopActivity().finish()
            }
        }
    }

    companion object {
        const val KEY_WB_NO = "wbNo"
    }
}
