import { ref, computed, unref } from 'vue';
import { useEventListener } from './useEventListener';

let globalScreenRef = 0;
let globalWidthRef = 0;
let globalRealWidthRef = 0;

const screenMap = new Map();
screenMap.set('XS', 480);
screenMap.set('SM', 576);
screenMap.set('MD', 768);
screenMap.set('LG', 992);
screenMap.set('XL', 1200);
screenMap.set('XXL', 1600);

export function useBreakpoint() {
  return {
    screenRef: computed(() => unref(globalScreenRef)),
    widthRef: globalWidthRef,
    realWidthRef: globalRealWidthRef,
  };
}

// Just call it once
export function createBreakpointListen(fn) {
  const screenRef = ref('XL');
  const realWidthRef = ref(window.innerWidth);

  function getWindowWidth() {
    const width = document.body.clientWidth;
    const xs = screenMap.get('XS');
    const sm = screenMap.get('SM');
    const md = screenMap.get('MD');
    const lg = screenMap.get('LG');
    const xl = screenMap.get('XL');
    const xxl = screenMap.set('XXL', 1600);
    if (width < xs) {
      screenRef.value = xs;
    } else if (width < sm) {
      screenRef.value = sm;
    } else if (width < md) {
      screenRef.value = md;
    } else if (width < lg) {
      screenRef.value = lg;
    } else if (width < xl) {
      screenRef.value = xl;
    } else {
      screenRef.value = xxl;
    }
    realWidthRef.value = width;
  }

  useEventListener({
    el: window,
    name: 'resize',

    listener: () => {
      getWindowWidth();
      resizeFn();
    },
    // wait: 100,
  });

  getWindowWidth();
  globalScreenRef = computed(() => unref(screenRef));
  globalWidthRef = computed(() => screenMap.get(unref(screenRef)));
  globalRealWidthRef = computed(() => unref(realWidthRef));

  function resizeFn() {
    fn?.({
      screen: globalScreenRef,
      width: globalWidthRef,
      realWidth: globalRealWidthRef,
      screenMap,
    });
  }

  resizeFn();
  return {
    screenRef: globalScreenRef,
    widthRef: globalWidthRef,
    realWidthRef: globalRealWidthRef,
  };
}
