import fs from 'fs'
import path from 'path'
import postcss from 'postcss'
import tailwind from '../src/index'
import config from '../stubs/defaultConfig.stub.js'
import processPlugins from '../src/util/processPlugins'
import runInTempDirectory from '../jest/runInTempDirectory'

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

it('generates the right CSS in IE11 mode', () => {
  const inputPath = path.resolve(`${__dirname}/fixtures/tailwind-input.css`)
  const input = fs.readFileSync(inputPath, 'utf8')

  return postcss([tailwind({ ...config, target: 'ie11' })])
    .process(input, { from: inputPath })
    .then(result => {
      const expected = fs.readFileSync(
        path.resolve(`${__dirname}/fixtures/tailwind-output-ie11.css`),
        'utf8'
      )

      expect(result.css).toBe(expected)
    })
})

test('plugins can request the target for a specific plugin key', () => {
  const { utilities } = processPlugins(
    [
      function({ addUtilities, target }) {
        addUtilities({
          '.testA': {
            target: target('testPluginA'),
          },
        })
      },
      function({ addUtilities, target }) {
        addUtilities({
          '.testB': {
            target: target('testPluginB'),
          },
        })
      },
      function({ addUtilities, target }) {
        addUtilities({
          '.testC': {
            target: target('testPluginC'),
          },
        })
      },
    ],
    {
      ...config,
      target: [
        'ie11',
        {
          testPluginA: 'modern',
          testPluginB: 'relaxed',
        },
      ],
    }
  )

  expect(css(utilities)).toMatchCss(`
    @layer utilities {
      @variants {
        .testA {
          target: modern
        }
      }
    }
    @layer utilities {
      @variants {
        .testB {
          target: relaxed
        }
      }
    }
    @layer utilities {
      @variants {
        .testC {
          target: ie11
        }
      }
    }
  `)
})

test('browserslist target is translated to a target preset', () => {
  return runInTempDirectory(() => {
    fs.writeFileSync(
      path.resolve('./.browserslistrc'),
      `
      last 2 versions
      IE 11
      `
    )
    const { utilities } = processPlugins(
      [
        function({ addUtilities, target }) {
          addUtilities({
            '.test': {
              target: target('testPlugin'),
            },
          })
        },
      ],
      {
        ...config,
        target: 'browserslist',
      }
    )

    expect(css(utilities)).toMatchCss(`
      @layer utilities {
        @variants {
          .test {
            target: ie11
          }
        }
      }
    `)

    return Promise.resolve()
  })
})

test('browserslist target is translated to a target preset with overrides', () => {
  return runInTempDirectory(() => {
    fs.writeFileSync(
      path.resolve('./.browserslistrc'),
      `
      last 2 versions
      IE 11
      `
    )
    const { utilities } = processPlugins(
      [
        function({ addUtilities, target }) {
          addUtilities({
            '.testA': {
              target: target('testPluginA'),
            },
          })
        },
        function({ addUtilities, target }) {
          addUtilities({
            '.testB': {
              target: target('testPluginB'),
            },
          })
        },
        function({ addUtilities, target }) {
          addUtilities({
            '.testC': {
              target: target('testPluginC'),
            },
          })
        },
      ],
      {
        ...config,
        target: [
          'browserslist',
          {
            testPluginA: 'modern',
            testPluginB: 'relaxed',
          },
        ],
      }
    )

    expect(css(utilities)).toMatchCss(`
      @layer utilities {
        @variants {
          .testA {
            target: modern
          }
        }
      }
      @layer utilities {
        @variants {
          .testB {
            target: relaxed
          }
        }
      }
      @layer utilities {
          @variants {
          .testC {
            target: ie11
          }
        }
      }
    `)

    return Promise.resolve()
  })
})
