import { useMemo } from "react";
import { Color, parseColor } from "react-aria-components";
import { useEntity, useReplicache } from "src/replicache";
import { FilterAttributes } from "src/replicache/attributes";
import { ThemeDefaults } from "./themeUtils";

export function useColorAttribute(
  entity: string | null,
  attribute: keyof FilterAttributes<{ type: "color"; cardinality: "one" }>,
) {
  // takes a color string and turns it into a react-aria Color type
  // we need it to interact with Color Pickers for themeing
  let { rootEntity } = useReplicache();
  let color = useEntity(entity, attribute);
  let fallbackColor = useEntity(color ? null : rootEntity, attribute);
  return useMemo(() => {
    let c = color || fallbackColor;
    return parseColor(c ? `hsba(${c.data.value})` : ThemeDefaults[attribute]);
  }, [color, fallbackColor, attribute]);
}
export function useColorAttributeNullable(
  entity: string | null,
  attribute: keyof FilterAttributes<{ type: "color"; cardinality: "one" }>,
) {
  // takes a color string and turns it into a react-aria Color type
  // we need it to interact with Color Pickers for themeing
  let color = useEntity(entity, attribute);
  return useMemo(() => {
    let c = color;
    return c ? parseColor(`hsba(${c.data.value})`) : null;
  }, [color, attribute]);
}

export function colorToString(value: Color, space: "rgb" | "hsba") {
  // takes a react-aria Color type and turns it into an rgb or hsba color string.
  // we need it to set the color in our database when we can the color back from the Color Pickers
  return value.toString(space).slice(space.length + 1, -1);
}
