package com.lukouguoji.gjc.viewModel

import android.app.Activity
import android.content.Intent
import androidx.lifecycle.MutableLiveData
import com.lukouguoji.gjc.R
import com.lukouguoji.gjc.holder.GjcWeighingRecordViewHolder
import com.lukouguoji.module_base.base.BasePageViewModel
import com.lukouguoji.module_base.common.Constant
import com.lukouguoji.module_base.bean.GjcWeighingRecordBean
import com.lukouguoji.module_base.http.net.NetApply
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.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 com.lukouguoji.module_base.ktx.formatDate

/**
 * 国际出港计重记录 ViewModel
 */
class GjcWeighingRecordViewModel : 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 = GjcWeighingRecordViewHolder::class.java
    val itemLayoutId = R.layout.item_gjc_weighing_record

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

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

    /** 目的站（后端支持入参 dest） */
    val destFilter = MutableLiveData("")

    /** 计重人（后端支持入参 opId，下拉复用仓库用户列表） */
    val opUserFilter = MutableLiveData("")
    val whsUserList = MutableLiveData<List<KeyValue>>(emptyList())

    /** 入库日期起/止（后端暂无对应入参，传 opDateStart/opDateEnd 预留参数，见接口问题清单） */
    val checkInDateStart = MutableLiveData("")
    val checkInDateEnd = MutableLiveData("")

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

    /**
     * 开启手机版专属数据：放开「今天」默认日期（设计稿筛选无航班日期）、加载计重人下拉。
     * 仅由手机形态的 Activity 调用。
     */
    fun initPhoneExtras() {
        phoneExtrasEnabled = true
        flightDate.value = ""
        DictUtils.getWHSUserList { whsUserList.postValue(it) }
    }

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

    /**
     * 初始化代理人列表
     */
    fun initAgentList() {
        launchCollect({
            NetApply.api.getIntExpAgentList()
        }) {
            onSuccess = { result ->
                val list = mutableListOf(KeyValue("全部", ""))
                result.data?.forEach {
                    list.add(KeyValue(it.name ?: "", it.code ?: ""))
                }
                agentList.value = list
            }
        }
    }

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

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

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

    /**
     * 运抵申报按钮点击
     */
    fun declareClick() {
        // 获取列表数据
        val list = pageModel.rv?.commonAdapter()?.items as? List<GjcWeighingRecordBean> ?: emptyList()

        // 过滤选中项
        val selectedItems = list.filter { it.isSelected }

        when (selectedItems.size) {
            0 -> {
                // 没有选择单据：直接跳转（不带参数）
                com.alibaba.android.arouter.launcher.ARouter.getInstance()
                    .build(com.lukouguoji.module_base.router.ARouterConstants.ACTIVITY_URL_INT_EXP_ARRIVE)
                    .navigation()
            }
            1 -> {
                // 选择一个单据：跳转到出港运抵页面，携带运单号
                val waybillNo = selectedItems[0].wbNo
                com.alibaba.android.arouter.launcher.ARouter.getInstance()
                    .build(com.lukouguoji.module_base.router.ARouterConstants.ACTIVITY_URL_INT_EXP_ARRIVE)
                    .withString("wbNoParam", waybillNo)
                    .navigation()
            }
            else -> {
                // 选择多个单据：Toast 提示
                showToast("只能选择一个单据")
            }
        }
    }

    /**
     * 获取列表数据
     */
    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) {
            // 搜索分流（实测）：11 位数字走 wbNo 精确；其余走 likeNo（后端按 8 位 no 匹配）
            val key = waybillNo.value?.trim() ?: ""
            if (key.isNotEmpty() && key.length != 11) {
                baseParams["wbNo"] = null
                baseParams["likeNo"] = key
            }
            baseParams["dest"] = destFilter.value?.ifEmpty { null }
            baseParams["opId"] = opUserFilter.value?.ifEmpty { null }
            // 入库日期起/止为后端预留参数（暂无对应入参，静默忽略，见接口问题清单）
            baseParams["opDateStart"] = checkInDateStart.value?.ifEmpty { null }
            baseParams["opDateEnd"] = checkInDateEnd.value?.ifEmpty { null }
        }

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

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

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

        // 获取统计数据（后台调用，不显示loading）
        launchCollect({
            NetApply.api.getGjcWeighingRecordStatistics(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()
                cargoWeight.value = (data?.cargoWeight ?: 0.0).toString()
            }
        }
    }

    /**
     * 处理扫码结果
     */
    override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) {
        if (resultCode == Activity.RESULT_OK && data != null) {
            when (requestCode) {
                Constant.RequestCode.WAYBILL -> {
                    waybillNo.value = data.getStringExtra(Constant.Result.CODED_CONTENT)
                    refresh()
                }
            }
        }
    }
}
