package com.lukouguoji.gjc.viewModel

import android.app.Activity
import android.content.Intent
import androidx.lifecycle.MutableLiveData
import androidx.lifecycle.viewModelScope
import com.lukouguoji.gjc.R
import com.lukouguoji.gjc.activity.GjcWeighingRecordListActivity
import com.lukouguoji.gjc.activity.GjcWeighingStartActivity
import com.lukouguoji.gjc.holder.GjcWeighingViewHolder
import com.lukouguoji.module_base.base.BasePageViewModel
import com.lukouguoji.module_base.bean.GjcMaWb
import com.lukouguoji.module_base.bean.GjcWeighingBean
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.commonAdapter
import com.lukouguoji.module_base.ktx.launchCollect
import com.lukouguoji.module_base.ktx.launchLoadingCollect
import com.lukouguoji.module_base.ktx.formatDate
import com.lukouguoji.module_base.ktx.noNull
import com.lukouguoji.module_base.ktx.showToast
import com.lukouguoji.module_base.ktx.toRequestBody
import com.lukouguoji.module_base.model.ScanModel
import com.lukouguoji.module_base.util.DictUtils
import dev.utils.app.info.KeyValue
import dev.utils.common.DateUtils
import kotlinx.coroutines.launch

/**
 * 国际出港计重 ViewModel
 */
class GjcWeighingViewModel : BasePageViewModel() {

    // 搜索条件
    val flightDate = MutableLiveData<String>(DateUtils.getCurrentTime().formatDate())           // 航班日期
    val flightNo = MutableLiveData("")             // 航班号
    val agentCode = MutableLiveData("")            // 代理人
    val spCode = MutableLiveData("")               // 特码
    val waybillNo = MutableLiveData("")            // 运单号

    // 下拉列表数据源
    val agentList = MutableLiveData(listOf(KeyValue("全部", "")))
    val spCodeList = MutableLiveData<List<KeyValue>>(emptyList())

    // 适配器配置
    val itemViewHolder = GjcWeighingViewHolder::class.java
    val itemLayoutId = R.layout.item_gjc_weighing

    // 统计数据
    val totalCount = MutableLiveData("0")          // 合计票数
    val totalPc = MutableLiveData("0")             // 总件数
    val totalWeight = MutableLiveData("0")         // 总重量

    // 全选状态
    val isAllChecked = MutableLiveData(false)

    // ========== 5.5寸手机版专属字段（平板不调用 initPhoneExtras，行为零变化） ==========

    /** 手机版顶部搜索关键字（运单号/航班号混输，getData 内分流：含字母→fno，纯数字→likeNo 模糊） */
    val searchKey = MutableLiveData("")

    /** 主页三格统计：待计重（checkIn=0）/ 计重中（checkIn=2）数量 */
    val pendingCount = MutableLiveData("0")
    val weighingCount = MutableLiveData("0")

    /** 手机版筛选弹层字段。通道号/承运人/运单类型后端暂无查询入参（见接口问题清单），传预留参数名 */
    val channelFilter = MutableLiveData("")     // 通道号 → passageWayId
    val carrierFilter = MutableLiveData("")     // 承运人 → by0
    val awbTypeFilter = MutableLiveData("")     // 运单类型 → awbType
    val channelList = MutableLiveData<List<KeyValue>>(emptyList())
    val awbTypeList = MutableLiveData<List<KeyValue>>(emptyList())

    /** 由手机形态的 Activity 置 true，平板保持 false（不产生任何额外请求与参数） */
    private var phoneExtrasEnabled = false

    /**
     * 开启手机版专属数据：放开「今天」默认日期（设计稿主页无日期筛选）、加载筛选弹层字典。
     * 仅由手机形态的 Activity 调用。
     */
    fun initPhoneExtras() {
        phoneExtrasEnabled = true
        flightDate.value = ""
        DictUtils.getGjcChannelList { list ->
            channelList.postValue(listOf(KeyValue("全部", "")) + list)
        }
        DictUtils.getWaybillTypeList2(ieFlag = "E", type = "IO") {
            awbTypeList.postValue(it)
        }
    }

    /**
     * 单票提前运抵（手机版卡片内按钮；平板走底部批量 [arrivedAhead]）
     */
    fun arrivedAheadSingle(bean: GjcWeighingBean) {
        if (bean.arriveFlag == "1") {
            showToast("该运单已提前运抵")
            return
        }
        val maWbList = listOf(
            GjcMaWb(
                maWbId = bean.maWbId,
                no = bean.no,
                prefix = bean.prefix,
                wbNo = bean.wbNo,
                arriveFlag = "1"
            )
        )
        launchLoadingCollect({ NetApply.api.preArrive(maWbList) }) {
            onSuccess = {
                showToast("提前运抵成功")
                viewModelScope.launch {
                    FlowBus.with<String>(ConstantEvent.EVENT_REFRESH).emit("refresh")
                }
                refresh()
            }
            onFailed = { code, msg ->
                showToast(msg.noNull("提前运抵失败"))
            }
        }
    }

    fun onItemCheckChanged() {
        updateCheckAllStatus()
    }

    fun updateCheckAllStatus() {
        val list = pageModel.rv?.commonAdapter()?.items as? List<GjcWeighingBean> ?: return
        isAllChecked.value = list.isNotEmpty() && list.all { it.checked.get() }
    }

    ///////////////////////////////////////////////////////////////////////////
    // 方法区
    ///////////////////////////////////////////////////////////////////////////

    /**
     * 初始化代理下拉列表（从API获取）
     */
    fun initAgentList() {
        launchCollect({
            // 调用API获取代理人列表
            NetApply.api.getIntExpAgentList()
        }) {
            onSuccess = { result ->
                val list = mutableListOf(KeyValue("全部", ""))
                // 将DictBean转换为KeyValue
                result.data?.forEach {
                    list.add(KeyValue(it.name ?: "", it.code ?: ""))
                }
                agentList.value = list
            }
        }
    }

    /**
     * 初始化特码下拉列表（从API获取）
     */
    fun initSpecialCodeList() {
        DictUtils.getSpecialCodeList(
            flag = 1,           // 国际
            ieFlag = "",        // 空字符串
            parentcode = ""     // 无父级
        ) {
            spCodeList.value = it
        }
    }

    /**
     * 扫码输入运单号
     */
    fun waybillNoScanClick() {
        ScanModel.startScan(getTopActivity(), Constant.RequestCode.WAYBILL)
    }

    /**
     * 搜索按钮点击
     */
    fun searchClick() {
        refresh()
    }

    /**
     * 添加按钮点击（跳转到开始计重页面）
     */
    fun addClick() {
        GjcWeighingStartActivity.startForAdd(getTopActivity())
    }

    /**
     * 计重记录按钮点击
     */
    fun recordClick() {
        GjcWeighingRecordListActivity.start(getTopActivity())
    }

    /**
     * 全选按钮点击 (切换全选状态)
     */
    fun checkAllClick() {
        val list = pageModel.rv?.commonAdapter()?.items as? List<GjcWeighingBean> ?: return

        // 切换全选状态
        val shouldCheckAll = !isAllChecked.value!!
        list.forEach { it.checked.set(shouldCheckAll) }
        isAllChecked.value = shouldCheckAll

        pageModel.rv?.commonAdapter()?.notifyDataSetChanged()
    }

    /**
     * 提前运抵
     */
    fun arrivedAhead() {
        val list = pageModel.rv?.commonAdapter()?.items as? List<GjcWeighingBean> ?: return
        val selectedItems = list.filter { it.isSelected }

        if (selectedItems.isEmpty()) {
            showToast("请选择要提前运抵的运单")
            return
        }

        // 转换为GjcMaWb对象列表（只传递必要字段）
        val maWbList = selectedItems.map { bean ->
            GjcMaWb(
                maWbId = bean.maWbId,
                no = bean.no,
                prefix = bean.prefix,
                wbNo = bean.wbNo,
                arriveFlag = "1"  // 设置提前运抵标识
            )
        }

        launchLoadingCollect({ NetApply.api.preArrive(maWbList) }) {
            onSuccess = {
                showToast("提前运抵成功")
                // 发送刷新事件
                viewModelScope.launch {
                    FlowBus.with<String>(ConstantEvent.EVENT_REFRESH).emit("refresh")
                }
                refresh()
            }
            onFailed = { code, msg ->
                showToast(msg.noNull("提前运抵失败"))
            }
        }
    }

    /**
     * 获取列表数据
     */
    override fun getData() {
        // 公共查询条件（列表与统计共用）
        val baseParams = mutableMapOf<String, Any?>(
            "fdate" to flightDate.value!!.ifEmpty { null },
            "fno" to flightNo.value!!.ifEmpty { null },
            "agentCode" to agentCode.value!!.ifEmpty { null },
            "spCode" to spCode.value!!.ifEmpty { null },
            "wbNo" to waybillNo.value!!.ifEmpty { null },
        )

        // 手机版专属条件（平板 phoneExtrasEnabled 恒为 false，请求体与改造前完全一致）
        if (phoneExtrasEnabled) {
            val key = searchKey.value?.trim() ?: ""
            if (key.isNotEmpty()) {
                // 分流规则（实测）：含字母 → 航班号；11 位数字 → wbNo 精确；
                // 其余数字 → likeNo（后端按 8 位 no 匹配，并非任意模糊）
                when {
                    key.any { it.isLetter() } -> baseParams["fno"] = key
                    key.length == 11 -> baseParams["wbNo"] = key
                    else -> baseParams["likeNo"] = key
                }
            }
            // 以下三个为后端预留参数（暂无对应入参，后端静默忽略，见接口问题清单）
            baseParams["passageWayId"] = channelFilter.value?.ifEmpty { null }
            baseParams["by0"] = carrierFilter.value?.ifEmpty { null }
            baseParams["awbType"] = awbTypeFilter.value?.ifEmpty { null }
        }

        // 构建查询参数（列表接口）
        val listParams = (baseParams + mapOf(
            "pageNum" to pageModel.page,
            "pageSize" to pageModel.limit,
        )).toRequestBody()

        // 构建查询参数（统计接口 - 使用相同的搜索条件）
        val totalParams = baseParams.toRequestBody()

        // 获取列表数据（显示loading）
        launchLoadingCollect({
            NetApply.api.getGjcWeighingList(listParams)
        }) {
            onSuccess = {
                pageModel.handleListBean(it) { updateCheckAllStatus() }
            }
        }

        // 获取统计数据（后台调用，不显示loading）
        launchCollect({
            NetApply.api.getGjcWeighingStatistics(totalParams)
        }) {
            onSuccess = { result ->
                val data = result.data
                totalCount.value = (data?.wbNumber ?: 0).toString()
                totalPc.value = (data?.totalPc ?: 0).toString()
                totalWeight.value = (data?.totalWeight ?: 0.0).toString()
            }
        }

        // 手机版三格统计：待计重 / 计重中（各带一次 checkIn 条件的统计请求，仅手机调用）
        if (phoneExtrasEnabled) {
            listOf("0" to pendingCount, "2" to weighingCount).forEach { (state, liveData) ->
                launchCollect({
                    NetApply.api.getGjcWeighingStatistics(
                        (baseParams + mapOf("checkIn" to state)).toRequestBody()
                    )
                }) {
                    onSuccess = { result ->
                        liveData.value = (result.data?.wbNumber ?: 0).toString()
                    }
                }
            }
        }
    }

    /**
     * 处理扫码结果
     */
    override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) {
        if (resultCode == Activity.RESULT_OK && data != null) {
            when (requestCode) {
                Constant.RequestCode.WAYBILL -> {
                    val content = data.getStringExtra(Constant.Result.CODED_CONTENT)
                    // 手机版扫码写入顶部搜索框，平板写入原运单号搜索条
                    if (phoneExtrasEnabled) searchKey.value = content
                    else waybillNo.value = content
                    refresh()
                }
            }
        }
    }
}
