import { createTheme, PaletteOptions, ThemeOptions } from '@mui/material/styles';


export const getPalette = (customPalette?: ThemeOptions) => {
  const defaultPalette = {
    primary: '#fc7f29',
    primaryLight: '#FFDB9F',
    primaryMedium: '#FFA84C',
    primaryDark: '#B74608',
    inherit: '#666666',
    secondary: '#43bbf2',
    error: '#d63643',
    warning: '#ffc300',
    info: '#71d5f7',
    success: '#6bc235',
    white: '#ffffff',
    black: '#000000',
    helper: '#5a2a79',
    secondaryLight: '#D9FCFE',
    secondaryMedium: '#71D5F7',
    secondaryDark: '#154F8C',
    inheritLight: '#A3A3A3',
    inheritMedium: '#666666',
    inheritDark: '#292929',
    whiteLight: '#F5F5F5',
    whiteMedium: '#E0E0E0',
    whiteDark: '#CCCCCC',
    successLight: '#D9F8B0',
    successMedium: '#B9EC85',
    successDark: '#247010',
    errorLight: '#FABEAF',
    errorMedium: '#F29085',
    errorDark: '#F29085',
    warningLight: '#FFF7CC',
    warningMedium: '#FFE266',
    warningDark: '#936600',
    helperLight: '#F3D7F8',
    helperMedium: '#BF82D6',
    helperDark: '#250D46',
  };

  const customPaletteAdapted = {
    primary: (customPalette?.palette?.primary as any)?.main || defaultPalette.primary,
    primaryLight: (customPalette?.palette?.primary as any)?.light || defaultPalette.primaryLight,
    primaryMedium: (customPalette?.palette?.primary as any)?.['500'] || defaultPalette.primaryMedium,
    primaryDark: (customPalette?.palette?.primary as any)?.dark || defaultPalette.primaryDark,
    inherit: (customPalette?.palette?.info as any)?.main || defaultPalette.inherit,
    secondary: (customPalette?.palette?.secondary as any)?.main || defaultPalette.secondary,
    error: (customPalette?.palette?.error as any)?.main || defaultPalette.error,
    warning: (customPalette?.palette?.warning as any)?.main || defaultPalette.warning,
    info: (customPalette?.palette?.info as any)?.main || defaultPalette.info,
    success: (customPalette?.palette?.success as any)?.main || defaultPalette.success,
    white: defaultPalette.white,
    black: (customPalette?.palette?.text as any)?.primary || defaultPalette.black,
    helper: defaultPalette.helper,
    secondaryLight: (customPalette?.palette?.secondary as any)?.light || defaultPalette.secondaryLight,
    secondaryMedium: (customPalette?.palette?.secondary as any)?.['500'] || defaultPalette.secondaryMedium,
    secondaryDark: (customPalette?.palette?.secondary as any)?.dark || defaultPalette.secondaryDark,
    inheritLight: (customPalette?.palette?.info as any)?.light || defaultPalette.inheritLight,
    inheritMedium: (customPalette?.palette?.info as any)?.['500'] || defaultPalette.inheritMedium,
    inheritDark: (customPalette?.palette?.info as any)?.dark || defaultPalette.inheritDark,
    whiteLight: defaultPalette.whiteLight,
    whiteMedium: defaultPalette.whiteMedium,
    whiteDark: defaultPalette.whiteDark,
    successLight: (customPalette?.palette?.success as any)?.light || defaultPalette.successLight,
    successMedium: (customPalette?.palette?.success as any)?.['500'] || defaultPalette.successMedium,
    successDark: (customPalette?.palette?.success as any)?.dark || defaultPalette.successDark,
    errorLight: (customPalette?.palette?.error as any)?.light || defaultPalette.errorLight,
    errorMedium: (customPalette?.palette?.error as any)?.['500'] || defaultPalette.errorMedium,
    errorDark: (customPalette?.palette?.error as any)?.dark || defaultPalette.errorDark,
    warningLight: (customPalette?.palette?.warning as any)?.light || defaultPalette.warningLight,
    warningMedium: (customPalette?.palette?.warning as any)?.['500'] || defaultPalette.warningMedium,
    warningDark: (customPalette?.palette?.warning as any)?.dark || defaultPalette.warningDark,
    helperLight: defaultPalette.helperLight,
    helperMedium: defaultPalette.helperMedium,
    helperDark: defaultPalette.helperDark,
  };

  return customPalette ? customPaletteAdapted : defaultPalette;
};

export const palette = getPalette();

export const textColors = {
  inherit: palette.inherit,
  primary: palette.primary,
  secondary: palette.secondary,
  error: palette.error,
  warning: palette.warning,
  info: palette.info,
  success: palette.success,
  white: palette.white,
  black: palette.black,
  helper: palette.helper,
  primaryLight: palette.primaryLight,
  primaryMedium: palette.primaryMedium,
  primaryDark: palette.primaryDark,
  secondaryLight: palette.secondaryLight,
  secondaryMedium: palette.secondaryMedium,
  secondaryDark: palette.secondaryDark,
  inheritLight: palette.inheritLight,
  inheritMedium: palette.inheritMedium,
  inheritDark: palette.inheritDark,
  whiteLight: palette.whiteLight,
  whiteMedium: palette.whiteMedium,
  whiteDark: palette.whiteDark,
  successLight: palette.successLight,
  successMedium: palette.successMedium,
  successDark: palette.successDark,
  errorLight: palette.errorLight,
  errorMedium: palette.errorMedium,
  errorDark: palette.errorDark,
  warningLight: palette.warningLight,
  warningMedium: palette.warningMedium,
  warningDark: palette.warningDark,
  helperLight: palette.helperLight,
  helperMedium: palette.helperMedium,
  helperDark: palette.helperDark,
};

export const backgroundColors = {
  inherit: palette.inherit,
  primary: palette.primary,
  secondary: palette.secondary,
  error: palette.error,
  warning: palette.warning,
  info: palette.info,
  success: palette.success,
  white: palette.white,
  black: palette.black,
  primaryLight: palette.primaryLight,
  primaryMedium: palette.primaryMedium,
  primaryDark: palette.primaryDark,
  secondaryLight: palette.secondaryLight,
  secondaryMedium: palette.secondaryMedium,
  secondaryDark: palette.secondaryDark,
  inheritLight: palette.inheritLight,
  inheritMedium: palette.inheritMedium,
  inheritDark: palette.inheritDark,
  whiteLight: palette.whiteLight,
  whiteMedium: palette.whiteMedium,
  whiteDark: palette.whiteDark,
  successLight: palette.successLight,
  successMedium: palette.successMedium,
  successDark: palette.successDark,
  errorLight: palette.errorLight,
  errorMedium: palette.errorMedium,
  errorDark: palette.errorDark,
  warningLight: palette.warningLight,
  warningMedium: palette.warningMedium,
  warningDark: palette.warningDark,
  helperLight: palette.helperLight,
  helperMedium: palette.helperMedium,
  helperDark: palette.helperDark,
};

export const olosPalette = {
  primary: {
    main: palette.primary,
  },
  secondary: {
    main: palette.secondary,
  },
  error: {
    main: palette.error,
  },
  warning: {
    main: palette.warning,
  },
  info: {
    main: palette.info,
  },
  success: {
    main: palette.success,
  },
};

export const newOlosPalette: PaletteOptions = {
  primary: {
    main: palette.primary,
    light: palette.primaryLight,
    dark: palette.primaryDark,
    contrastText: palette.white,
    '500': palette.primaryMedium,
  },
  secondary: {
    main: palette.secondary,
    light: palette.secondaryLight,
    dark: palette.secondaryDark,
    contrastText: palette.white,
    '500': palette.secondaryMedium,
  },
  error: {
    main: palette.error,
    light: palette.errorLight,
    dark: palette.errorDark,
    contrastText: palette.white,
    '500': palette.errorMedium,
  },
  warning: {
    main: palette.warning,
    light: palette.warningLight,
    dark: palette.warningDark,
    contrastText: palette.white,
    '500': palette.warningMedium,
  },
  info: {
    main: palette.inherit,
    light: palette.inheritLight,
    dark: palette.inheritDark,
    contrastText: palette.white,
    '500': palette.inheritMedium,
  },
  success: {
    main: palette.success,
    light: palette.successLight,
    dark: palette.successDark,
    contrastText: palette.white,
    '500': palette.successMedium,
  },
  text: {
    primary: palette.black,
    secondary: palette.primary,
    disabled: palette.inherit,
  }
};

export const mockPalette: PaletteOptions = {
  primary: {
   main: '#fc92ee',
  },
  secondary: {
    main: '#43bbf2',
  },
  error: {
    main: '#d63643',
  },
  warning: {
    main: '#ffc300',
  },
  info: {
    main: '#71d5f7',
  },
  success: {
    main: '#6bc235',
  },
};

export const lightTheme = createTheme({
  palette: {
    mode: 'light',
    ...olosPalette,
  },
});

export const newLightTheme = createTheme({
  palette: {
    mode: 'light',
    ...newOlosPalette,
  },
});

export const darkTheme = createTheme({
  palette: {
    mode: 'dark',
    ...olosPalette,
    background: {
      default: palette.inheritLight,
      paper: palette.inheritDark,
    },
  },
});

export const mockTheme = createTheme({
  palette: {
    mode: 'light',
    ...mockPalette,
  },
});

export const themes = {
  light: lightTheme,
  dark: darkTheme,
  newLight: newLightTheme,
};

type PaletteKey = keyof typeof getPalette;

const getColor = (key: PaletteKey) => {
  const palette = getPalette();
  if (palette.hasOwnProperty(key)) {
    return palette[key];
  } else {
    return '#CCC';
  }
};

const extractRGB = (rgbString: string) => {
  if (typeof rgbString === 'string') {
    const match = rgbString.match(/\((\d+), (\d+), (\d+)\)/);

    if (match) {
      const r = match[1];
      const g = match[2];
      const b = match[3];
      return `${r},${g},${b}`;
    }
  }
  return null;
};

const lightenRGB = (rgbString: string, amount = 20) => {
  if (typeof rgbString === 'string') {
    const match = rgbString.match(/\((\d+), (\d+), (\d+)\)/);

    if (match) {
      const r = parseInt(match[1]);
      const g = parseInt(match[2]);
      const b = parseInt(match[3]);

      const newR = Math.min(255, r + amount);
      const newG = Math.min(255, g + amount);
      const newB = Math.min(255, b + amount);

      return `rgb(${newR},${newG},${newB})`;
    }
  }
  return null;
};

export { extractRGB, getColor, lightenRGB };

