import { nextTick, onBeforeUnmount, ref, watch, onMounted } from 'vue';
import raf from '../../_util/raf';
var StatusQueue = ['measure', 'align', null, 'motion'];
export default (function (visible, doMeasure) {
  var status = ref(null);
  var rafRef = ref();
  var destroyRef = ref(false);

  function setStatus(nextStatus) {
    if (!destroyRef.value) {
      status.value = nextStatus;
    }
  }

  function cancelRaf() {
    raf.cancel(rafRef.value);
  }

  function goNextStatus(callback) {
    cancelRaf();
    rafRef.value = raf(function () {
      // Only align should be manually trigger
      var newStatus = status.value;

      switch (status.value) {
        case 'align':
          newStatus = 'motion';
          break;

        case 'motion':
          newStatus = 'stable';
          break;

        default:
      }

      setStatus(newStatus);
      callback === null || callback === void 0 ? void 0 : callback();
    });
  }

  watch(visible, function () {
    setStatus('measure');
  }, {
    immediate: true,
    flush: 'post'
  });
  onMounted(function () {
    // Go next status
    watch(status, function () {
      switch (status.value) {
        case 'measure':
          doMeasure();
          break;

        default:
      }

      if (status.value) {
        nextTick(function () {
          var index = StatusQueue.indexOf(status.value);
          var nextStatus = StatusQueue[index + 1];

          if (nextStatus && index !== -1) {
            setStatus(nextStatus);
          }
        });
      }
    }, {
      immediate: true,
      flush: 'post'
    });
  });
  onBeforeUnmount(function () {
    destroyRef.value = true;
    cancelRaf();
  });
  return [status, goNextStatus];
});