import { Image as RNImage } from "react-native";
import memoizee from "memoizee";
import { quickBrickLogger } from "@applicaster/zapp-react-native-utils/logger";
import { noop } from "@applicaster/zapp-react-native-utils/functionUtils";
import { toFiniteNumberWithDefault } from "@applicaster/zapp-react-native-utils/numberUtils";

type Size = {
  width: number;
  height: number;
};

const logger = quickBrickLogger
  .addSubsystem("zapp-react-native-ui-components")
  .addSubsystem("Components")
  .addSubsystem("MasterCell")
  .addSubsystem("DefaultComponents")
  .addSubsystem("Image.android");

const THRESHOLD = 2; // in how many times size should be BIGGER than expected

const isSizeTooBig = (realSize: number, expectedSize: number): boolean =>
  toFiniteNumberWithDefault(0, realSize / expectedSize) >= THRESHOLD;

const getImageSize = (uri: string): Promise<Size> => {
  return new Promise((resolve, reject) => {
    RNImage.getSize(
      uri,
      (width: number, height: number) => {
        const size: Size = { width, height };
        resolve(size);
      },
      reject
    );
  });
};

const checkTooBigImageSize = (
  uri: string,
  expectedWidth: number,
  expectedHeight: number
): void => {
  getImageSize(uri)
    .then(({ width, height }) => {
      if (isSizeTooBig(width, expectedWidth)) {
        logger.warning({
          message: "Width of image is much bigger than expected",
          data: {
            uri,
            width,
            expectedWidth,
          },
        });
      }

      if (isSizeTooBig(height, expectedHeight)) {
        logger.warning({
          message: "Height of image is much bigger than expected",
          data: {
            uri,
            height,
            expectedHeight,
          },
        });
      }
    })
    .catch(noop);
};

export const runOnceCheckTooBigImageSize = memoizee(checkTooBigImageSize, {
  primitive: true,
});
