import { promises as fs } from 'fs'
import * as path from 'path'
import HtmlWebpackPlugin from 'html-webpack-plugin'
import type { Compiler } from 'webpack'

class HtmlWebpackEnhancementPlugin {
  apply(compiler: Compiler) {
    compiler.hooks.assetEmitted.tapPromise(
      'HtmlWebpackEnhancementPlugin',
      async (name, { source }) => {
        if (name.endsWith('.twig')) {
          const filePath = path.resolve(
            process.cwd(),
            'resources',
            'views',
            'assets',
            name,
          )

          await fs.writeFile(filePath, source.source())
        }
      },
    )

    compiler.hooks.compilation.tap(
      'HtmlWebpackEnhancementPlugin',
      (compilation) => {
        const hooks = HtmlWebpackPlugin.getHooks(compilation)

        hooks.alterAssetTags.tap('HtmlWebpackEnhancementPlugin', (data) => {
          data.assetTags.scripts = data.assetTags.scripts.map((tag) => {
            tag.attributes.crossorigin = 'anonymous'
            return tag
          })
          data.assetTags.styles = data.assetTags.styles.map((tag) => {
            tag.attributes.crossorigin = 'anonymous'
            return tag
          })

          return data
        })

        hooks.afterTemplateExecution.tap(
          'HtmlWebpackEnhancementPlugin',
          (data) => {
            if (
              compilation.compiler.options.mode === 'production' &&
              data.headTags.length > 0
            ) {
              if (
                data.headTags.some((tag) => tag.attributes.rel === 'stylesheet')
              ) {
                data.bodyTags = data.headTags.filter(
                  (tag) => tag.tagName !== 'script',
                )
              } else {
                data.bodyTags = data.headTags
              }

              data.headTags = []
            }

            return data
          },
        )
      },
    )
  }
}

export default HtmlWebpackEnhancementPlugin