package com.yidian.bcommon.mvvm

import android.os.Bundle
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import androidx.annotation.LayoutRes
import androidx.databinding.ViewDataBinding
import androidx.fragment.app.Fragment
import com.yidian.bcommon.mvvm.delegate.viewBindings
import com.yidian.bcommon.widget.LoadingDialog


abstract class BaseMvvmFragment<V : ViewDataBinding, VM : BaseViewModel>(
  @LayoutRes private val layoutId: Int
) : Fragment(), BaseViewComponent<VM> {

  override val loadingDialog: LoadingDialog by lazy { LoadingDialog(requireActivity()) }

  /**
   * 模版方法模式
   */
  protected abstract fun initView()

  /**
   * 模版方法模式
   */
  // VM 的类型通过范性限定，因此直接使用 val 的形式
  protected abstract val vm: VM

  /**
   * 模版方法模式
   */
  // V 的类型通过范性限定，因此直接使用 val 的形式
  protected  val binding: V by lazy {
    viewBindings(layoutId,vm)
  }

  override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)
  }

  override fun onDestroy() {
    super.onDestroy()
  }

  /**
   * Fragment 的 data-binding 发生在 [onCreateView] 函数内部，在此函数返回之前，尽量不要使用 vm 即 binding 对象
   */
  override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? {
//    setupDataBinding(inflater, container)
    return binding.root
  }

  override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
    super.onViewCreated(view, savedInstanceState)
    vm.subscribeUiEvent(viewLifecycleOwner)
    initView()
  }


}
