import * as React from "react";

export enum ClickableTag {
  Tag_span,
  Tag_h1,
}

type IProps = {
  value: string;
  tag: ClickableTag;
};

type IState = {
  tooltipVisible: boolean;
};

export class CopyableText extends React.Component<IProps, IState> {
  public static defaultProps = {
    //Default span to prevent destroying current clickables
    tag: ClickableTag.Tag_span,
  };

  constructor(props: IProps) {
    super(props);

    this.copy = this.copy.bind(this);
    this.tooltipClasses = this.tooltipClasses.bind(this);
    this.textClasses = this.textClasses.bind(this);

    this.state = {
      tooltipVisible: false,
    };
  }

  copy(): void {
    const copyText = document.createElement("textarea");
    copyText.value = this.props.value;
    document.body.appendChild(copyText);
    copyText.select();
    copyText.setSelectionRange(0, 1e10);
    document.execCommand("copy");
    document.body.removeChild(copyText);
    this.setState({ tooltipVisible: true });
    setTimeout(() => this.setState({ tooltipVisible: false }), 1000);
  }

  tooltipClasses(): string {
    let classes = "copy_tooltip_text";
    if (this.state.tooltipVisible) {
      classes += " copy_tooltip_text_visible";
    }

    return classes;
  }

  textClasses(): string {
    let classes = "copy_tooltip noselect text";
    if (this.state.tooltipVisible) {
      classes += " copy_tooltip_copied";
    }

    return classes;
  }

  render(): React.ReactNode {
    switch (this.props.tag) {
      case ClickableTag.Tag_h1:
        return (
          <h1 className={this.textClasses()} onClick={this.copy}>
            {this.props.value}
            <span className={this.tooltipClasses()}>Copied!</span>
          </h1>
        );
      case ClickableTag.Tag_span:
        return (
          <span className={this.textClasses()} onClick={this.copy}>
            <b>{this.props.value}</b>
            <span className={this.tooltipClasses()}>Copied!</span>
          </span>
        );
    }
  }
}
