package com.lukouguoji.gjc.activity

import android.app.Activity
import android.content.Intent
import android.os.Bundle
import androidx.databinding.ObservableBoolean
import com.alibaba.android.arouter.facade.annotation.Autowired
import com.alibaba.android.arouter.facade.annotation.Route
import com.alibaba.android.arouter.launcher.ARouter
import com.lukouguoji.gjc.R
import com.lukouguoji.gjc.databinding.ActivityIntExpArriveBinding
import com.lukouguoji.gjc.viewModel.IntExpArriveViewModel
import com.lukouguoji.module_base.base.BaseBindingActivity
import com.lukouguoji.module_base.bean.GjcHaWb
import com.lukouguoji.module_base.bean.GjcMaWb
import com.lukouguoji.module_base.common.Constant
import com.lukouguoji.module_base.common.ConstantEvent
import com.lukouguoji.module_base.impl.FlowBus
import com.lukouguoji.module_base.impl.observe
import com.lukouguoji.module_base.ktx.addOnItemClickListener
import com.lukouguoji.module_base.ktx.commonAdapter
import com.lukouguoji.module_base.router.ARouterConstants
import com.lukouguoji.module_base.util.DeviceUtil
import java.util.ArrayList

/**
 * 国际出港-出港运抵页面
 *
 * 布局 id 不区分设备，平板/手机由资源限定符自动选择：
 *   layout-sw600dp/activity_int_exp_arrive.xml（平板）
 *   layout/activity_int_exp_arrive.xml（手机）
 */
@Route(path = ARouterConstants.ACTIVITY_URL_INT_EXP_ARRIVE)
class IntExpArriveActivity :
    BaseBindingActivity<ActivityIntExpArriveBinding, IntExpArriveViewModel>() {

    @JvmField
    @Autowired
    var wbNoParam: String? = null

    override fun layoutId() = R.layout.activity_int_exp_arrive
    override fun viewModelClass() = IntExpArriveViewModel::class.java

    /** 手机版筛选弹层显隐（仅 UI 状态，不涉及业务逻辑） */
    val filterPanelVisible = ObservableBoolean(false)

    /** 供 [com.lukouguoji.gjc.holder.IntExpArriveViewHolder] 绑定 item 布局的 viewModel 变量（父类 viewModel 为 protected） */
    val itemViewModel: IntExpArriveViewModel get() = viewModel

    override fun initOnCreate(savedInstanceState: Bundle?) {
        // 注入 ARouter 参数
        ARouter.getInstance().inject(this)

        setBackArrow(if (DeviceUtil.isPhone()) "出港运抵" else "国际出港运抵")
        binding.viewModel = viewModel
        binding.activity = this

        // 手机版专属数据：加载「代理」筛选下拉
        // 平板端不调用，查询链路与请求次数与改造前完全一致
        if (DeviceUtil.isPhone()) {
            viewModel.initPhoneExtras()
        }

        // 如果有传入运单号，自动填充并触发搜索
        if (!wbNoParam.isNullOrEmpty()) {
            viewModel.waybillNo.value = wbNoParam
            viewModel.searchClick()
        }

        // 绑定分页
        viewModel.pageModel.bindSmartRefreshLayout(binding.srl, binding.rv, viewModel, this)

        // 设置item点击监听
        binding.rv.addOnItemClickListener(viewModel)

        // 监听刷新事件
        FlowBus.with<String>(ConstantEvent.EVENT_CHECK_CHANGED).observe(this) { viewModel.onItemCheckChanged() }

        FlowBus.with<String>(ConstantEvent.EVENT_REFRESH).observe(this) {
            viewModel.refresh()
        }

        // 初始加载数据（如果没有传入运单号，才执行初始加载）
        if (wbNoParam.isNullOrEmpty()) {
            viewModel.refresh()
        }
    }

    // ==================== 手机版专用交互（纯 UI，复用既有 ViewModel 字段与数据） ====================

    /**
     * 手机版 Tab 切换回调：PhoneStatusTab 已通过双向绑定写入 viewModel.currentTab，
     * 这里触发 ViewModel 把适配器数据集替换为过滤后的子集（不发起新请求）。
     */
    fun onArriveTabChanged() {
        viewModel.onTabChangedPhone()
    }

    /** 卡片长按：展开操作浮层（View.OnLongClickListener 要求返回 Boolean） */
    fun showCardActionPhone(bean: GjcMaWb): Boolean {
        bean.actionMenuVisible.set(true)
        return true
    }

    /** 点击浮层遮罩/空白处：收起操作浮层 */
    fun hideCardActionPhone(bean: GjcMaWb) {
        bean.actionMenuVisible.set(false)
    }

    /** 选择圈勾选状态变化后回调（由 ViewHolder 调用） */
    fun onItemCheckChanged() {
        viewModel.onItemCheckChanged()
    }

    /** 手机版筛选弹层显隐切换 */
    fun toggleFilterPanel() {
        filterPanelVisible.set(!filterPanelVisible.get())
    }

    /** 手机版筛选：重置 */
    fun resetFilter() {
        viewModel.flightDate.value = ""
        viewModel.flightNo.value = ""
        viewModel.agentCodePhone.value = ""
    }

    /** 手机版筛选：确认 */
    fun confirmFilter() {
        filterPanelVisible.set(false)
        viewModel.searchClick()
    }

    /**
     * 进入「分单明细」页：直接传递该运单已加载的 haWbList，零新增请求。
     */
    fun openSubOrder(bean: GjcMaWb) {
        val list = ArrayList<GjcHaWb>(bean.haWbList.orEmpty())
        IntExpArriveSubOrderActivity.start(this, bean.wbNo.orEmpty(), list)
    }

    /**
     * 进入「回执」页（手机专属只读页）：复用 haWbList[].response + arrivalOpDate，零新增请求。
     */
    fun openReceipt(bean: GjcMaWb) {
        bean.actionMenuVisible.set(false)
        val list = ArrayList<GjcHaWb>(bean.haWbList.orEmpty())
        IntExpArriveReceiptActivity.start(this, bean.wbNo.orEmpty(), list)
    }

    /**
     * 进入「补充信息」页（手机专属新页）：对该运单整个 haWbList 批量应用（参照 Pad 端国际进港
     * IntArrSupplementInfoViewModel 的批量复制模式）。后端暂无保存接口，见接口问题清单。
     */
    fun openSupplement(bean: GjcMaWb) {
        bean.actionMenuVisible.set(false)
        val list = ArrayList<GjcHaWb>(bean.haWbList.orEmpty())
        IntExpArriveSupplementActivity.start(this, bean.wbNo.orEmpty(), list)
    }

    override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) {
        super.onActivityResult(requestCode, resultCode, data)
        when (requestCode) {
            Constant.RequestCode.WAYBILL -> {
                if (resultCode == Activity.RESULT_OK) {
                    viewModel.waybillNo.value = data?.getStringExtra(Constant.Result.CODED_CONTENT)
                    viewModel.searchClick()
                }
            }
            Constant.RequestCode.CODE -> {
                if (resultCode == Activity.RESULT_OK) {
                    viewModel.hno.value = data?.getStringExtra(Constant.Result.CODED_CONTENT)
                    viewModel.searchClick()
                }
            }
        }
    }
}
