import Lenis from 'lenis'
import 'lenis/dist/lenis.css'
import gsap from 'gsap'
import { ScrollTrigger } from 'gsap/ScrollTrigger'

gsap.registerPlugin(ScrollTrigger)

export default defineNuxtPlugin(() => {
  // 用 Lenis 平滑浏览器原始 wheel 输入，避免鼠标滚轮一格跳太远。
  const lenis = new Lenis({
    lerp: 0.075,
    wheelMultiplier: 0.7,
  })

  const updateLenis = (time: number) => {
    lenis.raf(time * 1000)
  }

  // ScrollTrigger 必须跟随 Lenis 的平滑滚动值更新，否则触发点会和真实视觉滚动不同步。
  lenis.on('scroll', ScrollTrigger.update)
  gsap.ticker.add(updateLenis)
  gsap.ticker.lagSmoothing(0)

  let isDestroyed = false
  const cleanupLenis = () => {
    if (isDestroyed) {
      return
    }

    isDestroyed = true
    lenis.off('scroll', ScrollTrigger.update)
    gsap.ticker.remove(updateLenis)
    window.removeEventListener('beforeunload', cleanupLenis)
    lenis.destroy()
  }

  // Nuxt 没有类型化的 app:beforeUnmount；这里用浏览器卸载和 Vite 热更新做清理。
  window.addEventListener('beforeunload', cleanupLenis)
  import.meta.hot?.dispose(cleanupLenis)

  return {
    provide: {
      lenis,
    },
  }
})
