import { useQuasar } from 'quasar'
import {
  defineComponent, onBeforeMount, onBeforeUnmount, onMounted, ref, toRefs, watch, inject, computed, nextTick,
} from 'vue'

import { tools } from '@tools'

import { shared_consts } from '@src/common/shared_vuejs'
import { useI18n } from 'vue-i18n'
import { boot } from 'quasar/wrappers'
import { useRouter } from 'vue-router'
import { static_data } from '@src/db/static_data'
import messagePopover from '../../layouts/toolbar/messagePopover/messagePopover.vue'
import notifPopover from '../../layouts/toolbar/notifPopover/notifPopover.vue'
import coinsPopover from '../../layouts/toolbar/coinsPopover/coinsPopover.vue'
import drawer from '../../layouts/drawer/drawer.vue'
import { CMyAvatar } from '@src/components/CMyAvatar'
import { CMyFieldDb } from '@src/components/CMyFieldDb'
import { CSelectUserActive } from '@src/components/CSelectUserActive'
import { toolsext } from '@store/Modules/toolsext'
import { useGlobalStore } from '@store/globalStore'
import { useUserStore } from '@store/UserStore'
import { useProducts } from '@store/Products'

import MixinUsers from '../../mixins/mixin-users'
import { CMyCart, CSigninNoreg } from '@src/components'
import { costanti } from '@costanti'
import { useNotifStore } from '@src/store/NotifStore'


import { Platform } from 'quasar';

export default defineComponent({
  name: 'MyHeader',
  components: {
    drawer, messagePopover,
    CMyFieldDb, CMyAvatar, CSigninNoreg, CMyCart, notifPopover, coinsPopover,
    CSelectUserActive,
  },
  props: {
    extraContent: {
      required: false,
      default: '',
    },
    clBase: {
      required: false,
      default: '',
    },
  },

  setup() {
    const $q = useQuasar()
    const { t } = useI18n()
    const $router = useRouter()

    const isUserNotAuth = ref(false)
    const iconConn = ref('wifi')
    const clIconConn = ref('clIconOnline')
    const strConn = ref('')
    const langshort = ref('')
    const clCloudUpload = ref('')
    const clCloudDownload = ref('')
    const clCloudUp_Indexeddb = ref('')
    const tabcmd = ref('')
    const clCloudDown_Indexeddb = ref('clIndexeddbsend')
    const photo = ref('')
    const visuimg = ref(true)

    const userStore = useUserStore()
    const globalStore = useGlobalStore()
    const products = useProducts()
    const notifStore = useNotifStore()

    const { getnumItemsCart } = MixinUsers()

    const site = computed(() => globalStore.site)
    const isfinishLoading = computed(() => globalStore.finishLoading)

    const dark = ref(false)

    const leftDrawerOpen = ref(globalStore.leftDrawerOpen)

    const editOn = computed({
      get: () => globalStore.editOn,
      set: val => {
        tools.updateEditOn(val)
      },
    })


    const getClassColorHeader = computed(() => {
      // if (tools.isTest()) return 'bg-light-blue'
      // if (tools.isDebug()) return 'bg-info'
      if (globalStore.site && globalStore.site.confpages?.col_toolbar)
        return 'bg-' + globalStore.site.confpages?.col_toolbar
      else {
        if (globalStore.homescreen) {
          return 'bg-blue'
        } else {
          return 'bg-light-blue'
        }
      }

    })

    const getColorText = computed(() => {
      if (globalStore.site && globalStore.site.confpages?.col_toolbar === 'white')
        return 'black'
      else
        return 'white'
    })

    watch(() => dark.value, (value: any, oldval: any) => {
      if (isfinishLoading.value) {
        $q.dark.set(value)
        tools.setCookie('darkmode', value ? '-1' : '0')
      }
    })

    function setDarkMode() {
      dark.value = tools.getCookie('darkmode', false, false, false) === '-1'

      $q.dark.set(dark.value)
    }

    function uploadStart() {

      BeforeMount()
    }

    watch(() => globalStore.finishLoading, (value: any, oldval: any) => {
      if (value) {
        uploadStart()
      }
    })

    const data = ref({
      registration: null,
      updateExists: false,
    } as any)

    const refreshing = ref(false)

    const stateconn = ref(globalStore.stateConnection)

    function updateAvailable(event: any) {
      console.log(event)
      data.value.registration = event.detail
      data.value.updateExists = true
      RefreshApp() // update automatically
    }

    function created() {

      if (isfinishLoading.value) {
        uploadStart()
      }
      try {
        if (window) {
          window.addEventListener('swUpdated', updateAvailable, { once: true })
          if ('serviceWorker' in navigator) {
            navigator.serviceWorker.addEventListener('controllerchange', () => {
              // We'll also need to add 'refreshing' to our data originally set to false.
              if (refreshing.value)
                return
              refreshing.value = true
              // Here the actual reload of the page occurs
              window.location.reload()
            })

          }
        }
      } catch (e) {
        console.error('Err', e.message)
      }

    }

    const {
      getUsernameChatByMsg,
      getMyUsername,
      Username,
      myName,
      mySurname,
      myCell,
      MadeGift,
      Email,
      getMyImg,
      getMyImgforIcon,
      getImgByMsg,
      getUserByUsername,
      getImgByUsername,
      isValidUsername,
      getNumMsg,
      getNumMsgUnread,
      getMsgText,
      paotest } = MixinUsers()

    function isonline() {
      return globalStore.stateConnection === 'online'
    }

    function isAdmin() {
      return userStore.isAdmin
    }

    function isManager() {
      return userStore.isManager
    }
    function isEditor() {
      return userStore.isEditor
    }

    const isSocio = computed(() => userStore.my.profile.socio)

    function isSocioResidente() {
      return userStore.my.profile.socioresidente
    }

    function isConsiglio() {
      return userStore.my.profile.consiglio
    }

    function getcolormenu() {
      return isSocio.value ? 'green-7' : 'white'
    }

    function isFacilitatore() {
      return userStore.isFacilitatore
    }

    function isZoomeri() {
      return userStore.isZoomeri
    }

    function isTratuttrici() {
      return userStore.isTratuttrici
    }

    function conndata_changed() {
      return globalStore.connData
    }

    function snakeToCamel(str: string) {
      return str.replace(/(-\w)/g, (m) => m[1].toUpperCase())
    }


    function setshortlang(mylang: string) {
      static_data.lang_available.forEach((langavail: any) => {
        if (langavail.value === mylang) {
          langshort.value = langavail.short
          return langshort.value
        }
      })
    }

    function isNewVersionAvailable() {
      return globalStore.isNewVersionAvailable
    }

    function closeAll() {
      globalStore.rightNotifOpen = false
      globalStore.rightCartOpen = false
      globalStore.rightDrawerOpen = false
      globalStore.rightCoinsOpen = false
    }

    /*const leftDrawerOpen = computed({
      get: () => globalStore.leftDrawerOpen,
      set: val => {
        globalStore.leftDrawerOpen = val

      },
    })*/

    const rightDrawerOpen = computed({
      get: () => globalStore.rightDrawerOpen,
      set: val => {
        closeAll()
        globalStore.rightDrawerOpen = val
      },
    })

    const rightCartOpen = computed({
      get: () => globalStore.rightCartOpen,
      set: val => {
        closeAll()
        globalStore.rightCartOpen = val
      },
    })

    const rightNotifOpen = computed({
      get: () => globalStore.rightNotifOpen,
      set: val => {
        closeAll()
        globalStore.rightNotifOpen = val
      },
    })

    const rightCoinsOpen = computed({
      get: () => globalStore.rightCoinsOpen,
      set: val => {
        closeAll()
        globalStore.rightCoinsOpen = val
      },
    })

    const lang = computed({
      get: () => $q.lang.isoName,
      set: mylang => {
        // console.log('set lang', $q.lang.getLocale(), 'passato', mylang)
        $q.lang.set(snakeToCamel(mylang))
        // tools.showNotif($q, 'IMPOSTA LANG= ' + $i18n.locale)
        // console.log('IMPOSTA LANG= ' + $i18n.locale)

        let mylangtopass = mylang

        mylangtopass = toolsext.checkLangPassed($q, $router, mylangtopass)

        userStore.setlang($q, $router, mylangtopass)

        setshortlang(mylangtopass)

        tools.setLangAtt($q, $router, mylangtopass)

        userStore.setLangServer()
      },
    })

    watch(() =>
      stateconn,
      // @ts-ignore
      (value: string, oldValue: string) => {
        globalStore.stateConnection = value
      },
    )

    watch(
      conndata_changed,
      (value, oldValue) => {
        clCloudUpload.value = (value.uploading_server === 1) ? 'clCloudUpload send' : 'clCloudUpload'
        clCloudUpload.value = (value.downloading_server === 1) ? 'clCloudUpload receive' : 'clCloudUpload'
        clCloudUp_Indexeddb.value = (value.uploading_indexeddb === 1) ? 'clIndexeddb send' : 'clIndexeddb'
        clCloudUp_Indexeddb.value = (value.downloading_indexeddb === 1) ? 'clIndexeddb receive' : 'clIndexeddb'

        /* clCloudUpload.value = (value.uploading_server === -1) ? 'clCloudUpload error' : clCloudUpload
        clCloudUpload.value = (value.downloading_server === -1) ? 'clCloudUpload error' : clCloudDownload
        clCloudUp_Indexeddb.value = (value.uploading_indexeddb === -1) ? 'clIndexeddb error' : clCloudUp_Indexeddb
        clCloudUp_Indexeddb.value = (value.downloading_indexeddb === -1) ? 'clIndexeddb error' : clCloudDown_Indexeddb

         */
      },
    )

    /*
  @Watch('conn_changed', { immediate: true, deep: true })
  function changeconn_changed(value: string, oldValue: string) {
    if (value !== oldValue) {

      // console.log('SSSSSSSS: ', value, oldValue)

      const color = (value === 'online') ? 'positive' : 'warning'
      const statoconn = t('connection.conn') + ' ' + ((value === 'online') ? t('connection.online') : t('connection.offline'))

      if (site.confpages.showConnected) {

        if (!!oldValue) {
          tools.showNotif($q, statoconn, {
            color,
            icon: 'wifi'
          })
        }

        changeIconConn()
      }
    }
  }

     */

    function RefreshApp() {

      if (Platform.is.ios) {
        // Unregister Service Worker
        if ('serviceWorker' in navigator) {
          navigator.serviceWorker.getRegistrations().then((registrations) => {
            for (const registration of registrations) {
              registration.unregister()
            }
          })
        }

        // window.location.reload()
      } else {

        data.value.updateExists = false
        // Make sure we only send a 'skip waiting' message if the SW is waiting
        if (!data.value.registration || !data.value.registration.waiting) return
        // Send message to SW to skip the waiting and activate the new SW
        data.value.registration.waiting.postMessage({ type: 'SKIP_WAITING' })
      }
    }

    function changeIconConn() {
      iconConn.value = globalStore.stateConnection === 'online' ? 'wifi' : 'wifi_off'
      clIconConn.value = globalStore.stateConnection === 'online' ? 'clIconOnline' : 'clIconOffline'
    }

    function getAppVersion() {
      // return "AA"
      let strv = ''
      if (import.meta.env.DEV) {
        strv = 'DEV '
      } else if (tools.isTest()) {
        strv = 'TEST '
      }
      return `${strv}v. ${import.meta.env.VITE_APP_VERSION}`
    }

    function getLangAtt() {
      return $q.lang.isoName
    }

    function BeforeMount() {
      setDarkMode()

      // Estrai la Lang dal Localstorage
      if (!globalStore.finishLoading)
        return;

      // console.log('$q.i18n=', $q.i18n, '$q.getLocale()=', $q.lang.isoName)
      const mybrowserLang = getLangAtt()
      // tools.showNotif($q, 'prima: ' + String(my))

      let mylang = tools.getItemLS(toolsext.localStorage.lang)
      if (mylang === '') {
        if (navigator) {
          mylang = navigator.language
          // console.log(`LANG2 NAVIGATOR ${mylang}`)
        } else {
          mylang = $q.lang.isoName
        }

        // console.log('IMPOSTA LANGMY', mylang)
      }

      mylang = toolsext.checkLangPassed($q, $router, mylang)

      tools.setLangAtt($q, $router, mylang)
      setshortlang(mylang)
    }

    function mounted() {
      // Test this by running the code snippet below and then
      // use the "TableOnlyView" checkbox in DevTools Network panel


      // console.log('Event LOAD')
      if (window) {
        window.addEventListener('load', () => {
          // console.log('2) ENTERING Event LOAD')

          function updateOnlineStatus(event: any) {
            if (navigator.onLine) {
              console.log('EVENT ONLINE!')
              // handle online status
              globalStore.setStateConnection('online')
              // mychangeIconConn()
            } else {
              console.log('EVENT OFFLINE!')
              // handle offline status
              globalStore.setStateConnection('offline')
              // mychangeIconConn()
            }
          }

          window.addEventListener('online', updateOnlineStatus)
          window.addEventListener('offline', updateOnlineStatus)
        })
      }

      nextTick(() => {
        if (tools.getCookie('menu3oriz') === '1') {
          if ($q.screen.width < 800) {
            leftDrawerOpen.value = false
            // globalStore.leftDrawerOpen = false
          } else {
            leftDrawerOpen.value = true
            globalStore.leftDrawerOpen = true
          }
        }
        else if (tools.getCookie('menu3oriz') === '0') {
          leftDrawerOpen.value = false
          globalStore.leftDrawerOpen = false
        }
      })

    }

    function imglogo() {
      return `../../${tools.getimglogo()}`
    }

    function getappname() {
      return tools.getappname(tools.isMobile())

    }

    function toggleanimation() {
      console.log('toggleanimation')
      visuimg.value = false
      setTimeout(() => {
        visuimg.value = true
      }, 100)
    }

    function logoutHandler() {
      userStore.logout()
        .then(() => {
          // $router.replace('/logout')
          //
          // setTimeout(() => {
          //   $router.replace('/')
          // }, 1000)

          tools.showNotif($q, t('logout.uscito'), { icon: 'exit_to_app' })
        })
    }

    function clickregister() {
      rightDrawerOpen.value = false

      $router.replace('/signup')
    }


    function getnumOrdersCart() {
      /* const arrorderscart = Products.orders.filter((rec) => rec.status < shared_consts.OrderStatus.COMPLETED)
      // const arrorderscart = Products.orders
      if (!!arrorderscart) {
        return arrorderscart.length
      }

       */
      return 0
    }

    function getcart() {
      // return Products.cart
      return null
    }

    function toHome() {
      $router.push('/')
    }


    function changecmd(value: any) {
      console.log('changecmd', value)
      globalStore.changeCmdClick(value)
    }

    function clickMenu3Orizz() {

      leftDrawerOpen.value = !leftDrawerOpen.value
      globalStore.leftDrawerOpen = leftDrawerOpen.value

      tools.setCookie('menu3oriz', globalStore.leftDrawerOpen ? '1' : '0')
    }

    onBeforeMount(BeforeMount)
    onMounted(mounted)

    created()

    return {
      static_data,
      globalStore,
      leftDrawerOpen,
      rightDrawerOpen,
      rightCartOpen,
      rightNotifOpen,
      rightCoinsOpen,
      lang,
      langshort,
      getnumOrdersCart,
      t,
      isonline,
      isAdmin,
      isManager, isSocio, isSocioResidente, isConsiglio, getcolormenu,
      isNewVersionAvailable,
      getAppVersion,
      RefreshApp,
      changecmd,
      imglogo,
      getappname,
      toggleanimation,
      getClassColorHeader,
      getcart,
      getnumItemsCart,
      isFacilitatore,
      isZoomeri,
      isTratuttrici,
      getUsernameChatByMsg,
      getMyUsername,
      Username,
      myName,
      mySurname,
      myCell,
      MadeGift,
      Email,
      getMyImg,
      getMyImgforIcon,
      getImgByMsg,
      getUserByUsername,
      getImgByUsername,
      isValidUsername,
      getNumMsg,
      getNumMsgUnread,
      getMsgText,
      paotest,
      logoutHandler,
      isUserNotAuth,
      tools,
      data,
      site,
      isfinishLoading,
      getColorText,
      costanti,
      dark,
      iconConn,
      clIconConn,
      toHome,
      products,
      userStore,
      clickMenu3Orizz,
      isEditor,
      editOn,
    }
  },

})
