import {
  _decorator,
  Node,
  sys,
  profiler,
  DynamicAtlasManager,
  PhysicsSystem2D,
  Component,
} from 'cc'
const { ccclass, property } = _decorator

import MusicConfig from '../../engine/config/MusicConfig'
import CommonTips from '../../engine/uicomponent/CommonTips'
import Progress from '../../engine/uicomponent/Progress'
import EventManager, { HaoEvent } from '../../engine/utils/EventManager'
import HotUpdate from '../../engine/utils/HotUpdate'
import { Logger } from '../../engine/utils/Logger'
import VersionManager from '../../engine/utils/VersionManager'
import ResourcePreload from '../utils/ResourcePreload'
import SceneManager from './SceneManager'
import { FishConfig } from '../config/FishConfig'

@ccclass('LoadingScene')
export default class LoadingScene extends Component {
  public static scriptName: string = 'LoadingScene'
  @property({ type: Node })
  private progressNode: Node | null = null

  protected onLoad(): void {
    this.onLoadMe()
  }

  protected onDestroy(): void {
    this.onDestroyMe()
  }

  onLoadMe() {
    this.baseInit()
    EventManager.instance.addListener(HotUpdate.Event_On_NeedUpdate, this.onNeedUpdate, this)
    EventManager.instance.addListener(HotUpdate.Event_On_Progress, this.onUpdateProgress, this)
    EventManager.instance.addListener(HotUpdate.Event_On_Fail_Update, this.onUpdateFail, this)
    EventManager.instance.addListener(HotUpdate.Event_Finish_Update, this.onUpdateFinish, this)
    EventManager.instance.addListener(
      HotUpdate.Event_On_ALREADY_UP_TO_DATE,
      this.onUpdateFinish,
      this,
    )
    if (sys.isNative && VersionManager.instance.isOpenHotUpdate) {
      this.checkUpdate()
    } else {
      this.preLoadRes()
    }
  }

  private async baseInit() {
    try {
      await FishConfig.init()
      profiler.hideStats() //showStats
      //let collisionManager:cc.CollisionManager = director.getCollisionManager();
      PhysicsSystem2D.instance.enable = true

      // PhysicsSystem2D.instance.debugDrawFlags = EPhysics2DDrawFlags.Aabb |
      //     EPhysics2DDrawFlags.Pair |
      //     EPhysics2DDrawFlags.CenterOfMass |
      //     EPhysics2DDrawFlags.Joint |
      //     EPhysics2DDrawFlags.Shape;

      //if(collisionManager){
      //collisionManager.enabled = true;
      // collisionManager.enabledDebugDraw = true;
      // collisionManager.enabledDrawBoundingBox = true;
      //}

      if (DynamicAtlasManager.instance) {
        DynamicAtlasManager.instance.enabled = false
      }
      MusicConfig.init()
      // cc.director.getCollisionManager().enabled=true;//这是一个全局属性，开启后就代表碰撞检测组件可以进行检测了
      // cc.director.getCollisionManager().enabledDebugDraw = true; //绘制碰撞区域
    } catch (error) {
      Logger.error(this, error)
    }
  }

  private checkUpdate() {
    Logger.log(this, 'checkUpdate====')
    VersionManager.instance.checkUpdate(0)
  }

  private onNeedUpdate(event: HaoEvent, key: string) {
    Logger.log(this, 'onNeedUpdate=====', key, VersionManager.Config_Key)
    if (key == VersionManager.Config_Key[0]) {
      VersionManager.instance.startUpdate(0)
    }
  }

  private onUpdateProgress(event, loadedFiles, totalFiles, key) {
    if (key == VersionManager.Config_Key[0]) {
      let msg: string = Math.min(100, (loadedFiles / totalFiles) * 100).toFixed(2) + '%'
      this.progressNode.getComponent(Progress).updateProgress(loadedFiles, totalFiles, msg)
    }
  }

  private onUpdateFail(event, key: string) {
    if (key == VersionManager.Config_Key[0]) {
      Logger.warn(this, '热更新失败========')
      CommonTips.showMsg('热更新失败')
      ResourcePreload.instance.restartGame()
    }
  }

  private onUpdateFinish(event, key: string, needRestart: boolean) {
    Logger.log(this, 'onUpdateFinish========')
    if (key == VersionManager.Config_Key[0] && !needRestart) {
      this.preLoadRes()
    }
  }

  private async preLoadRes() {
    ResourcePreload.instance.preLoad(() => {
      this.startGame()
    }, this.progressNode.getComponent(Progress))
  }

  private startGame() {
    Logger.info(this, 'startGame')
    SceneManager.instance.sceneSwitch('FishGameScene', true)
  }

  onDestroyMe() {
    EventManager.instance.removeListener(HotUpdate.Event_On_NeedUpdate, this.onNeedUpdate)
    EventManager.instance.removeListener(HotUpdate.Event_On_Progress, this.onUpdateProgress)
    EventManager.instance.removeListener(HotUpdate.Event_On_Fail_Update, this.onUpdateFail)
    EventManager.instance.removeListener(HotUpdate.Event_Finish_Update, this.onUpdateFinish)
    EventManager.instance.removeListener(HotUpdate.Event_On_ALREADY_UP_TO_DATE, this.onUpdateFinish)
  }
}
