<script>
  import {
    Grid,
    Link,
    Row,
    Column,
    Content,
    Button,
    Select,
    SelectItem,
    InlineNotification,
    Tabs,
    Tab,
    TabContent,
  } from "carbon-components-svelte";
  import Code from "carbon-icons-svelte/lib/Code.svelte";
  import { page, metatags } from "@sveltech/routify";
  import { onMount } from "svelte";
  import { theme } from "../store";
  import ComponentApi from "../components/ComponentApi.svelte";
  import COMPONENT_API from "../COMPONENT_API.json";

  export let component = $page.title;
  export let components = [component];
  export let source = "";
  export let unreleased = false;
  export let unstable = false;

  metatags.title = $page.title;

  // TODO: `find` is not supported in IE
  $: api_components = components.map((i) =>
    COMPONENT_API.components.find((_) => _.moduleName === i)
  );
  $: multiple = api_components.length > 1;

  onMount(() => {
    const currentTheme = window.location.search.split("?theme=")[1];

    if (["white", "g10", "g80", "g90", "g100"].includes(currentTheme)) {
      theme.set(currentTheme);
    }
  });

  // TODO: [refactor] read from package.json value
  $: sourceCode = `https://github.com/carbon-design-system/carbon-components-svelte/tree/master/src/${
    source || `${$page.title}/${$page.title}.svelte`
  }`;
</script>

<Content data-components>
  <Grid>
    <Row>
      <Column>
        <h1>{component}</h1>
        <div class="bar">
          <Select
            id="select-theme"
            inline
            labelText="Theme"
            bind:selected="{$theme}"
          >
            <SelectItem value="white" text="White" />
            <SelectItem value="g10" text="Gray 10" />
            <SelectItem value="g80" text="Gray 80" />
            <SelectItem value="g90" text="Gray 90" />
            <SelectItem value="g100" text="Gray 100" />
          </Select>
          <Button
            kind="ghost"
            target="_blank"
            size="field"
            href="{sourceCode}"
            icon="{Code}"
          >
            Source code
          </Button>
        </div>
        {#if unreleased}
          <InlineNotification
            lowContrast
            kind="info"
            title="Unreleased"
            subtitle="This component has not been released yet."
            hideCloseButton
          />
        {/if}
        {#if unstable}
          <InlineNotification
            lowContrast
            kind="warning"
            title="Unstable component"
            subtitle="Expect the API of this component to change. Use at your own risk."
            hideCloseButton
          />
        {/if}
      </Column>
    </Row>

    <Row>
      <Column class="prose">
        <div class="toc mobile">
          <h5>Examples</h5>
          <slot name="aside" />
        </div>
        <slot />
        <h3 id="component-api">Component API</h3>
        <p>
          API documentation is
          <Link
            inline
            href="https://github.com/carbon-design-system/sveld"
            target="_blank"
          >
            auto-generated by sveld.
          </Link>
        </p>
      </Column>
    </Row>

    <Row>
      <Column class="prose" noGutter="{multiple}">
        {#if multiple}
          <Tabs class="override-tabs">
            {#each api_components as component (component.moduleName)}
              <Tab label="{component.moduleName}" />
            {/each}
            <div slot="content" style="padding-top: var(--cds-spacing-06)">
              {#each api_components as component (component.moduleName)}
                <TabContent>
                  <ComponentApi component="{component}" />
                </TabContent>
              {/each}
            </div>
          </Tabs>
        {:else}
          <ComponentApi component="{api_components[0]}" />
        {/if}
      </Column>
    </Row>
  </Grid>

  <Column class="table" xlg="{4}" lg="{5}">
    <div class="toc">
      <h5>Examples</h5>
      <slot name="aside" />
    </div>
  </Column>
</Content>

<style>
  .bar {
    display: flex;
    justify-content: space-between;
    margin-bottom: var(--cds-layout-02);
    border-bottom: 1px solid var(--cds-ui-03);
  }

  :global(.toc h5) {
    margin-top: var(--cds-spacing-06);
    margin-bottom: var(--cds-spacing-03);
  }

  .toc.mobile {
    display: none;
  }

  @media (max-width: 1056px) {
    .toc.mobile {
      display: block;
      margin-bottom: var(--cds-spacing-09);
    }
  }
</style>
