package com.lukouguoji.gjc.viewModel

import android.app.AlertDialog
import android.widget.EditText
import androidx.lifecycle.LiveData
import androidx.lifecycle.MutableLiveData
import androidx.lifecycle.viewModelScope
import com.lukouguoji.gjc.R
import com.lukouguoji.gjc.dialog.GjcAssembleAllocateDialogModel
import com.lukouguoji.gjc.holder.GjcAssembleAllocateViewHolder
import com.lukouguoji.module_base.base.BasePageViewModel
import com.lukouguoji.module_base.bean.AssembleCompanyBean
import com.lukouguoji.module_base.bean.GjcAssembleAllocate
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.showToast
import com.lukouguoji.module_base.ktx.toRequestBody
import com.lukouguoji.module_base.util.CheckUtil
import dev.utils.app.info.KeyValue
import dev.utils.common.DateUtils
import com.lukouguoji.module_base.ktx.formatDate
import kotlinx.coroutines.launch

/**
 * 国际出港组装分配 ViewModel
 */
class GjcAssembleAllocateViewModel : BasePageViewModel() {

    // 搜索条件
    val flightDate = MutableLiveData<String>(DateUtils.getCurrentTime().formatDate())           // 航班日期
    val flightNo = MutableLiveData("")             // 航班号
    val destAirport = MutableLiveData("")          // 目的站
    val assembler = MutableLiveData("")            // 组装人
    val allocator = MutableLiveData("")            // 分配人

    // 适配器配置
    val itemViewHolder = GjcAssembleAllocateViewHolder::class.java
    val itemLayoutId = R.layout.item_gjc_assemble_allocate

    // 统计数据
    val totalCount = MutableLiveData("0")      // 合计票数

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

    // 分配人列表（从接口获取，存储 KeyValue 格式）
    private val _assembleCompanyList = MutableLiveData<List<KeyValue>>(emptyList())
    val assembleCompanyList: LiveData<List<KeyValue>> = _assembleCompanyList

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

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

    /**
     * 获取列表数据
     */
    override fun getData() {
        // 构建查询参数（列表接口）
        val listParams = mapOf(
            "page" to pageModel.page,
            "limit" to pageModel.limit,
            "fdate" to flightDate.value!!.ifEmpty { null },
            "fno" to flightNo.value!!.ifEmpty { null },
            "dest" to destAirport.value!!.ifEmpty { null },
            "abId" to assembler.value!!.ifEmpty { null },
            "acName" to allocator.value!!.ifEmpty { null }
        ).toRequestBody()

        // 构建查询参数（统计接口 - 使用相同的搜索条件）
        val totalParams = mapOf(
            "fdate" to flightDate.value!!.ifEmpty { null },
            "fno" to flightNo.value!!.ifEmpty { null },
            "dest" to destAirport.value!!.ifEmpty { null },
            "abId" to assembler.value!!.ifEmpty { null },
            "acName" to allocator.value!!.ifEmpty { null }
        ).toRequestBody()

        // 获取列表数据（显示loading）
        launchLoadingCollect({
            NetApply.api.getGjcAssembleAllocateList(listParams)
        }) {
            onSuccess = { pageInfo ->
                pageModel.handleListBean(pageInfo.toBaseListBean()) { updateCheckAllStatus() }
            }
        }

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

    /**
     * 全选/全不选
     */
    fun checkAllClick() {
        val list = pageModel.rv!!.commonAdapter()!!.items as List<GjcAssembleAllocate>
        CheckUtil.handleAllCheck(list)
        updateCheckAllStatus()
    }

    /**
     * 更新全选状态
     */
    fun updateCheckAllStatus() {
        val list = pageModel.rv?.commonAdapter()?.items as? List<GjcAssembleAllocate>
        if (list != null && list.isNotEmpty()) {
            isAllChecked.value = list.all { it.checked.get() }
        } else {
            isAllChecked.value = false
        }
    }

    /**
     * 单个item点击事件（用于更新全选状态）
     */
    fun onItemCheckChanged() {
        updateCheckAllStatus()
    }

    /**
     * 获取分配人列表
     * 在 Activity 初始化时调用
     */
    fun getAssembleCompanyList() {
        launchCollect({ NetApply.api.getAssembleCompanyList() }) {
            onSuccess = { result ->
                val list = result.data?.map { it.toKeyValue() } ?: emptyList()
                _assembleCompanyList.value = list
            }
        }
    }

    /**
     * 分配按钮点击
     */
    fun allocateClick() {
        val list = pageModel.rv!!.commonAdapter()!!.items as List<GjcAssembleAllocate>
        val selectedItems = list.filter { it.checked.get() }

        if (selectedItems.isEmpty()) {
            showToast("请选择要分配的航班")
            return
        }

        // 检查分配人列表是否为空
        if (_assembleCompanyList.value.isNullOrEmpty()) {
            showToast("分配人列表为空，请稍后重试")
            return
        }

        // 显示分配人选择对话框
        showAllocatorSelectDialog(selectedItems)
    }

    /**
     * 显示分配人选择对话框
     */
    private fun showAllocatorSelectDialog(items: List<GjcAssembleAllocate>) {
        // 构建航班信息字符串（例如：CA1234、MU5678）
        val flightInfo = items.joinToString("、") { it.fno ?: "" }

        GjcAssembleAllocateDialogModel(
            flightInfo = flightInfo,
            assembleCompanyList = _assembleCompanyList.value ?: emptyList()
        ) { dialog ->
            // 回调：用户点击确定后执行分配操作
            // dialog.allocator.value 存储的是选中的 code（例如 "ATR"）
            val allocatorCode = dialog.allocator.value ?: ""
            performAllocate(items, allocatorCode)
        }.show(getTopActivity())
    }

    /**
     * 执行分配操作
     * @param items 选中的航班列表
     * @param allocatorCode 分配人代码（例如 "ATR"，而非 "ATR:马道"）
     */
    private fun performAllocate(items: List<GjcAssembleAllocate>, allocatorCode: String) {
        val fidList = items.mapNotNull { it.fid }

        val requestData = mapOf(
            "fidList" to fidList,        // 航班ID列表
            "abId" to allocatorCode    // 分配人代码（传递 code 而非 name）
        ).toRequestBody()

        launchLoadingCollect({ NetApply.api.allocateAssemble(requestData) }) {
            onSuccess = {
                showToast("分配成功")
                viewModelScope.launch {
                    FlowBus.with<String>(ConstantEvent.EVENT_REFRESH).emit("refresh")
                }
                refresh()
            }
        }
    }
}
