import _ from 'lodash'
import postcss from 'postcss'
import processPlugins from '../src/util/processPlugins'
import container from '../src/plugins/container'

function css(nodes) {
  return postcss.root({ nodes }).toString()
}

function config(overrides) {
  return _.defaultsDeep(overrides, {
    theme: {
      screens: {
        sm: '576px',
        md: '768px',
        lg: '992px',
        xl: '1200px',
      },
    },
    prefix: '',
  })
}

test('options are not required', () => {
  const { components } = processPlugins([container()], config())

  expect(css(components)).toMatchCss(`
    @layer components {
      @variants {
        .container { width: 100% }
        @media (min-width: 576px) {
          .container { max-width: 576px }
        }
        @media (min-width: 768px) {
          .container { max-width: 768px }
        }
        @media (min-width: 992px) {
          .container { max-width: 992px }
        }
        @media (min-width: 1200px) {
          .container { max-width: 1200px }
        }
      }
    }
  `)
})

test('screens can be passed explicitly', () => {
  const { components } = processPlugins(
    [container()],
    config({
      theme: {
        container: {
          screens: ['400px', '500px'],
        },
      },
    })
  )

  expect(css(components)).toMatchCss(`
    @layer components {
      @variants {
        .container { width: 100% }
        @media (min-width: 400px) {
          .container { max-width: 400px }
        }
        @media (min-width: 500px) {
          .container { max-width: 500px }
        }
      }
    }
  `)
})

test('screens are ordered ascending by min-width', () => {
  const { components } = processPlugins(
    [container()],
    config({
      theme: {
        container: {
          screens: ['500px', '400px'],
        },
      },
    })
  )

  expect(css(components)).toMatchCss(`
  @layer components {
      @variants {
        .container { width: 100% }
        @media (min-width: 400px) {
          .container { max-width: 400px }
        }
        @media (min-width: 500px) {
          .container { max-width: 500px }
        }
      }
    }
  `)
})

test('screens are deduplicated by min-width', () => {
  const { components } = processPlugins(
    [container()],
    config({
      theme: {
        container: {
          screens: {
            sm: '576px',
            md: '768px',
            'sm-only': { min: '576px', max: '767px' },
          },
        },
      },
    })
  )

  expect(css(components)).toMatchCss(`
    @layer components {
      @variants {
        .container { width: 100% }
        @media (min-width: 576px) {
          .container { max-width: 576px }
        }
        @media (min-width: 768px) {
          .container { max-width: 768px }
        }
      }
    }
  `)
})

test('the container can be centered by default', () => {
  const { components } = processPlugins(
    [container()],
    config({
      theme: {
        container: {
          center: true,
        },
      },
    })
  )

  expect(css(components)).toMatchCss(`
    @layer components {
      @variants {
        .container {
          width: 100%;
          margin-right: auto;
          margin-left: auto
        }
        @media (min-width: 576px) {
          .container { max-width: 576px }
        }
        @media (min-width: 768px) {
          .container { max-width: 768px }
        }
        @media (min-width: 992px) {
          .container { max-width: 992px }
        }
        @media (min-width: 1200px) {
          .container { max-width: 1200px }
        }
      }
    }
  `)
})

test('horizontal padding can be included by default', () => {
  const { components } = processPlugins(
    [container()],
    config({
      theme: {
        container: {
          padding: '2rem',
        },
      },
    })
  )

  expect(css(components)).toMatchCss(`
    @layer components {
      @variants {
        .container {
          width: 100%;
          padding-right: 2rem;
          padding-left: 2rem
        }
        @media (min-width: 576px) {
          .container { max-width: 576px }
        }
        @media (min-width: 768px) {
          .container { max-width: 768px }
        }
        @media (min-width: 992px) {
          .container { max-width: 992px }
        }
        @media (min-width: 1200px) {
          .container { max-width: 1200px }
        }
      }
    }
  `)
})

test('responsive horizontal padding can be included by default', () => {
  const { components } = processPlugins(
    [container()],
    config({
      theme: {
        screens: {
          sm: '576px',
          md: { min: '768px' },
          lg: { 'min-width': '992px' },
          xl: { min: '1200px', max: '1600px' },
        },
        container: {
          padding: {
            default: '1rem',
            sm: '2rem',
            lg: '4rem',
            xl: '5rem',
          },
        },
      },
    })
  )

  expect(css(components)).toMatchCss(`
    @layer components {
      @variants {
        .container {
          width: 100%;
          padding-right: 1rem;
          padding-left: 1rem
        }
        @media (min-width: 576px) {
          .container {
            max-width: 576px;
            padding-right: 2rem;
            padding-left: 2rem
          }
        }
        @media (min-width: 768px) {
          .container { max-width: 768px }
        }
        @media (min-width: 992px) {
          .container {
            max-width: 992px;
            padding-right: 4rem;
            padding-left: 4rem
          }
        }
        @media (min-width: 1200px) {
          .container {
            max-width: 1200px;
            padding-right: 5rem;
            padding-left: 5rem
          }
        }
      }
    }
  `)
})

test('setting all options at once', () => {
  const { components } = processPlugins(
    [container()],
    config({
      theme: {
        container: {
          screens: ['400px', '500px'],
          center: true,
          padding: '2rem',
        },
      },
    })
  )

  expect(css(components)).toMatchCss(`
    @layer components {
      @variants {
        .container {
          width: 100%;
          margin-right: auto;
          margin-left: auto;
          padding-right: 2rem;
          padding-left: 2rem
        }
        @media (min-width: 400px) {
          .container { max-width: 400px }
        }
        @media (min-width: 500px) {
          .container { max-width: 500px }
        }
      }
    }
  `)
})

test('container can use variants', () => {
  const { components } = processPlugins(
    [container()],
    config({
      theme: {
        container: {
          screens: ['400px', '500px'],
        },
      },
      variants: {
        container: ['responsive', 'hover'],
      },
    })
  )

  expect(css(components)).toMatchCss(`
    @layer components {
      @variants responsive, hover {
        .container {
          width: 100%
        }
        @media (min-width: 400px) {
          .container {
            max-width: 400px
          }
        }
        @media (min-width: 500px) {
          .container {
            max-width: 500px
          }
        }
      }
    }
  `)
})
