'use strict';

import { Directive, Input, HostListener, Renderer, ElementRef, OnInit} from '@angular/core';
import { Clipboard } from '../../../services/clipboard.service';

@Directive({
  selector: '[copy-button]'
})
export class CopyButton implements OnInit {
  $element: any;
  cancelScrollBinding: any;
  $redocEl: any;
  @Input() copyText: string;
  @Input() copyElement:any;
  @Input() hintElement:any;

  constructor(private renderer: Renderer, private element: ElementRef) {}

  ngOnInit () {
    if (!Clipboard.isSupported()) {
      this.element.nativeElement.parentNode.removeChild(this.element.nativeElement);
    }
    this.renderer.setElementAttribute(this.element.nativeElement, 'data-hint', 'Copy to Clipboard!');
  }

  @HostListener('click')
  onClick() {
    let copied;
    if (this.copyText) {
      const text = (typeof this.copyText === 'string')
        ? this.copyText
        : JSON.stringify(this.copyText, null, 2);
      copied = Clipboard.copyCustom(text);
    } else {
      copied = Clipboard.copyElement(this.copyElement);
    }

    if (copied) {
      this.renderer.setElementAttribute(this.element.nativeElement, 'data-hint', 'Copied!');
    } else {
      let hintElem = this.hintElement || this.copyElement;
      if (!hintElem) return;
      this.renderer.setElementAttribute(hintElem, 'data-hint', 'Press "ctrl + c" to copy');
      this.renderer.setElementClass(hintElem, 'hint--top', true);
      this.renderer.setElementClass(hintElem, 'hint--always', true);
    }
  }

  @HostListener('mouseleave')
  onLeave() {
    setTimeout(() => {
      this.renderer.setElementAttribute(this.element.nativeElement, 'data-hint', 'Copy to Clipboard');
    }, 500);
  }
}
