/*
 * Copyright (C) 2022 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 { EMPTY_STRING } from '@alfa-client/tech-shared';
import { Antragsteller, Vorgang, VorgangWithEingangResource } from '@alfa-client/vorgang-shared';
import { NavigationEnd } from '@angular/router';
import { createAntragsteller, createEingang, createVorgangResource, createVorgangWithEingangResource, } from 'libs/vorgang-shared/test/vorgang';
import { getAktenzeichenText, getEmpfaenger, isVorgangSearchRoute, VORGANG_KEIN_AKTENZEICHEN_ZUGEWIESEN, } from './vorgang-util';

describe('Vorgang Util', () => {
  describe('getAktenzeichenText', () => {
    it('should return Aktenzeichen if Vorgang does contain one', () => {
      const vorgang: Vorgang = createVorgangResource();

      const result: string = getAktenzeichenText(vorgang);

      expect(result).toEqual(vorgang.aktenzeichen);
    });

    it('should return default text if Vorgang does not contain a Aktenzeichen', () => {
      const vorgang: Vorgang = { ...createVorgangResource(), aktenzeichen: null };

      const result: string = getAktenzeichenText(vorgang);

      expect(result).toEqual(VORGANG_KEIN_AKTENZEICHEN_ZUGEWIESEN);
    });
  });

  describe('isSearchRoute', () => {
    it('should return true', () => {
      const searchNavigationEnd: NavigationEnd = new NavigationEnd(1, '/alle/search', '');

      const result: boolean = isVorgangSearchRoute(searchNavigationEnd);

      expect(result).toBeTruthy();
    });

    it('should return false', () => {
      const notSearchNavigationEnd: NavigationEnd = new NavigationEnd(1, '/alle', '');

      const result: boolean = isVorgangSearchRoute(notSearchNavigationEnd);

      expect(result).toBeFalsy();
    });
  });

  describe('getEmpfaenger', () => {
    it('should return nachname only if exists', () => {
      const antragsteller: Antragsteller = { ...createAntragsteller(), vorname: undefined };
      const vorgangWithEingangResource: VorgangWithEingangResource =
        createWithAntragsteller(antragsteller);

      const empfaenger: string = getEmpfaenger(vorgangWithEingangResource);

      expect(empfaenger).toEqual(antragsteller.nachname);
    });

    it('should return vorname only if exists', () => {
      const antragsteller: Antragsteller = { ...createAntragsteller(), nachname: undefined };
      const vorgangWithEingangResource: VorgangWithEingangResource =
        createWithAntragsteller(antragsteller);

      const empfaenger: string = getEmpfaenger(vorgangWithEingangResource);

      expect(empfaenger).toEqual(antragsteller.vorname);
    });

    it('should return name and vorname if exists', () => {
      const vorgangWithEingangResource: VorgangWithEingangResource =
        createVorgangWithEingangResource();

      const empfaenger: string = getEmpfaenger(vorgangWithEingangResource);

      expect(empfaenger).toEqual(
        `${vorgangWithEingangResource.eingang.antragsteller.vorname} ${vorgangWithEingangResource.eingang.antragsteller.nachname}`,
      );
    });

    it('should return empty string if none exists', () => {
      const antragsteller: Antragsteller = {
        ...createAntragsteller(),
        nachname: undefined,
        vorname: undefined,
      };
      const vorgangWithEingangResource: VorgangWithEingangResource =
        createWithAntragsteller(antragsteller);

      const empfaenger: string = getEmpfaenger(vorgangWithEingangResource);

      expect(empfaenger).toEqual(EMPTY_STRING);
    });

    function createWithAntragsteller(antragsteller: Antragsteller): VorgangWithEingangResource {
      return {
        ...createVorgangWithEingangResource(),
        eingang: { ...createEingang(), antragsteller },
      };
    }
  });
});