import type { DOStage } from "../models/DOStage"
import { config } from "../constants/config"
import { respath } from "../constants/respath"
import { EVENT_TYPES, EventManager } from "../models/EventManager"
import { ResourceManager } from "../models/ResourceManager"
import { StorageManager } from "../models/StorageManager"
import { UIManager } from "../models/UIManager"
import { Utility_EaseOut, Utility_EaseOut_2 } from "../utils/utility"
import { Difficulty } from "./Difficulty"

const { regClass, property } = Laya

@regClass()
export class GameOver extends Laya.Script {
  declare owner: Laya.Box

  @property(Laya.Box)
  public btn_second: Laya.Box

  @property(Laya.Box)
  public btn_restart: Laya.Box

  @property(Laya.Box)
  public btn_newOrClose: Laya.Box

  @property(Laya.Label)
  public label_newOrClose: Laya.Label

  private mask: Laya.Image
  private center: Laya.Box

  onAwake(): void {
    this.mask = this.owner.getChildByName("Image") as Laya.Image
    this.mask.alpha = 0
    Laya.Tween.to(this.mask, { alpha: 0.6 }, 400, Utility_EaseOut)

    this.center = this.owner.getChildByName("center") as Laya.Box
    this.center.scaleX = 0.8
    this.center.scaleY = 0.8
    Laya.Tween.to(this.center, { scaleX: 1, scaleY: 1 }, 400, Utility_EaseOut)
    this.center.alpha = 0
    Laya.Tween.to(this.center, { alpha: 1 }, 400, Utility_EaseOut)
  }

  destroyUI(): void {
    Laya.Tween.to(this.mask, { alpha: 0 }, 400, Utility_EaseOut_2)
    Laya.Tween.to(this.center, { scaleX: 0.8, scaleY: 0.8 }, 400, Utility_EaseOut_2)
    Laya.Tween.to(this.center, { alpha: 0 }, 400, Utility_EaseOut_2, Laya.Handler.create(this, () => {
      this.owner.destroy()
    }))
  }

  public onSetStageInfo(doStage: DOStage): void {
    this.btn_second.on(Laya.Event.CLICK, this, () => {
      doStage.set_mistake(doStage.get_mistake() - 1)
      EventManager.getInstance().DispatchEvent(EVENT_TYPES.NOT_UPDATE_MISTAKE)
      this.destroyUI()
    })

    this.btn_restart.on(Laya.Event.CLICK, this, () => {
      const stageID = doStage.get_stageID()
      const type = doStage.get_stageType()
      const difficulty = doStage.get_difficulty()
      StorageManager.getInstance().newStage(stageID, type, difficulty, difficulty)
      UIManager.getInstance().loadStageUI(stageID)
      this.destroyUI()
    })

    const type = doStage.get_stageType()
    if (type === config.STAGE_TYPE.MAIN) {
      this.label_newOrClose.text = "New Game"
      this.btn_newOrClose.on(Laya.Event.CLICK, this, () => {
        if (config.H_SCREEN) {
          const user = StorageManager.getInstance().getUser()
          user.update_progress(doStage.get_difficulty(), doStage.get_stageIndex() + 1)// 主线关卡更新难度进度
          const difficulty = doStage.get_difficulty()
          StorageManager.getInstance().newStage(config.DEFAULT_STAGE_ID, config.STAGE_TYPE.MAIN, difficulty, difficulty)
          UIManager.getInstance().loadStageUI(config.DEFAULT_STAGE_ID)
          this.destroyUI()
        } else {
          ResourceManager.getInstance().loadPrefab(respath.difficulty_ui_res, (go: any) => {
            const prefab = go.create()
            const d = UIManager.getInstance().getUIRoot().addChild(prefab).getComponent(Difficulty)
            d.onInit((value: string) => {
              console.log("选择难度", value)
              StorageManager.getInstance().newStage(config.DEFAULT_STAGE_ID, config.STAGE_TYPE.MAIN, value, value)
              UIManager.getInstance().loadStageUI(config.DEFAULT_STAGE_ID)
              this.destroyUI()
            })
          })
        }
      })
    } else {
      this.label_newOrClose.text = "Close"
      this.btn_newOrClose.on(Laya.Event.CLICK, this, () => {
        UIManager.getInstance().loadDCUI()
        UIManager.getInstance().closeStageUI()
        this.destroyUI()
      })
    }
  }
}
