/*
 * Copyright (C) 2024 Das Land Schleswig-Holstein vertreten durch den
 * Ministerpräsidenten des Landes Schleswig-Holstein
 * Staatskanzlei
 * Abteilung Digitalisierung und zentrales IT-Management der Landesregierung
 *
 * Lizenziert unter der EUPL, Version 1.2 oder - sobald
 * diese von der Europäischen Kommission genehmigt wurden -
 * Folgeversionen der EUPL ("Lizenz");
 * Sie dürfen dieses Werk ausschließlich gemäß
 * dieser Lizenz nutzen.
 * Eine Kopie der Lizenz finden Sie hier:
 *
 * https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12
 *
 * Sofern nicht durch anwendbare Rechtsvorschriften
 * gefordert oder in schriftlicher Form vereinbart, wird
 * die unter der Lizenz verbreitete Software "so wie sie
 * ist", OHNE JEGLICHE GEWÄHRLEISTUNG ODER BEDINGUNGEN -
 * ausdrücklich oder stillschweigend - verbreitet.
 * Die sprachspezifischen Genehmigungen und Beschränkungen
 * unter der Lizenz sind dem Lizenztext zu entnehmen.
 */
import { HttpMethod } from '@alfa-client/tech-shared';
import { Interception, RouteHandler, RouteMatcher } from 'cypress/types/net-stubbing';
import { OrganisationsEinheitE2E } from './organisationseinheit';

enum CypressTasks {
  DROP_COLLECTIONS = 'dropCollections',
  INIT_ORGANISATIONS_EINHEIT_DATA = 'initOrganisationsEinheitData',
}

enum MongoCollections {
  ORGANISATIONS_EINHEIT = 'organisationsEinheit',
  AGGREGATION_MAPPING = 'aggregationMapping',
}

const DOWNLOAD_FOLDER: string = 'cypress/downloads';

export function visitUrl(url: string): void {
  cy.visit(url);
}

export function scrollToWindowBottom(): void {
  cy.window().scrollTo('bottom');
}

export function intercept(method: string, url: string): Cypress.Chainable<null> {
  return cy.intercept(method, url);
}

export function interceptWithResponse(method: HttpMethod, url: RouteMatcher, response: RouteHandler): Cypress.Chainable<null> {
  return cy.intercept(method, url, response);
}

export function waitOfInterceptor(interceptor: string): Cypress.Chainable<Interception> {
  return cy.wait('@' + interceptor);
}

export function getTestElement(value: string) {
  return cy.getTestElement(value);
}

export function getElement(value: string) {
  return cy.get(value);
}

export function urlShouldInclude(text: string) {
  return cy.url().should('include', text);
}

export function urlShouldEndsWith(route: string): Cypress.Chainable<any> {
  return cy.url().should('match', new RegExp(`/${route}$`));
}

//TODO: anders loesen -> bad practice
export function wait(ms: number, reason = ''): void {
  cy.wait(ms);
  if (reason) {
    console.log(`Had to wait ${ms}ms because of: ${reason}`);
  }
}

//

export function reload(): void {
  cy.reload();
}

export function readFileFromDownloads(fileName: string): Cypress.Chainable<any> {
  return cy.readFile(`${DOWNLOAD_FOLDER}/${fileName}`, { timeout: 5000 });
}

export function pressTab(): void {
  cy.realPress('Tab');
}

//Config
export function getBaseUrl(): string {
  return Cypress.config().baseUrl as string;
}

//Env
export function getCypressEnv(value: string) {
  return Cypress.env(value);
}

export function initOrganisationsEinheitenData(data: OrganisationsEinheitE2E[]): void {
  cy.task(CypressTasks.DROP_COLLECTIONS, [MongoCollections.ORGANISATIONS_EINHEIT]);
  cy.task(CypressTasks.INIT_ORGANISATIONS_EINHEIT_DATA, { collection: MongoCollections.ORGANISATIONS_EINHEIT, data });
}

export function dropCollections() {
  cy.task(CypressTasks.DROP_COLLECTIONS, [MongoCollections.ORGANISATIONS_EINHEIT, MongoCollections.AGGREGATION_MAPPING]);
}