package com.lukouguoji.module_base.base

import android.content.Intent
import android.os.Bundle
import androidx.databinding.DataBindingUtil
import androidx.databinding.ViewDataBinding
import androidx.lifecycle.ViewModel
import androidx.lifecycle.ViewModelProvider
import com.lukouguoji.module_base.BaseActivity
import kotlin.properties.Delegates

abstract class BaseBindingActivity<T : ViewDataBinding, VM : ViewModel> : BaseActivity() {

    //视图绑定器
    protected var binding: T by Delegates.notNull()

    //ViewModel
    protected val viewModel: VM by lazy {
        ViewModelProvider(this).get(viewModelClass())
    }

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        /*
         * dataBinding初始化
         *
         * 平板 / 手机双形态的布局切换由 Android 资源限定符自动完成，此处无需分支：
         *   res/layout-sw600dp/xxx.xml  → 平板（最小宽度 >= 600dp）
         *   res/layout/xxx.xml          → 手机（兜底）
         * 两个变体同名，DataBinding 会生成同一个 Binding 类，因此 Activity 与 ViewModel 无需改动。
         *
         * 注意：不要按「不同文件名 + 代码判断」的方式切换布局，
         * 那样会生成两个不同的 Binding 类，泛型擦除下编译期无法发现，运行时必然 ClassCastException。
         */
        binding = DataBindingUtil.setContentView(this, layoutId())
        binding.lifecycleOwner = this

        initOnCreate(savedInstanceState)
    }

    override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) {
        super.onActivityResult(requestCode, resultCode, data)
        if (viewModel is BaseViewModel) {
            (viewModel as BaseViewModel).onActivityResult(requestCode, resultCode, data)
        }
    }

    /**
     * 布局ID
     *
     * 双形态适配时保持同一个 id 即可，具体加载哪份布局由资源限定符决定：
     *   res/layout-sw600dp/  平板    res/layout/  手机
     */
    abstract fun layoutId(): Int

    /**
     * ViewModel类
     */
    abstract fun viewModelClass(): Class<VM>

    /**
     * 初始化Activity内容
     */
    abstract fun initOnCreate(savedInstanceState: Bundle?)

    fun requireActivity() = this
    fun requireContext() = this

}