package com.lukouguoji.aerologic.page.uld.edit

import android.content.Intent
import androidx.lifecycle.MutableLiveData
import com.lukouguoji.module_base.base.BaseViewModel
import com.lukouguoji.module_base.bean.ULDBean
import com.lukouguoji.module_base.common.Constant
import com.lukouguoji.module_base.common.DetailsPageType
import com.lukouguoji.module_base.http.net.NetApply
import com.lukouguoji.module_base.ktx.launchLoadingCollect
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.util.DeviceUtil
import com.lukouguoji.module_base.util.DictUtils
import dev.DevUtils
import dev.utils.app.info.KeyValue

class UldEditViewModel : BaseViewModel() {

    var id = ""

    val pageType = MutableLiveData(DetailsPageType.Add)

    val uldBean = MutableLiveData(ULDBean())

    val statusList = MutableLiveData<List<KeyValue>>(
        listOf(
            KeyValue("正常", "0"),
            KeyValue("故障", "1"),
        )
    )

    // 所属航司下拉列表（数据源：POST /typeCode/intCarrier）
    val carrierList = MutableLiveData<List<KeyValue>>(emptyList())

    // ========== 手机版（5.5 寸手持端）专用 ==========

    /** 来源选项（本地枚举；后端字段暂不支持，需求已登记 documents/后端接口对接问题清单.xlsx） */
    val sourceEditList = MutableLiveData<List<KeyValue>>(
        listOf(
            KeyValue("空运", "空运"),
            KeyValue("陆运", "陆运"),
        )
    )

    /**
     * 手机版状态选项。设计稿为三态（可用/占用/维修），后端枚举当前仅 0/1，
     * 按语义映射 可用=0 / 维修=1；「占用」待后端扩展枚举后放开（需求已登记清单）。
     */
    val statusPhoneList = listOf(
        KeyValue("可用", "0"),
        KeyValue("维修", "1"),
    )

    fun initOnCreate(intent: Intent) {
        id = intent.getStringExtra(Constant.Key.ID) ?: ""
        val modify = intent.getBooleanExtra(Constant.Key.DATA, false)
        pageType.value = if (id.isEmpty()) DetailsPageType.Add
        else if (modify) DetailsPageType.Modify else DetailsPageType.Details

        if (id.isEmpty()) {
            // 新增：直接加载航司列表
            loadCarrierList(null)
            // 手机版新增默认所在港 HFE（设计稿约定）；平板无此预填，行为不变
            if (DeviceUtil.isPhone()) {
                uldBean.value = uldBean.value?.copy(airport = "HFE")
            }
        } else {
            getData()
        }
    }

    /** 手机版状态行选中回调（copy 重新赋值以触发标签样式刷新） */
    fun onStatusSelected(statusValue: String) {
        uldBean.value = uldBean.value?.copy(status = statusValue)
    }

    private fun getData() {
        if (id.isEmpty()) return
        launchLoadingCollect({
            NetApply.api.queryUldByCode(id)
        }) {
            onSuccess = {
                uldBean.value = it.data ?: ULDBean()
                // 编辑/详情：数据加载完成后再加载字典，将已选航司置顶回填
                loadCarrierList(uldBean.value?.carrier)
            }
        }
    }

    private fun loadCarrierList(checkedValue: String?) {
        DictUtils.getIntCarrierList(checkedValue = checkedValue?.ifEmpty { null }) {
            carrierList.value = it
        }
    }

    fun onSaveClick() {
        val bean = uldBean.value ?: return
        if (bean.uld.isBlank()) {
            showToast("ULD编号不能为空")
            return
        }
        // 手机版按设计稿校验必填项（自重 / 入库时间）；平板表单无入库时间项，保持原校验行为
        if (DeviceUtil.isPhone()) {
            if (bean.uldWeight.isBlank()) {
                showToast("自重不能为空")
                return
            }
            if (bean.checkInDate.isBlank()) {
                showToast("入库时间不能为空")
                return
            }
        }
        val isAdd = pageType.value == DetailsPageType.Add
        launchLoadingCollect({
            if (isAdd) NetApply.api.saveUld(bean.toRequestBody())
            else NetApply.api.updateUld(bean.toRequestBody())
        }) {
            onSuccess = {
                showToast(it.msg.noNull(if (isAdd) "新增成功" else "修改成功"))
                if (isAdd) {
                    // 清空表单继续录入；手机版保持所在港默认 HFE（与进入页面时一致）
                    uldBean.value = if (DeviceUtil.isPhone()) ULDBean(airport = "HFE") else ULDBean()
                } else {
                    getData()
                }
            }
        }
    }

    fun onCancelClick() {
        DevUtils.getTopActivity().finish()
    }
}
