/**
 * @module skottie-exporter-sk
 * @description <h2><code>skottie-exporter-sk</code></h2>
 *
 * <p>
 *   A modal component that manages all exporting options for Skottie animations.
 * </p>
 *
 */
import { html, TemplateResult } from 'lit-html';
import { define } from '../../../elements-sk/modules/define';
import { ElementSk } from '../../../infra-sk/modules/ElementSk';
import '../skottie-dropdown-sk';
import './skottie-exporter-gif-sk';
import './skottie-exporter-webm-sk';
import './skottie-exporter-png-sk';
import { SkottiePlayerSk } from '../skottie-player-sk/skottie-player-sk';

export type ExportType = 'none' | 'gif' | 'png' | 'webM';

export class SkottieExporterSk extends ElementSk {
  private _exportType: ExportType = 'none';

  private _skottiePlayer: SkottiePlayerSk | null = null;

  private _downloadFileName: string = '';

  private static template = (ele: SkottieExporterSk) => {
    if (ele._exportType === 'none') {
      return null;
    }
    return html`
      <aside class="wrapper">
        <div class="background"></div>
        <div class="main">${ele.buildExporter(ele)}</div>
      </aside>
    `;
  };

  constructor() {
    super(SkottieExporterSk.template);
  }

  connectedCallback(): void {
    super.connectedCallback();
    this._render();
  }

  disconnectedCallback(): void {
    super.disconnectedCallback();
  }

  private buildTitle(text: string): TemplateResult {
    return html`
      <div class="header">
        <h2 class="header__text">${text}</h2>
      </div>
    `;
  }

  private buildGifExporter(ele: SkottieExporterSk): TemplateResult {
    return html`
      <div class="modal">
        ${this.buildTitle('Export GIF')}
        <skottie-exporter-gif-sk
          @cancel=${ele.cancel}
          .skottiePlayer=${ele._skottiePlayer}
          .downloadFileName=${this._downloadFileName}></skottie-exporter-gif-sk>
      </div>
    `;
  }

  private buildWebMExporter(ele: SkottieExporterSk): TemplateResult {
    return html`
      <div class="modal">
        ${this.buildTitle('Export WebM')}
        <skottie-exporter-webm-sk
          @cancel=${ele.cancel}
          .skottiePlayer=${ele._skottiePlayer}
          .downloadFileName=${this._downloadFileName}>
        </skottie-exporter-webm-sk>
      </div>
    `;
  }

  private buildPNGExporter(ele: SkottieExporterSk): TemplateResult {
    return html`
      <div class="modal">
        ${this.buildTitle('Export PNG Sequence')}
        <skottie-exporter-png-sk
          @cancel=${ele.cancel}
          .skottiePlayer=${ele._skottiePlayer}
          .downloadFileName=${this._downloadFileName}></skottie-exporter-png-sk>
      </div>
    `;
  }

  private buildExporter(ele: SkottieExporterSk): TemplateResult | null {
    if (this._exportType === 'gif') {
      return this.buildGifExporter(ele);
    }
    if (this._exportType === 'webM') {
      return this.buildWebMExporter(ele);
    }
    if (this._exportType === 'png') {
      return this.buildPNGExporter(ele);
    }
    return null;
  }

  export(type: ExportType, skottiePlayer: SkottiePlayerSk): void {
    this._skottiePlayer = skottiePlayer;
    switch (type) {
      case 'gif':
      case 'webM':
      case 'png':
        this.exportType = type;
        break;
      default:
        this.exportType = 'none';
        break;
    }
  }

  private cancel(): void {
    this.exportType = 'none';
  }

  set exportType(value: ExportType) {
    this._exportType = value;
    this.dispatchEvent(new CustomEvent('start'));
    this._render();
  }

  set downloadFileName(value: string) {
    this._downloadFileName = value;
  }
}

define('skottie-exporter-sk', SkottieExporterSk);
