package com.lukouguoji.gjc.viewModel

import android.content.Intent
import androidx.lifecycle.MutableLiveData
import androidx.lifecycle.viewModelScope
import com.alibaba.android.arouter.utils.TextUtils
import com.lukouguoji.module_base.base.BaseViewModel
import com.lukouguoji.module_base.bean.ComAttach
import com.lukouguoji.module_base.bean.FileBean
import com.lukouguoji.module_base.bean.GjcInspectionBean
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.launchLoadingCollect
import com.lukouguoji.module_base.ktx.showConfirmDialog
import com.lukouguoji.module_base.ktx.showToast
import com.lukouguoji.module_base.ktx.toRequestBody
import com.lukouguoji.module_base.ui.page.preview.PreviewActivity
import com.lukouguoji.module_base.ui.page.preview.PdfPreviewActivity
import com.lukouguoji.module_base.util.MediaUtil
import kotlinx.coroutines.launch

/**
 * 国际出港收运检查详情 ViewModel
 */
class GjcInspectionDetailsViewModel : BaseViewModel() {

    // 运单主键ID
    var maWbId: Long = 0

    // 详情数据
    val dataBean = MutableLiveData<GjcInspectionBean>()

    // 退回原因（独立字段，初始为空）
    val returnReason = MutableLiveData("")

    /**
     * 初始化数据
     */
    fun initOnCreated(intent: Intent) {
        maWbId = intent.getLongExtra(Constant.Key.MAWB_ID, 0)
        if (maWbId > 0) {
            getData()
        } else {
            showToast("参数错误")
            getTopActivity().finish()
        }
    }

    /**
     * 获取详情数据
     */
    private fun getData() {
        launchLoadingCollect({
            NetApply.api.getGjcInspectionDetails(maWbId)
        }) {
            onSuccess = {
                dataBean.value = it.data ?: GjcInspectionBean()
            }
        }
    }

    /**
     * 通过审核
     */
    fun auditPass() {
        val bean = dataBean.value ?: return
        val reason = returnReason.value ?: ""
        getTopActivity().showConfirmDialog("确定要通过该单证吗？") {
            performAudit(bean, true, "通过", reason)
        }
    }

    /**
     * 退回
     */
    fun auditReject() {
        val bean = dataBean.value ?: return
        val reason = returnReason.value ?: ""
        if (reason.isEmpty()) {
            showToast("请输入退回原因")
            return
        }
        getTopActivity().showConfirmDialog("确定要退回该单证吗？") {
            performAudit(bean, false, "退回", reason)
        }
    }

    /**
     * 执行审核操作
     * @param bean 数据
     * @param isPass true:通过, false:退回
     * @param action 操作名称（用于提示）
     * @param reason 退回原因（仅退回时使用）
     */
    private fun performAudit(bean: GjcInspectionBean, isPass: Boolean, action: String, reason: String) {
        // 构建请求参数：数组对象，包含 maWbId、wbNo、prefix、no、reviewStatus（必传）
        // 使用数据自身的 reviewStatus 值
        val requestData = listOf(
            mapOf(
                "maWbId" to bean.maWbId,
                "wbNo" to bean.wbNo,
                "prefix" to bean.prefix,
                "no" to bean.no,
                "reviewStatus" to bean.reviewStatus
            )
        ).toRequestBody()

        // 根据审核状态调用不同接口
        launchLoadingCollect({
            if (isPass) {
                NetApply.api.passGjcInspection(reason, requestData)
            } else {
                NetApply.api.backGjcInspection(reason, requestData)
            }
        }) {
            onSuccess = {
                showToast("${action}成功")
                // 发送刷新事件
                viewModelScope.launch {
                    FlowBus.with<String>(ConstantEvent.EVENT_REFRESH).emit("refresh")
                }
                // 返回上一页
                getTopActivity().finish()
            }
        }
    }

    /**
     * 获取附件名称列表（用于显示）
     */
    fun getAttachNames(): String {
        val attachList = dataBean.value?.attachList
        return if (attachList.isNullOrEmpty()) {
            "无附件"
        } else {
            attachList.joinToString("   ") { it.name }
        }
    }

    /**
     * 附件点击处理
     * @param attach 附件对象
     */
    fun onAttachClick(attach: ComAttach) {
        // 处理URL：先处理转义字符，再判断是否需要组装完整URL
        val url = processAttachUrl(attach.path)

        when {
            // 图片格式：使用PreviewActivity预览
            attach.name.endsWith(".jpg", true) ||
            attach.name.endsWith(".png", true) ||
            attach.name.endsWith(".jpeg", true) -> {
                val fileBean = FileBean(
                    url = url,
                    path = url,
                    originalPic = url
                )
                PreviewActivity.start(getTopActivity(), listOf(fileBean))
            }
            // PDF格式：使用PdfPreviewActivity预览
            attach.name.endsWith(".pdf", true) -> {
                PdfPreviewActivity.start(getTopActivity(), url)
            }
            // 其他格式
            else -> {
                showToast("暂不支持该文件格式预览")
            }
        }
    }

    /**
     * 处理附件URL
     * 1. 处理转义字符（如 \/ 替换为 /）
     * 2. 如果不是以http开头，则使用MediaUtil.fillUrl组装完整URL
     */
    private fun processAttachUrl(path: String): String {
        // 先处理转义字符：\/ -> /
        val cleanPath = path.replace("\\/", "/")

        // 判断是否已是完整URL
        return if (cleanPath.startsWith("http://", true) || cleanPath.startsWith("https://", true)) {
            cleanPath
        } else {
            MediaUtil.fillUrl(cleanPath)
        }
    }
}
