import { useEffect, useRef } from "react"

const LOG = false

export function useWhyDidYouUpdate(componentName: string, name: string, props: any) {
  // Get a mutable ref object where we can store props ...
  // ... for comparison next time this hook runs.
  const previousProps = useRef<any>()

  useEffect(() => {
    if (previousProps.current) {
      // Get all keys from previous and current props
      const allKeys = Object.keys({ ...previousProps.current, ...props })
      // Use this object to keep track of changed props
      const changesObj: Record<string, { from: any; to: any }> = Array.isArray(props)
        ? ([] as any)
        : {}

      // Iterate through keys
      allKeys.forEach(key => {
        // If previous is different from current
        if (previousProps.current[key] !== props[key]) {
          // Add to changesObj
          changesObj[key] = {
            from: previousProps.current[key],
            to: props[key],
          }
        }
      })

      // If changesObj not empty then output to console
      if (LOG && Object.keys(changesObj).length) {
        console.log("[why-did-you-update]", `<${componentName}>`, name, changesObj)
      } else {
        // console.log("[why-did-you-update]", `<${componentName}>`, name, "⚠️ No changes");
      }
    }
    // Finally update previousProps with current props for next hook call
    previousProps.current = props
  })
}
