package com.lukouguoji.gnj.page.yiku.edit

import android.content.Intent
import androidx.lifecycle.MutableLiveData
import androidx.lifecycle.viewModelScope
import com.lukouguoji.gnj.R
import com.lukouguoji.module_base.base.BaseViewModel
import com.lukouguoji.module_base.bean.FileBean
import com.lukouguoji.module_base.bean.GnjYiKuBean
import com.lukouguoji.module_base.common.Constant
import com.lukouguoji.module_base.common.ConstantEvent
import com.lukouguoji.module_base.common.DetailsPageType
import com.lukouguoji.module_base.http.net.NetApply
import com.lukouguoji.module_base.impl.FlowBus
import com.lukouguoji.module_base.impl.ImageSelectViewHolder
import com.lukouguoji.module_base.interfaces.IOnItemClickListener
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.ktx.verifyNullOrEmpty
import com.lukouguoji.module_base.util.MediaUtil
import com.lukouguoji.module_base.util.UploadUtil
import dev.utils.app.info.KeyValue
import kotlinx.coroutines.launch

/**
 * 国内进港移库编辑 ViewModel
 */
class GnjYiKuEditViewModel : BaseViewModel(), IOnItemClickListener {

    val pageType = MutableLiveData(DetailsPageType.Add)
    var id = ""

    val dataBean = MutableLiveData(GnjYiKuBean())

    // 运单类型下拉列表
    val waybillTypeList = MutableLiveData(
        listOf(
            KeyValue("转国际进港", "CIII"),
            KeyValue("转国内出港", "CICO"),
            KeyValue("转国际出港", "CIIO"),
        )
    )

    // 图片列表（初始添加一个空的FileBean用于显示"添加图片"按钮）
    val imageList = MutableLiveData<MutableList<FileBean>>(
        mutableListOf(FileBean())
    )

    // 图片适配器配置
    val imageItemLayoutId = R.layout.item_image_select
    val imageItemViewHolder = ImageSelectViewHolder::class.java

    fun initOnCreated(intent: Intent) {
        // 获取页面类型
        pageType.value = DetailsPageType.valueOf(
            intent.getStringExtra(Constant.Key.PAGE_TYPE) ?: DetailsPageType.Add.name
        )

        // 如果是编辑或详情，加载数据
        if (pageType.value != DetailsPageType.Add) {
            id = intent.getStringExtra(Constant.Key.ID) ?: ""
            loadData()
        }
    }

    private fun loadData() {
        launchLoadingCollect({
            NetApply.api.getGnjYiKuDetails(id)
        }) {
            onSuccess = {
                val bean = it.data ?: GnjYiKuBean()
                dataBean.value = bean

                // 处理图片列表：pic 字段存缩略图文件名，originalPic 字段存原图文件名
                val picList = bean.pic.split(",").filter { it.isNotEmpty() }
                val originalPicList = bean.originalPic.split(",").filter { it.isNotEmpty() }
                val images = picList.mapIndexed { index, picUrl ->
                    val fb = FileBean(
                        path = MediaUtil.fillUrl(picUrl),
                        url = picUrl
                    )
                    if (index < originalPicList.size) {
                        fb.originalPic = MediaUtil.fillUrl(originalPicList[index])
                    }
                    fb
                }.toMutableList()

                // 如果是编辑模式，添加一个空的FileBean用于添加新图片
                if (pageType.value == DetailsPageType.Modify) {
                    images.add(FileBean())
                }

                imageList.value = images
            }
        }
    }

    /**
     * 提交保存
     */
    fun submit() {
        val bean = dataBean.value ?: return

        // 验证必填项
        if (bean.wbNo.verifyNullOrEmpty("请输入运单号")) return
        if (bean.pc.verifyNullOrEmpty("请输入件数")) return
        if (bean.weight.verifyNullOrEmpty("请输入重量")) return

        // 获取所有非空图片
        val images = imageList.value!!.filter { it.path.isNotEmpty() }

        // 检查图片数量限制（最多7张）
        if (images.size > 7) {
            showToast("最多上传7张图片")
            return
        }

        launchLoadingCollect({
            // 1. 上传图片
            images.forEach { fileBean ->
                if (fileBean.url.isNotEmpty()) {
                    // 已上传的图片，保持原有的 url 和 originalPic
                } else {
                    // 本地新图片需要上传
                    // UploadUtil 返回：newName=原图(较大)，zipFileName=缩略图(较小)
                    // FileBean.url 用作缩略图标识，FileBean.originalPic 用作原图标识
                    val data = UploadUtil.upload(fileBean.path).data
                    fileBean.url = data?.zipFileName ?: ""
                    fileBean.originalPic = data?.newName ?: ""
                }
            }

            // 2. 设置图片字段
            bean.picNumber = images.size.toString()
            bean.pic = images.joinToString(",") { MediaUtil.removeUrl(it.url) }
            bean.originalPic = images.joinToString(",") { MediaUtil.removeUrl(it.originalPic) }

            // 3. 提交表单数据
            NetApply.api.saveGnjYiKu(bean.toRequestBody())
        }) {
            onSuccess = {
                showToast(if (pageType.value == DetailsPageType.Add) "新增成功" else "保存成功")

                // 发送刷新事件
                viewModelScope.launch {
                    FlowBus.with<String>(ConstantEvent.EVENT_REFRESH_GNJ_YIKU_LIST).emit("refresh")
                }

                // 关闭页面
                getTopActivity().finish()
            }
        }
    }

    /**
     * 处理图片删除点击事件
     */
    override fun onItemClick(position: Int, type: Int) {
        val list = imageList.value!!
        if (type == R.id.iv_delete && position < list.size) {
            list.removeAt(position)
            imageList.value = list
        }
    }
}
