import { useEffect, useState } from 'react'
import { singletonHook } from 'react-singleton-hook'
import { getInnerContentWidth } from '../utils/pdf'

const noScaleInit = {
  to: (_: number, v: number) => v,
  from: (_: number, v: number) => v
}

const useScaleImpl = () => {
  const [width, setWidth] = useState(getInnerContentWidth())

  // Get the scale based on the original width
  const scale = (originalWidth: number) => {
    return width / originalWidth
  }

  // Get the original pixel value
  const to = (originalWidth: number, value: number) => {
    return value / scale(originalWidth)
  }

  // Get the scaled pixel value
  const from = (originalWidth: number, value: number) => {
    return value * scale(originalWidth)
  }

  const resize = () => {
    setWidth(getInnerContentWidth())
  }

  useEffect(() => {
    resize()

    window.addEventListener('resize', resize)
    return () => {
      window.removeEventListener('resize', resize)
    }
  }, [])

  return { to, from }
}

export const useScale = singletonHook(noScaleInit, useScaleImpl, {
  unmountIfNoConsumers: true
})
