import { defineStore } from 'pinia'
import { nextTick } from 'vue'

export const useAppStore = defineStore('app', {
  state: () => ({
    layout: 'default',
    navbarHidden: false,

    // App Loader
    loader: {
      percent: 0,
      show: false,
      canSuccess: true,
      duration: 3000,
      _timer: null,
      _cut: null
    }
  }),
  actions: {
    hideNavbar () {
      this.navbarHidden = true
    },
    showNavbar () {
      this.navbarHidden = false
    },
    setLayout (layout) {
      this.layout = layout ?? 'default'
    },
    loaderIncrease (num) {
      this.loader.percent = this.loader.percent + Math.floor(num)
    },
    loaderDecrease (num) {
      this.loader.percent = this.loader.percent - Math.floor(num)
    },
    loaderFinish () {
      this.loader.percent = 100
      this.loaderHide()
    },
    loaderSetTimer (timerVal) {
      this.loader._timer = timerVal
    },
    loaderPause () {
      clearInterval(this.loader._timer)
    },
    loaderHide () {
      this.loaderPause()
      this.loader._timer = null
      setTimeout(() => {
        this.loader.show = false
        nextTick(() => {
          setTimeout(() => {
            this.loader.percent = 0
          }, 200)
        })
      }, 500)
    },
    loaderFail () {
      this.loader.canSuccess = false
    },
    loaderStart () {
      this.loader.show = true
      this.loader.canSuccess = true
      if (this.loader._timer) {
        clearInterval(this.loader._timer)
        this.loader.percent = 0
      }
      this.loader._cut = 10000 / Math.floor(this.loader.duration)

      this.loaderSetTimer(setInterval(() => {
        this.loaderIncrease(this.loader._cut * Math.random())
        if (this.loader.percent > 95) {
          this.loaderFinish()
        }
      }, 100))
    }
  }
})