import { useMemo, useState } from 'react';

import {
  type Dimensions,
  defaultDimensions,
  useDimensions,
} from './useDimensions';

export type PdfDimensions = {
  height: number | null;
  width: number | null;
};

export type PdfDimensionsOptions = Partial<{
  fitWidth: boolean;
  fitHeight: boolean;
}>;

/** Computes PDF page dimensions that fit within a wrapper element, supporting fitWidth/fitHeight modes. */
export const usePdfDimensions = (
  element: HTMLElement | null,
  options: PdfDimensionsOptions = {},
) => {
  const { fitWidth = false, fitHeight = false } = options;

  const [pageDimensions, setPageDimensions] =
    useState<Dimensions>(defaultDimensions);

  const { dimensions: wrapperDimensions } = useDimensions(element);

  const handleLoadPage = (page: any) => {
    setPageDimensions({
      width: page.width as number,
      height: page.height as number,
    });
  };

  const dimensions = useMemo(() => {
    if (fitWidth || fitHeight) {
      return {
        width: fitWidth ? wrapperDimensions.width : null,
        height: fitHeight ? wrapperDimensions.height : null,
      };
    }

    const widthRatio = pageDimensions.width / wrapperDimensions.width;
    const heightRatio = pageDimensions.height / wrapperDimensions.height;

    const fitHorizontal = widthRatio >= heightRatio;

    return {
      width: fitHorizontal ? wrapperDimensions.width : null,
      height: fitHorizontal ? wrapperDimensions.height : null,
    };
  }, [pageDimensions, wrapperDimensions]);

  return {
    dimensions,
    handleLoadPage,
  };
};

export default usePdfDimensions;
