<script>
  import { onMount } from "svelte"
  import ESLintEditor from "../eslint/ESLintEditor.svelte"
  import {
    createLinter,
    preprocess,
    postprocess,
  } from "../eslint/scripts/linter.js"

  const linter = createLinter()

  let code = ""
  export let rules = {}
  export let fix = false
  export let language = "html"
  let time = ""
  $: options = {
    filename: language === "html" ? "example.svelte" : "example.js",
    preprocess,
    postprocess,
  }
  let showDiff = fix

  function onLintedResult(evt) {
    time = `${evt.detail.time}ms`
  }

  let slotRoot
  onMount(() => {
    code = slotRoot.textContent.trim()
  })
  $: blockHeight = `${Math.max(
    120,
    20 * (1 + code.split("\n").length) + 100,
  )}px`
</script>

<div class="eslint-code-block-default-content" bind:this={slotRoot}>
  <slot />
</div>

<div class="eslint-code-block-root" style:height={blockHeight}>
  <ESLintEditor
    {linter}
    bind:code
    config={{
      parser: language === "html" ? "svelte-eslint-parser" : undefined,
      parserOptions: {
        ecmaVersion: 2020,
        sourceType: "module",
      },
      rules,
      env: {
        browser: true,
        es2021: true,
      },
    }}
    {language}
    {options}
    on:result={onLintedResult}
    showDiff={showDiff && fix}
  />
  <div class="eslint-code-block-tools">
    {#if fix}
      <label>
        <input bind:checked={showDiff} type="checkbox" />
        Show Diff
      </label>
    {/if}
    <span style:margin-left="16px">{time}</span>
  </div>
</div>

<style>
  .eslint-code-block-default-content {
    display: none;
  }
  .eslint-code-block-root {
    height: 300px;
  }
  .eslint-code-block-tools {
    text-align: end;
  }
</style>