/* eslint-disable @typescript-eslint/ban-ts-comment */
import { assert, test } from 'vitest'

import { makeThemeFunction } from '../internal/theme'

test('default color', () => {
  const theme = makeThemeFunction({
    colors: {},
    extend: {
      colors: {
        gray: {
          DEFAULT: '#aaa',
        },
      },
    },
  })

  assert.strictEqual(theme('colors.gray'), '#aaa')
  assert.strictEqual(theme('colors.gray.DEFAULT'), '#aaa')
  assert.strictEqual(theme('colors', 'gray'), '#aaa')
  assert.strictEqual(theme('colors', 'gray-DEFAULT'), '#aaa')
  // @ts-ignore
  assert.deepEqual(theme(), { colors: { gray: '#aaa', 'gray-DEFAULT': '#aaa' } })
})

test('custom color', () => {
  const theme = makeThemeFunction({
    colors: {
      gray: {
        300: '#d1d5db',
      },
    },
    extend: {
      colors: {
        gray: {
          custom: '#aaa',
        },
      },
    },
  })

  assert.strictEqual(theme('colors.gray.custom'), '#aaa')
  assert.strictEqual(theme('colors', 'gray-custom'), '#aaa')

  assert.strictEqual(theme('colors.gray.300'), '#d1d5db')
  assert.strictEqual(theme('colors', 'gray-300'), '#d1d5db')

  assert.strictEqual(theme('colors.gray.special', '#bbb'), '#bbb')
  assert.strictEqual(theme('colors', 'gray-special', '#bbb'), '#bbb')
})

test('deep custom color', () => {
  const theme = makeThemeFunction({
    colors: {
      gray: {
        300: '#d1d5db',
      },
    },
    extend: {
      colors: {
        gray: {
          a: {
            b: {
              c: {
                d: {
                  e: {
                    f: '#abcdef',
                  },
                },
              },
            },
          },
        },
      },
    },
  })

  assert.strictEqual(theme('colors.gray.a.b.c.d.e.f'), '#abcdef')
  assert.strictEqual(theme('colors', 'gray-a-b-c-d-e-f'), '#abcdef')

  assert.strictEqual(theme('colors.gray.300'), '#d1d5db')
  assert.strictEqual(theme('colors', 'gray-300'), '#d1d5db')
})

test('negative is available and no-op', () => {
  const theme = makeThemeFunction({
    spacing: {
      px: '1px',
    },
    extend: {
      // @ts-ignore
      spacing: ({ negative }) => ({
        ...negative({ xs: '1rem' }),
      }),
    },
  })

  assert.strictEqual(theme('spacing', 'xs'), undefined)
  assert.strictEqual(theme('spacing', '-xs'), undefined)

  assert.strictEqual(theme('spacing', 'px'), '1px')
})

test('reference the default theme', () => {
  const theme = makeThemeFunction({
    fontFamily: {
      sans: 'ui-sans-serif,system-ui'.split(','),
    },
    extend: {
      // @ts-ignore
      fontFamily: ({ theme }) => ({
        sans: ['"Inter var"', theme('fontFamily.sans')],
      }),
    },
  })

  assert.deepEqual(theme('fontFamily', 'sans'), ['"Inter var"', ['ui-sans-serif', 'system-ui']])
})
