import { createOptions, getOptionsOrPrompt } from './utils/options';
import { filterTemplates } from './once-per-template';
import type { Templates } from './once-per-template';
import TEMPLATES from '../code/lib/cli/src/repro-templates';
import { outputFile } from 'fs-extra';

export const options = createOptions({
  output: {
    type: 'string',
    description: 'Where to put the index.html file?',
    required: true,
  },
  cadence: {
    type: 'string',
    description: 'What cadence are we running on (i.e. which templates should we use)?',
    values: ['ci', 'daily', 'weekly'] as const,
    required: true,
  },
});

function toPath(key: keyof Templates) {
  return key.replace('/', '-');
}

const createContent = (templates: Templates) => {
  return `
    <style>
      body {
        background: black;
        color: white;
      }
      #frame {
        position: absolute;
        left: 0;
        right: 0;
        width: 100vw;
        height: calc(100vh - 30px);
        bottom: 0;
        top: 30px;
        border: 0 none;
        margin: 0;
        padding: 0;
      }
      #select {
        position: absolute;
        top: 0;
        right: 100px;
        left: 10px;
        height: 30px;
        width: calc(100vw - 120px);
        background: black;
        color: white;
        border: 0 none;
        border-radius: 0;
        padding: 10px;
        box-sizing: border-box;
      }
      #open {
        position: absolute;
        top: 0;
        right: 0;
        width: 100px;
        height: 30px;
        background: black;
        color: white;
        border: 0 none;
        border-radius: 0;
        padding: 10px;
        box-sizing: border-box;
      }
    </style>

    <script>
      function handleClick() {
        var value = document.getElementById("select").value;
        window.location = document.location.origin + value;
      }
      function handleSelect() {
        var value = document.getElementById("select").value;
        var frame = document.getElementById("frame");

        sessionStorage.clear();
        localStorage.clear();

        frame.setAttribute('src', value);
      }
    </script>

    <button id="open" onclick="handleClick()">open</button>

    <select id="select" onchange="handleSelect()">
      ${Object.entries(templates)
        .map(([key, { name }]) => `<option value="/${toPath(key)}/">${name}</option>`)
        .join('\n')}
    </select>

    <iframe id="frame" src="/${toPath(Object.keys(templates)[0])}/" />
  `;
};

async function run() {
  const { cadence, output: outputPath } = await getOptionsOrPrompt(
    'yarn create-built-sandboxes-index',
    options
  );

  const templates = filterTemplates(TEMPLATES, cadence, 'build-storybook');
  const content = createContent(templates);

  await outputFile(outputPath, content);
}

if (require.main === module) {
  run().catch((err) => {
    console.error('Creating built sandboxes index failed');
    console.error(err);
    process.exit(1);
  });
}