package com.lukouguoji.gjc.page.move

import android.app.Activity
import android.content.Context
import android.content.Intent
import android.os.Bundle
import androidx.databinding.ObservableBoolean
import com.alibaba.android.arouter.facade.annotation.Route
import com.lukouguoji.gjc.R
import com.lukouguoji.gjc.databinding.ActivityIntExpMoveBinding
import com.lukouguoji.gjc.viewModel.IntExpMoveViewModel
import com.lukouguoji.module_base.base.BaseBindingActivity
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.showToast
import com.lukouguoji.module_base.model.ConfirmDialogModel
import com.lukouguoji.module_base.model.ScanModel
import com.lukouguoji.module_base.router.ARouterConstants
import com.lukouguoji.module_base.util.DeviceUtil

/**
 * 国际出港-出港移库
 */
@Route(path = ARouterConstants.ACTIVITY_URL_INT_EXP_MOVE)
class IntExpMoveActivity : BaseBindingActivity<ActivityIntExpMoveBinding, IntExpMoveViewModel>() {

    // 布局 id 不区分设备，平板/手机由资源限定符自动选择：
    //   layout-sw600dp/activity_int_exp_move.xml（平板） / layout/activity_int_exp_move.xml（手机）
    override fun layoutId() = R.layout.activity_int_exp_move

    override fun viewModelClass() = IntExpMoveViewModel::class.java

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

    override fun initOnCreate(savedInstanceState: Bundle?) {
        setBackArrow(if (DeviceUtil.isPhone()) "出港移库" else "国际出港移库")
        binding.viewModel = viewModel
        binding.activity = this

        // 手机版专属数据：默认「待移库」Tab、Tab 角标计数、特码下拉
        // 平板端不调用，查询链路与请求次数与改造前完全一致
        if (DeviceUtil.isPhone()) {
            viewModel.initPhoneExtras()
        }

        initRecyclerView()
        initListeners()
        observeData()
    }

    /**
     * 初始化RecyclerView
     */
    private fun initRecyclerView() {
        viewModel.pageModel.bindSmartRefreshLayout(
            binding.srl,
            binding.rv,
            viewModel,
            this
        )
        binding.rv.addOnItemClickListener(viewModel)
    }

    /**
     * 初始化监听器
     */
    private fun initListeners() {
        // 移库按钮：btnMove 只存在于平板变体（手机版底部条走 setOnActionClick），故判空
        binding.btnMove?.setOnClickListener {
            showMoveConfirmDialog()
        }
    }

    /**
     * 观察数据变化
     */
    private fun observeData() {
        // 监听item选择变化事件,更新全选状态
        FlowBus.with<String>(ConstantEvent.EVENT_CHECK_CHANGED).observe(this) {
            viewModel.onItemCheckChanged()
        }

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

        // 初始加载数据
        viewModel.refresh()
    }

    /**
     * 扫码运单号
     */
    fun scanWaybill() {
        ScanModel.startScan(this, Constant.RequestCode.WAYBILL)
    }

    // ==================== 手机版专用交互（复用既有 ViewModel 字段，无新增业务逻辑） ====================

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

    /**
     * 手机版筛选：重置
     *
     * 只清空弹层内的三个条件（承运人 / 运单类型 / 特码），不影响 Tab 与顶部搜索框。
     */
    fun resetFilter() {
        viewModel.by1.value = ""
        viewModel.awbType.value = ""
        viewModel.spCode.value = ""
    }

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

    /**
     * 显示移库确认对话框
     *
     * 手机版底部操作条通过 XML 的 setOnActionClick 调用，故为 public。
     */
    fun showMoveConfirmDialog() {
        val selectedItems = viewModel.getSelectedItems()

        if (selectedItems.isEmpty()) {
            showToast("请至少选择一条运单")
            return
        }

        ConfirmDialogModel(
            message = "确定要移库选中的 ${selectedItems.size} 条运单吗？",
            title = "移库确认"
        ) {
            viewModel.submitMove()
        }.show()
    }

    /**
     * 扫码回调
     */
    override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) {
        super.onActivityResult(requestCode, resultCode, data)
        if (requestCode == Constant.RequestCode.WAYBILL && resultCode == Activity.RESULT_OK) {
            val code = data?.getStringExtra(Constant.Result.CODED_CONTENT)
            viewModel.waybillNo.value = code
            viewModel.searchClick()
        }
    }

    companion object {
        @JvmStatic
        fun start(context: Context) {
            val starter = Intent(context, IntExpMoveActivity::class.java)
            context.startActivity(starter)
        }
    }
}
