import { useState } from "react";
import {
  Breakpoint,
  breakpointKeys,
  getScreenBreakpoint,
  useBreakpoint,
} from "./useBreakpoint";

export type BreakpointValues<T> = Partial<Record<Breakpoint, T | null>>;

export const useBreakpointValue = <T>(values: T | BreakpointValues<T>) => {
  const [value, setValue] = useState(
    typeof values === "object"
      ? getValueByBreakpoint(
          values as BreakpointValues<T>,
          getScreenBreakpoint()
        )
      : values
  );

  useBreakpoint((breakpoint) => {
    if (typeof values !== "object") {
      return;
    }

    const newValue = getValueByBreakpoint(
      values as BreakpointValues<T>,
      breakpoint
    );

    if (newValue !== value) {
      setValue(newValue);
    }
  });

  return value as T;
};

export function getValueByBreakpoint<T>(
  values: BreakpointValues<T>,
  breakpoint: number
) {
  const valueEntries = Object.entries(values as never);

  let resIdx = valueEntries.findIndex(([key]) => {
    const bpIdx = breakpointKeys.indexOf(key);
    return breakpoint <= bpIdx;
  });
  if (resIdx < 0) {
    resIdx = valueEntries.length - 1;
  }

  const value = valueEntries[resIdx]?.[1] as T;
  return value;
}