/*
 * https://github.com/morethanwords/tweb
 * Copyright (C) 2019-2021 Eduard Kuzmenko
 * https://github.com/morethanwords/tweb/blob/master/LICENSE
 */

import replaceContent from '../../helpers/dom/replaceContent';
import toHHMMSS from '../../helpers/string/toHHMMSS';
import CALL_STATE from '../../lib/calls/callState';
import {i18n, LangPackKey} from '../../lib/langPack';

export default class CallDescriptionElement {
  private container: HTMLElement;
  private state: CALL_STATE;
  private interval: number;

  constructor(private appendTo: HTMLElement) {
    this.container = document.createElement('div');
    this.container.classList.add('call-description');
  }

  public detach() {
    if(this.interval !== undefined) {
      clearInterval(this.interval);
      this.interval = undefined;
    }

    this.container.remove();
    this.state = undefined;
  }

  public update(instance: any) {
    const {connectionState} = instance;

    if(this.state === connectionState) {
      return;
    }

    this.state = connectionState;

    let element: HTMLElement;
    if(connectionState === CALL_STATE.CONNECTED) {
      element = document.createElement('span');
      element.classList.add('call-description-duration');

      const setTime = () => {
        element.innerText = toHHMMSS(instance.duration, true);
      };

      this.interval = window.setInterval(setTime, 1000);
      setTime();
    } else {
      let langPackKey: LangPackKey;
      switch(connectionState) {
        case CALL_STATE.PENDING:
          langPackKey = instance.isOutgoing ? 'Call.StatusRinging' : 'Call.StatusCalling';
          break;
        case CALL_STATE.REQUESTING:
          langPackKey = 'Call.StatusRequesting';
          break;
        case CALL_STATE.EXCHANGING_KEYS:
          langPackKey = 'VoipExchangingKeys';
          break;
        case CALL_STATE.CLOSED:
          langPackKey = instance.connectedAt !== undefined ? 'Call.StatusEnded' : 'Call.StatusFailed';
          break;
        default:
          langPackKey = 'Call.StatusConnecting';
          break;
      }

      element = i18n(langPackKey);
      if(this.interval !== undefined) {
        clearInterval(this.interval);
        this.interval = undefined;
      }
    }

    this.container.classList.toggle('has-duration', connectionState === CALL_STATE.CONNECTED);
    replaceContent(this.container, element);

    if(!this.container.parentElement) {
      this.appendTo.append(this.container);
    }
  }
}
