import { Directive, ElementRef, HostListener } from "@angular/core";

import { PlatformUtilsService } from "@bitwarden/common/platform/abstractions/platform-utils.service";

@Directive({
  selector: "[appSelectCopy]",
})
export class SelectCopyDirective {
  constructor(private el: ElementRef, private platformUtilsService: PlatformUtilsService) {}

  @HostListener("copy") onCopy() {
    if (window == null) {
      return;
    }
    let copyText = "";
    const selection = window.getSelection();
    for (let i = 0; i < selection.rangeCount; i++) {
      const range = selection.getRangeAt(i);
      const text = range.toString();

      // The selection should only contain one line of text. In some cases however, the
      // selection contains newlines and space characters from the indentation of following
      // sibling nodes. To avoid copying passwords containing trailing newlines and spaces
      // that aren't part of the password, the selection has to be trimmed.
      let stringEndPos = text.length;
      const newLinePos = text.search(/(?:\r\n|\r|\n)/);
      if (newLinePos > -1) {
        const otherPart = text.substr(newLinePos).trim();
        if (otherPart === "") {
          stringEndPos = newLinePos;
        }
      }
      copyText += text.substring(0, stringEndPos);
    }
    this.platformUtilsService.copyToClipboard(copyText, { window: window });
  }
}
