const colors = require('tailwindcss/colors')
const plugin = require('tailwindcss/plugin')
const radix = require('@radix-ui/colors')

const accent = {
  'DEFAULT': 'hsl(var(--accent))',
  'base': 'hsl(var(--accent))',
  'foreground': 'hsl(var(--accent-foreground))',
  '01': 'var(--lx-accent-01, --rx-gray-01)',
  '02': 'var(--lx-accent-02, hsl(var(--accent)/.1))',
  '03': 'var(--lx-accent-03, hsl(var(--accent)/.15))',
  '04': 'var(--lx-accent-04, hsl(var(--accent)/.2))',
  '05': 'var(--lx-accent-05, hsl(var(--accent)/.3))',
  '06': 'var(--lx-accent-06, hsl(var(--accent)/.4))',
  '07': 'var(--lx-accent-07, hsl(var(--accent)/.5))',
  '08': 'var(--lx-accent-08, hsl(var(--accent)/.6))',
  '09': 'var(--lx-accent-09, hsl(var(--accent)/.7))',
  '10': 'var(--lx-accent-10, hsl(var(--accent)/.8))',
  '11': 'var(--lx-accent-11, hsl(var(--accent)/.9))',
  '12': 'var(--lx-accent-12, --rx-gray-12)',
  '01-alpha': 'var(--lx-accent-01-alpha)',
  '02-alpha': 'var(--lx-accent-02-alpha)',
  '03-alpha': 'var(--lx-accent-03-alpha)',
  '04-alpha': 'var(--lx-accent-04-alpha)',
  '05-alpha': 'var(--lx-accent-05-alpha)',
  '06-alpha': 'var(--lx-accent-06-alpha)',
  '07-alpha': 'var(--lx-accent-07-alpha)',
  '08-alpha': 'var(--lx-accent-08-alpha)',
  '09-alpha': 'var(--lx-accent-09-alpha)',
  '10-alpha': 'var(--lx-accent-10-alpha)',
  '11-alpha': 'var(--lx-accent-11-alpha)',
  '12-alpha': 'var(--lx-accent-12-alpha)',
}

const gray = {
  ...colors.gray,
  '01': 'var(--lx-gray-01, var(--ls-primary-background-color, var(--rx-gray-01)))',
  '02': 'var(--lx-gray-02, var(--ls-secondary-background-color, var(--rx-gray-02)))',
  '03': 'var(--lx-gray-03, var(--ls-tertiary-background-color, var(--rx-gray-03)))',
  '04': 'var(--lx-gray-04, var(--ls-quaternary-background-color, var(--rx-gray-04)))',
  '05': 'var(--lx-gray-05, var(--ls-quaternary-background-color, var(--rx-gray-05)))',
  '06': 'var(--lx-gray-06, var(--ls-quaternary-background-color, var(--rx-gray-06)))',
  '07': 'var(--lx-gray-07, var(--ls-quaternary-background-color, var(--rx-gray-07)))',
  '08': 'var(--lx-gray-08, var(--rx-gray-08))',
  '09': 'var(--lx-gray-09, var(--rx-gray-09))',
  '10': 'var(--lx-gray-10, var(--rx-gray-10))',
  '11': 'var(--lx-gray-11, var(--rx-gray-11))',
  '12': 'var(--lx-gray-12, var(--rx-gray-12))',
  '01-alpha': 'var(--lx-gray-01-alpha, var(--rx-gray-01-alpha))',
  '02-alpha': 'var(--lx-gray-02-alpha, var(--rx-gray-02-alpha))',
  '03-alpha': 'var(--lx-gray-03-alpha, var(--rx-gray-03-alpha))',
  '04-alpha': 'var(--lx-gray-04-alpha, var(--rx-gray-04-alpha))',
  '05-alpha': 'var(--lx-gray-05-alpha, var(--rx-gray-05-alpha))',
  '06-alpha': 'var(--lx-gray-06-alpha, var(--rx-gray-06-alpha))',
  '07-alpha': 'var(--lx-gray-07-alpha, var(--rx-gray-07-alpha))',
  '08-alpha': 'var(--lx-gray-08-alpha, var(--rx-gray-08-alpha))',
  '09-alpha': 'var(--lx-gray-09-alpha, var(--rx-gray-09-alpha))',
  '10-alpha': 'var(--lx-gray-10-alpha, var(--rx-gray-10-alpha))',
  '11-alpha': 'var(--lx-gray-11-alpha, var(--rx-gray-11-alpha))',
  '12-alpha': 'var(--lx-gray-12-alpha, var(--rx-gray-12-alpha))',
}

function exposeColorsToCssVars ({ addBase, theme }) {
  function extractColorVars (colorObj, colorGroup = '') {
    return Object.keys(colorObj).reduce((vars, colorKey) => {
      const value = colorObj[colorKey]

      const newVars =
        typeof value === 'string'
          ? { [`--color${colorGroup}-${colorKey}`]: value }
          : extractColorVars(value, `-${colorKey}`)

      return { ...vars, ...newVars }
    }, {})
  }

  addBase({
    ':root': extractColorVars(theme('colors')),
  })
}

const withOverride = plugin(function ({ matchUtilities }) {
  matchUtilities({
    'or': (value, b) => {
      // check if the value starts with "bg-"
      if (value.startsWith('bg-')) {
        return { [`--lx-bg-override`]: `var(--lx-${value})` }
      }
      // check if the value starts with "text-"
      if (value.startsWith('text-')) {
        return { [`--lx-text-override`]: `var(--lx-${value})` }
      }
      // check if the value starts with "border-"
      if (value.startsWith('border-')) {
        return { [`--lx-border-override`]: `var(--lx-${value})` }
      }
    }
  }, {
    values: {}
  })
})

function mapRadixColorToTailwind (color) {
  const radixColor = radix[color]
  if (!radixColor) throw new Error(`[radix color] not exist for ${color}`)
  const twSteps = [10, 50, 100, 200, 300, 400, 500, 600, 700, 800, 900, 950]
  const rxSteps = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12]
  const colors = {}

  twSteps.forEach((twStep, index) => {
    const rxStep = rxSteps[index]
    // base color
    colors[twStep] = radixColor[`${color}${rxStep}`]
    // theme vars color
    const rxStepName = `${(rxStep < 10) ? '0' : ''}${rxStep}`
    const rxVarName = `--rx-${color}-${rxStepName}`
    colors[`rx-${rxStepName}`] = `var(${rxVarName})`
    colors[`rx-${rxStepName}-alpha`] = `var(${rxVarName}-alpha)`
  })

  return colors
}

module.exports = {
  darkMode: 'class',
  content: [
    './src/**/*.js',
    './src/**/*.cljs',
    './resources/**/*.html',
    './deps/shui/src/**/*.cljs',
    './deps/shui/src/**/*.cljc',
    './packages/ui/@/components/**/*.{ts,tsx}'
  ],
  safelist: [
    'bg-black', 'bg-white', 'capitalize-first',
    { pattern: /bg-(gray|red|yellow|green|blue|orange|indigo|rose|purple|pink)-(100|200|300|400|500|600|700|800|900)/ },
    { pattern: /text-(gray|red|yellow|green|blue|orange|indigo|rose|purple|pink)-(100|200|300|400|500|600|700|800|900)/ },
    { pattern: /columns-([1-9]|1[0-2])|(auto|3xs|2xs|xs|sm|md|lg|xl)|([2-7]xl)/ },
  ],
  plugins: [
    require('@tailwindcss/forms'),
    require('@tailwindcss/typography'),
    require('@tailwindcss/aspect-ratio'),
    require('tailwind-capitalize-first-letter'),
    require('tailwindcss-animate'),
    exposeColorsToCssVars
  ],
  theme: {
    extend: {
      backgroundImage: {
        'gradient-conic': 'conic-gradient(var(--tw-gradient-stops))',
        'gradient-conic-bounce': 'conic-gradient(var(--tw-gradient-from), var(--tw-gradient-via), var(--tw-gradient-to), var(--tw-gradient-via), var(--tw-gradient-from))',
        'gradient-radial': 'radial-gradient(var(--tw-gradient-stops))',
      },
      fontSize: {
        '2xs': ['0.625rem', '0.875rem']
      },
      animation: {
        'spin-reverse': 'spin 2s linear infinite reverse',
        'accordion-down': 'accordion-down 0.2s ease-out',
        'accordion-up': 'accordion-up 0.2s ease-out',
      },
      spacing: {
        '128': '32rem',
        '144': '36rem'
      },
      scale: {
        '200': '2',
        '250': '2.5',
        '300': '3',
        '400': '4',
      },
      width: {
        'lsm': '600px',
        'lmd': '728px',
        'llg': '960px'
      },
      // backgroundColor: {
      //   ...lx('--lx-bg-override'),
      // },
      // textColor: {
      //   ...lx('--lx-text-override'),
      // },
      // borderColor: {
      //   ...lx('--lx-border-override'),
      // },
      borderRadius: {
        lg: 'var(--radius)',
        md: 'calc(var(--radius) - 2px)',
        sm: 'calc(var(--radius) - 4px)',
      },
      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 },
        },
      },
    },
    colors: {
      // Theme basic
      border: 'hsl(var(--border))',
      input: 'hsl(var(--input))',
      ring: 'hsl(var(--ring))',
      background: 'hsl(var(--background))',
      foreground: 'hsl(var(--foreground))',
      primary: {
        DEFAULT: 'hsl(var(--primary))',
        foreground: 'hsl(var(--primary-foreground))',
      },
      secondary: {
        DEFAULT: 'hsl(var(--secondary))',
        foreground: 'hsl(var(--secondary-foreground))',
      },
      destructive: {
        DEFAULT: 'hsl(var(--destructive))',
        foreground: 'hsl(var(--destructive-foreground))',
      },
      muted: {
        DEFAULT: 'hsl(var(--muted))',
        foreground: 'hsl(var(--muted-foreground))',
      },
      popover: {
        DEFAULT: 'hsl(var(--popover))',
        foreground: 'hsl(var(--popover-foreground))',
      },
      popovelx: {
        DEFAULT: 'var(--lx-gray-03, hsl(var(--popover)))',
      },
      card: {
        DEFAULT: 'hsl(var(--card))',
        foreground: 'hsl(var(--card-foreground))',
      },

      // Tailwind colors
      gray: gray,
      accent: accent,
      current: 'currentColor',
      transparent: 'transparent',
      black: colors.black,
      white: colors.white,

      red: mapRadixColorToTailwind('red'),
      pink: mapRadixColorToTailwind('pink'),
      orange: mapRadixColorToTailwind('orange'),
      yellow: mapRadixColorToTailwind('yellow'),
      green: mapRadixColorToTailwind('green'),
      blue: mapRadixColorToTailwind('blue'),
      indigo: mapRadixColorToTailwind('indigo'),
      purple: mapRadixColorToTailwind('purple'),

      rose: mapRadixColorToTailwind('red'),
      amber: mapRadixColorToTailwind('amber'),
      bronze: mapRadixColorToTailwind('bronze'),
      brown: mapRadixColorToTailwind('brown'),
      crimson: mapRadixColorToTailwind('crimson'),
      cyan: mapRadixColorToTailwind('cyan'),
      gold: mapRadixColorToTailwind('gold'),
      grass: mapRadixColorToTailwind('grass'),
      lime: mapRadixColorToTailwind('lime'),
      mauve: mapRadixColorToTailwind('mauve'),
      mint: mapRadixColorToTailwind('mint'),
      olive: mapRadixColorToTailwind('olive'),
      plum: mapRadixColorToTailwind('plum'),
      sage: mapRadixColorToTailwind('sage'),
      sand: mapRadixColorToTailwind('sand'),
      sky: mapRadixColorToTailwind('sky'),
      slate: mapRadixColorToTailwind('slate'),
      teal: mapRadixColorToTailwind('teal'),
      tomato: mapRadixColorToTailwind('tomato'),
      violet: mapRadixColorToTailwind('violet'),
    }
  },
  corePlugins: {
    preflight: true
  }
}
