import type { Config } from 'tailwindcss';

const config: Config = {
  darkMode: 'class',
  content: [
    './src/**/*.{ts,tsx,mdx}',
    './src/app/**/*.{ts,tsx,mdx}',
    './src/pages/**/*.{ts,tsx,mdx}',
    './src/components/**/*.{ts,tsx,mdx}',
  ],
  safelist: [
    'bg-amber-900',
    'bg-amber-800',
    'bg-amber-700',
    'bg-amber-600',
    'bg-amber-500',
    'bg-amber-400',
    'bg-amber-400',
    'bg-amber-300',
    'text-amber-300',
    'text-amber-200',
    'bg-green-900',
    'bg-green-800',
    'bg-green-700',
    'bg-green-600',
    'bg-green-500',
    'bg-green-400',
    'bg-green-400',
    'bg-green-300',
    'text-green-300',
    'text-green-200',
    'bg-gray-900',
    'bg-gray-800',
    'bg-gray-700',
    'bg-gray-600',
    'bg-gray-500',
    'bg-gray-400',
    'bg-gray-400',
    'bg-gray-300',
    'text-gray-300',
    'bg-indigo-900',
    'bg-indigo-800',
    'bg-indigo-700',
    'bg-indigo-600',
    'bg-indigo-500',
    'bg-indigo-400',
    'bg-indigo-400',
    'bg-indigo-300',
    'text-indigo-300',
    'text-indigo-200',
    'bg-lime-900',
    'bg-lime-800',
    'bg-lime-700',
    'bg-lime-600',
    'bg-lime-500',
    'bg-lime-400',
    'bg-lime-400',
    'bg-lime-300',
    'text-lime-300',
    'text-lime-200',
    'text-lime-400',
    'text-lime-500',
    'bg-red-900',
    'bg-red-800',
    'bg-red-700',
    'bg-red-600',
    'bg-red-500',
    'bg-red-400',
    'bg-red-400',
    'bg-red-300',
    'text-red-300',
    'text-red-200',
    'bg-emerald-900',
    'bg-emerald-800',
    'bg-emerald-700',
    'bg-emerald-600',
    'bg-emerald-500',
    'bg-emerald-400',
    'bg-emerald-400',
    'bg-emerald-300',
    'text-emerald-300',
    'text-emerald-200',
    'text-emerald-400',
    'text-emerald-500',
    'bg-purple-900',
    'bg-purple-800',
    'bg-purple-700',
    'bg-purple-600',
    'bg-purple-500',
    'bg-purple-400',
    'bg-purple-400',
    'bg-green-300',
    'text-green-300',
    'text-green-200',
    'text-green-400',
    'text-green-500',
    'bg-opacity-70',
    'bg-opacity-80',
    'bg-opacity-70',
    'bg-opacity-60',
    'bg-opacity-50',
    'bg-opacity-30',
    'bg-opacity-20',
    'bg-opacity-10',
    'bg-opacity-5',
    'text-audienceScore-100',
    'text-audienceScore-200',
    'text-audienceScore-300',
    'text-audienceScore-400',
    'text-audienceScore-500',
    'text-audienceScore-600',
    'text-audienceScore-700',
    'text-audienceScore-800',
    'text-audienceScore-900',
    'drop-shadow-sm',
    '-top-10 top-10',

    {
      pattern:
        /bg-(red|green|blue|gray|brand|orange|yellow)-(100|200|300|400|500|600|700|800|900|950)/,
      variants: ['hover'],
    },
    // {
    //     pattern: /text-(red|green|blue|gray|brand|orange|yellow)-(100|200|300|400|500|600|700|800|900|950)/,
    //     variants: ['hover'],
    // },
    // {
    //     pattern: /border-(red|green|blue|gray|brand|orange|yellow)-(100|200|300|400|500|600|700|800|900|950)/,
    // },

    {
      pattern: /p-[0-9]+/,
    },
    {
      pattern: /m-[0-9]+/,
    },
    {
      pattern: /gap-[0-9]+/,
    },
    {
      pattern: /(px|py|pt|pb|pl|pr)-[0-9]+/,
    },
    {
      pattern: /(mx|my|mt|mb|ml|mr)-[0-9]+/,
    },

    {
      pattern: /grid-cols-[1-9]+/,
      variants: ['lg'],
    },
    {
      pattern: /col-span-[1-9]+/,
      variants: ['lg'],
    },
    'flex',
    'inline-flex',
    'grid',
    'inline-grid',
    'flex-row',
    'flex-col',
    'flex-row-reverse',
    'flex-col-reverse',
    'flex-wrap',
    'flex-nowrap',
    'flex-wrap-reverse',
    'items-start',
    'items-center',
    'items-end',
    'items-baseline',
    'items-stretch',
    'justify-start',
    'justify-center',
    'justify-end',
    'justify-between',
    'justify-around',
    'justify-evenly',

    {
      pattern:
        /flex|inline-flex|grid|inline-grid|flex-row|flex-col|flex-row-reverse|flex-col-reverse|flex-wrap|flex-nowrap|flex-wrap-reverse|items-start|items-center|items-end|items-baseline|items-stretch|justify-start|justify-center|justify-end|justify-between|justify-around|justify-evenly/,
      variants: ['lg', 'md'],
    },

    // {
    //     pattern: /w-[0-9]+/,
    //     variants: ['lg', 'md', 'sm', 'xl', '2xl'],
    // },
    // {
    //     pattern: /h-[0-9]+/,
    //     variants: ['lg', 'md', 'sm', 'xl', '2xl'],
    // },
    'w-full',
    'h-full',
    'w-screen',
    'h-screen',
    'w-auto',
    'h-auto',
    'min-w-0',
    'min-h-0',
    'max-w-none',
    'max-h-none',

    {
      pattern: /text-xs|text-sm|text-base|text-lg|text-xl|text-2xl|text-3xl/,
      variants: ['lg', 'md'],
    },

    {
      pattern:
        /font-thin|font-light|font-normal|font-medium|font-semibold|font-bold/,
      variants: ['lg', 'md'],
    },

    {
      pattern: /text-left|text-center|text-right|text-justify/,
      variants: ['lg', 'md'],
    },

    'uppercase',
    'lowercase',
    'capitalize',
    'normal-case',
    'truncate',
    'overflow-ellipsis',
    'overflow-clip',

    'rounded-none',
    'rounded-sm',
    'rounded',
    'rounded-md',
    'rounded-lg',
    'rounded-xl',
    'rounded-2xl',
    'rounded-3xl',
    'rounded-full',
    'border',
    'border-0',
    'border-2',
    'border-4',
    'border-8',
    // {
    //     pattern: /border-[0-9]+/,
    //     variants: ['lg', 'md', 'sm', 'xl', '2xl', 'hover', 'focus'],
    // },

    'shadow-sm',
    'shadow',
    'shadow-md',
    'shadow-lg',
    'shadow-xl',
    'shadow-2xl',
    'shadow-inner',
    'shadow-none',
    'opacity-0',
    'opacity-25',
    'opacity-50',
    'opacity-75',
    'opacity-100',

    // "transition", "transition-all", "transition-colors", "transition-opacity", "transition-shadow", "transition-transform",
    // "duration-75", "duration-100", "duration-150", "duration-200", "duration-300", "duration-500", "duration-700", "duration-1000",
    // "ease-linear", "ease-in", "ease-out", "ease-in-out",
    // "scale-0", "scale-50", "scale-75", "scale-90", "scale-95", "scale-100", "scale-105", "scale-110", "scale-125", "scale-150",
    // "rotate-0", "rotate-45", "rotate-90", "rotate-180", "-rotate-45", "-rotate-90", "-rotate-180",
    // "translate-x-0", "translate-x-1", "translate-x-2", "translate-x-4", "translate-x-8",
    // "translate-y-0", "translate-y-1", "translate-y-2", "translate-y-4", "translate-y-8",

    'cursor-pointer',
    'cursor-not-allowed',
    'cursor-wait',
    'cursor-text',
    'cursor-move',
    'cursor-help',
    'select-none',
    'select-text',
    'select-all',
    'select-auto',
    'pointer-events-none',
    'pointer-events-auto',
    'resize',
    'resize-none',
    'resize-y',
    'resize-x',

    'static',
    'fixed',
    'absolute',
    'relative',
    'sticky',
    'top-0',
    'right-0',
    'bottom-0',
    'left-0',
    'z-0',
    'z-10',
    'z-20',
    'z-30',
    'z-40',
    'z-50',
    'z-auto',

    'block',
    'inline-block',
    'inline',
    'hidden',
    {
      pattern: /hidden|block|inline|inline-block/,
      variants: ['lg', 'md'],
    },

    'overflow-auto',
    'overflow-hidden',
    'overflow-visible',
    'overflow-scroll',
    'overflow-x-auto',
    'overflow-y-auto',
    'overflow-x-hidden',
    'overflow-y-hidden',
  ],
  theme: {
    container: {
      center: true,
      padding: {
        DEFAULT: '1rem',
        sm: '2rem',
        lg: '4rem',
        xl: '5rem',
        '2xl': '6rem',
      },
      screens: {
        '2xl': '1400px',
        '3xl': '1600px',
        '4xl': '1800px',
        '5xl': '2000px',
        '6xl': '2200px',
        '7xl': '2400px',
      },
    },
    data: {
      checked: 'checked',
      selected: 'selected',
      disabled: 'disabled',
      highlighted: 'highlighted',
    },
    extend: {
      screens: {
        '3xl': '1600px',
        '4xl': '1800px',
        '5xl': '2000px',
        '6xl': '2200px',
        '7xl': '2400px',
      },
      animationDuration: {
        DEFAULT: '0.25s',
      },
      keyframes: {
        'accordion-down': {
          from: { height: '0' },
          to: { height: 'var(--radix-accordion-content-height)' },
        },
        'accordion-up': {
          from: { height: 'var(--radix-accordion-content-height)' },
          to: { height: '0' },
        },
        'slide-down': {
          from: { transform: 'translateY(-1rem)', opacity: '0' },
          to: { transform: 'translateY(0)', opacity: '1' },
        },
        'slide-up': {
          from: { transform: 'translateY(0)', opacity: '1' },
          to: { transform: 'translateY(-1rem)', opacity: '0' },
        },
        'indeterminate-progress': {
          '0%': { transform: ' translateX(0) scaleX(0)' },
          '40%': { transform: 'translateX(0) scaleX(0.4)' },
          '100%': { transform: 'translateX(100%) scaleX(0.5)' },
        },
      },
      animation: {
        'accordion-down': 'accordion-down 0.15s linear',
        'accordion-up': 'accordion-up 0.15s linear',
        'slide-down': 'slide-down 0.15s ease-in-out',
        'slide-up': 'slide-up 0.15s ease-in-out',
        'indeterminate-progress': 'indeterminate-progress 1s infinite ease-out',
      },
      transformOrigin: {
        'left-right': '0% 100%',
      },
      boxShadow: {
        md: '0 1px 3px 0 rgba(0, 0, 0, 0.1),0 1px 2px 0 rgba(0, 0, 0, 0.06)',
      },
      colors: {
        brand: {
          50: 'rgb(var(--color-brand-50) / <alpha-value>)',
          100: 'rgb(var(--color-brand-100) / <alpha-value>)',
          200: 'rgb(var(--color-brand-200) / <alpha-value>)',
          300: 'rgb(var(--color-brand-300) / <alpha-value>)',
          400: 'rgb(var(--color-brand-400) / <alpha-value>)',
          500: 'rgb(var(--color-brand-500) / <alpha-value>)',
          600: 'rgb(var(--color-brand-600) / <alpha-value>)',
          700: 'rgb(var(--color-brand-700) / <alpha-value>)',
          800: 'rgb(var(--color-brand-800) / <alpha-value>)',
          900: 'rgb(var(--color-brand-900) / <alpha-value>)',
          950: 'rgb(var(--color-brand-950) / <alpha-value>)',
          DEFAULT: 'rgb(var(--color-brand-500) / <alpha-value>)',
        },
        gray: {
          50: 'rgb(var(--color-gray-50) / <alpha-value>)',
          100: 'rgb(var(--color-gray-100) / <alpha-value>)',
          200: 'rgb(var(--color-gray-200) / <alpha-value>)',
          300: 'rgb(var(--color-gray-300) / <alpha-value>)',
          400: 'rgb(var(--color-gray-400) / <alpha-value>)',
          500: 'rgb(var(--color-gray-500) / <alpha-value>)',
          600: 'rgb(var(--color-gray-600) / <alpha-value>)',
          700: 'rgb(var(--color-gray-700) / <alpha-value>)',
          800: 'rgb(var(--color-gray-800) / <alpha-value>)',
          900: 'rgb(var(--color-gray-900) / <alpha-value>)',
          950: 'rgb(var(--color-gray-950) / <alpha-value>)',
          DEFAULT: 'rgb(var(--color-gray-500) / <alpha-value>)',
        },
        green: {
          50: '#e6f7ea',
          100: '#cfead6',
          200: '#7bd0a7',
          300: '#68b695',
          400: '#57a181',
          500: '#258c60',
          600: '#1a6444',
          700: '#154f37',
          800: '#103b29',
          900: '#0a2318',
          950: '#05130d',
          DEFAULT: '#258c60',
        },
        audienceScore: {
          300: '#b45d5d',
          500: '#9d8741',
          600: '#a0b974',
          700: '#57a181',
        },
        background: {
          500: 'rgb(var(--background) / <alpha-value>)',
          DEFAULT: 'rgb(var(--background) / <alpha-value>)',
        },
      },
    },
  },
  plugins: [
    require('@tailwindcss/typography'),
    require('@tailwindcss/forms'),
    require('@headlessui/tailwindcss'),
    require('tailwind-scrollbar-hide'),
    require('tailwindcss-animate'),
    addVariablesForColors,
    function ({
      addVariant,
    }: {
      addVariant: (variant: string, selector: string) => void;
    }) {
      addVariant('firefox', ':-moz-any(&)');
    },
  ],
};
export default config;

function addVariablesForColors({ addBase, theme }: any) {
  let allColors = flattenColorPalette(theme('colors'));
  let newVars = Object.fromEntries(
    Object.entries(allColors).map(([key, val]) => [`--${key}`, val])
  );

  addBase({
    ':root': newVars,
  });
}

type Colors = {
  [key: string | number]: string | Colors;
};

function flattenColorPalette(colors: Colors) {
  let result: Record<string, string> = {};

  for (let [root, children] of Object.entries(colors ?? {})) {
    if (root === '__CSS_VALUES__') continue;
    if (typeof children === 'object' && children !== null) {
      for (let [parent, value] of Object.entries(
        flattenColorPalette(children)
      )) {
        result[`${root}${parent === 'DEFAULT' ? '' : `-${parent}`}`] = value;
      }
    } else {
      result[root] = children;
    }
  }

  if ('__CSS_VALUES__' in colors) {
    for (let [key, value] of Object.entries(colors.__CSS_VALUES__)) {
      if ((Number(value) & (1 << 2)) === 0) {
        result[key] = colors[key] as string;
      }
    }
  }

  return result;
}
