package de.ivu.elect.core.exchange.internet.mapper;

import de.ivu.elect.business.internet.entity.*;
import de.ivu.elect.interfaces.core.internet.InternetKonfiguration;
import de.ivu.elect.jee.entity.customdata.DefaultCustomData;

import java.util.ArrayList;
import java.util.Comparator;
import java.util.List;
import java.util.stream.Collectors;

public class InternetMapper {

  public InternetKonfiguration mappe(InternetKonfigurationExchangeObject internetKonfigurationExchangeObject) {
    var result = new InternetKonfiguration();
    List<InternetSeite> internetSeitenSortiert = new ArrayList<>(internetKonfigurationExchangeObject.getInternetSeiten());
    internetSeitenSortiert.sort(Comparator.comparing(InternetSeite::getPosition));

    for (var internetSeite : internetSeitenSortiert) {
      result.getInternetSeiten().add(mappe(internetSeite));
    }
    return result;
  }

  public InternetKonfigurationExchangeObject mappe(InternetKonfiguration internetKonfiguration) {
    return new InternetKonfigurationExchangeObject(internetKonfiguration.getInternetSeiten().stream().map(this::mappe)
        .collect(Collectors.toList()));
  }

  private de.ivu.elect.interfaces.core.internet.InternetSeite mappe(InternetSeite from) {
    var result = new de.ivu.elect.interfaces.core.internet.InternetSeite();
    result.setBeschreibung(from.getBeschreibung());
    result.setPosition(from.getPosition());
    result.setSeitenTypAsString(from.getSeitenTyp().name());
    result.setStatus(mappe(from.getStatus()));
    result.setTitel(from.getTitel());
    result.setCustomDataXml(from.getCustomDataXml());

    List<InternetWidget> internetWidgetsByInternetSeiteSorted = new ArrayList<>(from.getInternetWidgetsByInternetSeite());
    internetWidgetsByInternetSeiteSorted.sort(Comparator.comparing(InternetWidget::getZeile).thenComparing(InternetWidget::getPosition));

    for (var internetWidget : internetWidgetsByInternetSeiteSorted) {
      result.getInternetWidgets().add(mappe(internetWidget));
    }

    return result;
  }

  private de.ivu.elect.interfaces.core.internet.InternetWidget mappe(InternetWidget from) {
    var result = new de.ivu.elect.interfaces.core.internet.InternetWidget();

    result.setWidgetTypAsString(from.getWidgetTyp().name());
    result.setStatus(mappe(from.getStatus()));
    result.setBeschreibung(from.getSprungmarke());
    result.setBeschreibungLang(from.getBeschreibung());
    result.setZeile(from.getZeile());
    result.setPosition(from.getPosition());
    result.setBreiteAsString(from.getBreite().name());
    result.setIdentifier(from.getIdentifier()/*ELECT-16926*/);
    result.setCustomDataXml(from.getCustomDataXml());

    return result;
  }

  private InternetSeite mappe(de.ivu.elect.interfaces.core.internet.InternetSeite from) {
    var result = new InternetSeite(new DefaultCustomData());
    result.setBeschreibung(from.getBeschreibung());
    result.setPosition(from.getPosition());
    result.setSeitenTyp(InternetSeiteTyp.valueOf(from.getSeitenTypAsString()));
    result.setStatus(mappe(from.getStatus()));
    result.setTitel(from.getTitel());
    result.setCustomDataXml(from.getCustomDataXml());
    result.getCustomDataStorage().clearCustomDataCache();

    for (var internetWidget : from.getInternetWidgets()) {
      result.addInternetWidgetByInternetSeite(mappe(internetWidget));
    }

    return result;
  }

  private InternetWidget mappe(de.ivu.elect.interfaces.core.internet.InternetWidget from) {
    var result = new InternetWidget(new DefaultCustomData());
    result.setWidgetTyp(InternetWidgetTyp.valueOf(from.getWidgetTypAsString()));
    result.setStatus(mappe(from.getStatus()));
    result.setSprungmarke(from.getBeschreibung());
    result.setIdentifier(from.getIdentifier());
    result.setBeschreibung(from.getBeschreibungLang());
    result.setZeile(from.getZeile());
    result.setPosition(from.getPosition());
    result.setBreite(InternetWidgetBreite.valueOf(from.getBreiteAsString()));
    result.setCustomDataXml(from.getCustomDataXml());
    result.getCustomDataStorage().clearCustomDataCache();
    return result;
  }

  protected InternetSeiteStatus mappe(de.ivu.elect.interfaces.core.internet.InternetSeiteStatus internetSeiteStatus) {
    return InternetSeiteStatus.valueOf(internetSeiteStatus.name());
  }

  protected de.ivu.elect.interfaces.core.internet.InternetSeiteStatus mappe(InternetSeiteStatus internetSeiteStatus) {
    return de.ivu.elect.interfaces.core.internet.InternetSeiteStatus.valueOf(internetSeiteStatus.name());
  }

  protected InternetWidgetStatus mappe(de.ivu.elect.interfaces.core.internet.InternetWidgetStatus internetWidgetStatus) {
    return InternetWidgetStatus.valueOf(internetWidgetStatus.name());
  }

  protected de.ivu.elect.interfaces.core.internet.InternetWidgetStatus mappe(InternetWidgetStatus internetWidgetStatus) {
    return de.ivu.elect.interfaces.core.internet.InternetWidgetStatus.valueOf(internetWidgetStatus.name());
  }

}

