import isURLValidator from 'validator/lib/isURL';
import isEmailValidator from 'validator/lib/isEmail';
import '../../types';

export function isURL(url: string): boolean {
  return isURLValidator(url || '', {
    protocols: ['http', 'https', 'git+https'],
    require_protocol: true,
    require_tld: false,
  });
}

export function isEmail(email: string): boolean {
  return isEmailValidator(email || '');
}

export function getRegistryURL(): string {
  // Don't add slash if it's not a sub directory
  return `${location.origin}${location.pathname === '/' ? '' : location.pathname}`;
}

export function extractFileName(url: string): string {
  return url.substring(url.lastIndexOf('/') + 1);
}

function blobToFile(blob: Blob, fileName: string): File {
  // eslint-disable-next-line @typescript-eslint/no-explicit-any
  const b: any = blob;
  b.lastModified = Date.now();
  b.name = fileName;
  return b as File;
}

export function downloadFile(fileStream: Blob, fileName: string): void {
  let file: File;
  // File constructor is not supported by Edge
  // https://developer.mozilla.org/en-US/docs/Web/API/File#Browser_compatibility
  // @ts-ignore. Please see: https://github.com/microsoft/TypeScript/issues/33792
  if (navigator.msSaveBlob) {
    // Detect if Edge
    file = blobToFile(new Blob([fileStream], { type: 'application/octet-stream' }), fileName);
  } else {
    file = new File([fileStream], fileName, { type: 'application/octet-stream', lastModified: Date.now() });
  }

  const objectURL = URL.createObjectURL(file);
  const fileLink = document.createElement('a');
  fileLink.href = objectURL;
  fileLink.download = fileName;

  // Without appending to an HTML Element, download dialog does not show up on Firefox
  // https://github.com/verdaccio/ui/issues/119
  document.documentElement.appendChild(fileLink);
  fileLink.click();
  // firefox requires remove the object url
  setTimeout(() => {
    URL.revokeObjectURL(objectURL);
    document.documentElement.removeChild(fileLink);
  }, 150);
}
