package com.yidian.bcommon.mvvm

import android.annotation.SuppressLint
import android.content.pm.ActivityInfo
import android.os.Bundle
import android.view.View
import androidx.appcompat.app.AppCompatActivity
import androidx.databinding.ViewDataBinding
import com.yidian.bcommon.mvvm.delegate.viewBindings
import com.yidian.bcommon.widget.LoadingDialog
import com.yidian.news.ui.SystemBarUtils


abstract class BaseMvvmActivity<V : ViewDataBinding, VM : BaseViewModel> : AppCompatActivity(), BaseViewComponent<VM> {

  override val loadingDialog: LoadingDialog by lazy { LoadingDialog(this, false) }

  /**
   * 模版方法：创建型模式，定义一个操作中的算法的骨架，而将一些步骤延迟到子类中。
   * 实际作用：将 layoutId 延迟到子类中实现
   *
   * @return layout Id
   */
  protected abstract val layoutId: Int

  /**
   * 模版方法：创建型模式，定义一个操作中的算法的骨架，而将一些步骤延迟到子类中。
   * 实际作用：将 vm 延迟到子类中实现
   *
   * @return vm ViewModel
   */
  protected abstract val vm: VM

  /**
   * 初始化视图，为具体实现类提供统一的函数签名
   */
  protected abstract fun initView()

  /**
   * 严格 MVVM
   * - 仅基类可见 binding 对象，向下透明；
   * - 避免在子 Activity 中通过 binding 直接操作 View。
   */
  protected  val binding: V by lazy {
    viewBindings(layoutId,vm)
  }

  // 向下提供 rootView
  protected val rootView: View by lazy { binding.root }


  /**
   * 生命周期函数
   */
  @SuppressLint("SourceLockedOrientationActivity")
  override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)
    requestedOrientation = ActivityInfo.SCREEN_ORIENTATION_PORTRAIT
    this.binding.executePendingBindings()
    this.initStatusBar()
    this.initView()
    vm.subscribeUiEvent(this)
  }

  private fun initStatusBar() {
    SystemBarUtils.setStatusBarTransparent(this.window)
    SystemBarUtils.setStatusBarTextColorBlack(this)
  }

  open fun setStatusBarTextColor(isNight: Boolean) {
    if (isNight) {
      if (this.useWhiteStatusBarTextColorInNightMode()) {
        SystemBarUtils.setStatusBarTextColorWhite(this)
      } else {
        SystemBarUtils.setStatusBarTextColorBlack(this)
      }
    } else if (this.useBlackStatusBarTextColorInDayMode()) {
      SystemBarUtils.setStatusBarTextColorBlack(this)
    } else {
      SystemBarUtils.setStatusBarTextColorWhite(this)
    }
  }

  private fun useBlackStatusBarTextColorInDayMode(): Boolean {
    return true
  }

  private fun useWhiteStatusBarTextColorInNightMode(): Boolean {
    return true
  }

  private fun allowChangeStatusBarTextColor(): Boolean {
    return SystemBarUtils.supportTranslucentStatusBar() && SystemBarUtils.supportChangeStatusBarTextColor()
  }


}
