import { interopDefault } from './interop-default'
import { getLinkAndScriptTags } from './get-css-inlined-link-tags'
import type { AppRenderContext } from './app-render'
import { getAssetQueryString } from './get-asset-query-string'
import { encodeURIPath } from '../../shared/lib/encode-uri-path'
import { renderCssResource } from './render-css-resource'

export async function createComponentStylesAndScripts({
  filePath,
  getComponent,
  injectedCSS,
  injectedJS,
  ctx,
}: {
  filePath: string
  getComponent: () => any
  injectedCSS: Set<string>
  injectedJS: Set<string>
  ctx: AppRenderContext
}): Promise<[React.ComponentType<any>, React.ReactNode, React.ReactNode]> {
  const {
    componentMod: { createElement },
  } = ctx
  const { styles: entryCssFiles, scripts: jsHrefs } = getLinkAndScriptTags(
    filePath,
    injectedCSS,
    injectedJS
  )

  const styles = renderCssResource(entryCssFiles, ctx)

  const scripts = jsHrefs
    ? jsHrefs.map((href, index) =>
        createElement('script', {
          src: `${ctx.assetPrefix}/_next/${encodeURIPath(href)}${getAssetQueryString(ctx, true)}`,
          async: true,
          key: `script-${index}`,
        })
      )
    : null

  const Comp = interopDefault(await getComponent())

  return [Comp, styles, scripts]
}
