/**
 * @module skottie-text-sampler-sk
 * @description <h2><code>skottie-text-sampler-sk</code></h2>
 *
 * <p>
 *   A component with a list of text samples in multiple languages
 *   to try on text animations.
 * </p>
 *
 *
 */
import { html, TemplateResult } from 'lit-html';
import { define } from '../../../elements-sk/modules/define';
import { ElementSk } from '../../../infra-sk/modules/ElementSk';
import '../skottie-button-sk';
import { FontType } from '../skottie-font-selector-sk/skottie-font-selector-sk';

type SampleText = {
  id: string;
  language: string;
  text: string;
  font: FontType;
};

const samples: SampleText[] = [
  {
    id: '1',
    language: 'English',
    text: 'Hope you had a great day, dude',
    font: {
      fName: 'Roboto-Regular',
      fStyle: 'Regular',
      fFamily: 'Roboto',
    },
  },
  {
    id: '2',
    language: 'Devanagari',
    text: 'आशा है कि आपका दिन अच्छा रहा, दोस्त',
    font: {
      fName: 'NotoSerifDevanagari-Regular',
      fStyle: 'Regular',
      fFamily: 'NotoSerifDevanagari',
    },
  },
  {
    id: '3',
    language: 'Chinese simplified',
    text: '希望你今天过得愉快，伙计',
    font: {
      fName: 'NotoSansSC-Regular',
      fStyle: 'Regular',
      fFamily: 'NotoSansSC',
    },
  },
  {
    id: '4',
    language: 'Korean',
    text: '좋은 하루 보내길 바래, 친구',
    font: {
      fName: 'NotoSansKR-Regular',
      fStyle: 'Regular',
      fFamily: 'NotoSansKR',
    },
  },
  {
    id: '5',
    language: 'Latin characters',
    text: 'ñãõáéíóúàèìòùöüãõçøâçêëîïôùûüÿ',
    font: {
      fName: 'Roboto-Regular',
      fStyle: 'Regular',
      fFamily: 'Roboto',
    },
  },
];

export interface SkTextSampleEventDetail {
  text: string;
  font: FontType;
}

export class SkottieTextSamplerSk extends ElementSk {
  private static template = (ele: SkottieTextSamplerSk) => html`
    <div class="wrapper">${ele.renderSamples()}</div>
  `;

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

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

  private renderSample(
    ele: SkottieTextSamplerSk,
    sample: SampleText
  ): TemplateResult {
    return html`
      <skottie-button-sk
        @select=${() => {
          ele.updateSample(sample);
        }}
        type="outline"
        .content=${sample.language}
        .classes=${['sample__button']}>
      </skottie-button-sk>
    `;
  }

  private renderSamples(): TemplateResult[] {
    return samples.map((sample: SampleText) => this.renderSample(this, sample));
  }

  private updateSample(sample: SampleText): void {
    const { text, font } = sample;
    // This event handler replaces the animation in place
    // instead of creating a copy of the lottie animation.
    // If there is a reason why it should create a copy, this can be updated.
    if (text) {
      this.dispatchEvent(
        new CustomEvent<SkTextSampleEventDetail>('select-text', {
          detail: {
            text: text,
            font: font,
          },
        })
      );
    }
  }
}

define('skottie-text-sampler-sk', SkottieTextSamplerSk);
