import { IconMapper, IconType, sprinkleVars } from '@nova-hf/ui';
import {
  MobileServiceRequest,
  OptionVariant,
  ProvisionedSubscriptionVariant,
  SignupContract,
} from 'typings/graphql';
const allIcons = { ...IconMapper[48], ...IconMapper[24] };

export const isThemeColorType = (color: unknown): color is sprinkleVars.ThemeColorType => {
  return typeof color === 'string' && sprinkleVars.themeColors.hasOwnProperty(color);
};

export const parseThemeColor = (
  maybeThemeColor: string,
  fallbackColor?: sprinkleVars.ThemeColorType,
): sprinkleVars.ThemeColorType => {
  if (isThemeColorType(maybeThemeColor)) {
    return maybeThemeColor;
  } else if (fallbackColor) return fallbackColor;
  throw new Error('This is not of type ThemeColorType');
};

export const isMainColorType = (color: unknown): color is sprinkleVars.MainColorType => {
  return typeof color === 'string' && sprinkleVars.mainColors.hasOwnProperty(color);
};

export const parseMainColor = (
  maybeMainColor: string,
  fallbackColor?: sprinkleVars.MainColorType,
): sprinkleVars.MainColorType => {
  if (isMainColorType(maybeMainColor)) {
    return maybeMainColor;
  } else if (fallbackColor) return fallbackColor;
  throw new Error('This is not of type MainColorType');
};

export const isBoxShadowType = (
  shadowColor: unknown,
): shadowColor is sprinkleVars.BoxShadowType => {
  return typeof shadowColor === 'string' && sprinkleVars.boxShadows.hasOwnProperty(shadowColor);
};

export const parseBoxShadowColor = (
  maybeBoxShadow: string,
  fallbackShadow?: sprinkleVars.BoxShadowType,
): sprinkleVars.BoxShadowType => {
  if (isBoxShadowType(maybeBoxShadow)) {
    return maybeBoxShadow;
  } else if (fallbackShadow) return fallbackShadow;
  throw new Error('This is not of type BoxShadowType');
};

export const isIcon = (icon: unknown): icon is IconType => {
  return typeof icon === 'string' && allIcons.hasOwnProperty(icon);
};

export const parseIcon = (maybeIcon: string, fallbackIcon?: IconType): IconType => {
  if (isIcon(maybeIcon)) {
    return maybeIcon;
  } else if (fallbackIcon) return fallbackIcon;
  throw new Error('This is not of type IconType');
};

export const isProvisionedSubscriptionVariant = (variant: {
  __typename?: string;
}): variant is ProvisionedSubscriptionVariant => {
  return variant?.__typename === 'ProvisionedSubscriptionVariant';
};

export const isOptionVariant = (variant: { __typename?: string }): variant is OptionVariant => {
  return variant?.__typename === 'OptionVariant';
};

export const isMobileServiceRequest = (
  service: { __typename?: string } | undefined | null,
): service is MobileServiceRequest => {
  return service?.__typename === 'MobileServiceRequest';
};

export const isSignupContract = (
  contract: { __typename?: string } | undefined | null,
): contract is SignupContract => {
  return contract?.__typename === 'SignupContract';
};
