import { onBeforeUnmount, onMounted, ref, watch } from 'vue'

export function useAnimationProgress(deps = [], duration = 1100) {
  const progress = ref(0)
  let frameId = 0

  const easeOutCubic = (value) => 1 - Math.pow(1 - value, 3)

  function start() {
    cancelAnimationFrame(frameId)

    if (window.matchMedia?.('(prefers-reduced-motion: reduce)').matches) {
      progress.value = 1
      return
    }

    const startedAt = performance.now()
    progress.value = 0

    function tick(now) {
      const elapsed = Math.min((now - startedAt) / duration, 1)
      progress.value = easeOutCubic(elapsed)
      if (elapsed < 1) frameId = requestAnimationFrame(tick)
    }

    frameId = requestAnimationFrame(tick)
  }

  onMounted(start)
  onBeforeUnmount(() => cancelAnimationFrame(frameId))

  if (deps.length) {
    watch(deps, start)
  }

  return progress
}
