package de.ivu.elect.was.exchange.aufgabe;

import java.util.ArrayList;
import java.util.Collections;
import java.util.List;

import javax.annotation.Nullable;

import org.apache.commons.lang3.StringUtils;

import de.ivu.elect.business.aufgabe.entity.Aufgabe;
import de.ivu.elect.business.aufgabe.entity.AufgabeKommentar;
import de.ivu.elect.business.aufgabe.entity.AufgabenEinheitTyp;
import de.ivu.elect.business.aufgabe.entity.AufgabenErstellerTyp;
import de.ivu.elect.business.aufgabe.entity.AufgabenPrioritaet;
import de.ivu.elect.business.aufgabe.entity.AufgabenStatus;
import de.ivu.elect.business.aufgabe.entity.Aufgabentyp;
import de.ivu.elect.business.benutzerverwaltung.entity.Rolle;
import de.ivu.elect.interfaces.core.aufgabe.Aufgabenliste;

public class AufgabeMapper {
  public List<Aufgabe> mappe(@Nullable Aufgabenliste aufgabenliste) {
    if (aufgabenliste == null || aufgabenliste.getAufgaben() == null || aufgabenliste.getAufgaben().isEmpty()) {
      return Collections.emptyList();
    }

    List<Aufgabe> result = new ArrayList<>();

    for (de.ivu.elect.interfaces.core.aufgabe.Aufgabe von : aufgabenliste.getAufgaben()) {
      Aufgabe nach = new Aufgabe();
      mappe(von, nach);
      result.add(nach);

    }

    return result;
  }

  private void mappe(de.ivu.elect.interfaces.core.aufgabe.Aufgabe von, Aufgabe nach) {
    nach.setAufgabentyp(mappeAufgabentype(von.getAufgabentyp()));
    nach.setBearbeiterKennung(von.getBearbeiterKennung());
    nach.setBeschreibung(von.getBeschreibung());
    nach.setDauerAnzahl(von.getDauerAnzahl());
    nach.setDauerEinheit(mappeEinheit(von.getDauerEinheit()));
    nach.setErstellerKennung(von.getErstellerKennung());
    nach.setErstellerTyp(mappeErstellerTyp(von.getErstellerTyp()));
    nach.setErstelltAm(von.getErstelltAm());
    nach.setFaelligkeitAnzahl(von.getFaelligkeitAnzahl());
    nach.setFaelligkeitEinheit(mappeEinheit(von.getFaelligkeitEinheit()));
    nach.setFaelligkeitZeitpunkt(von.getFaelligkeitZeitpunkt());
    nach.setKategorie(von.getKategorie());
    nach.setLoesung(von.getLoesung());
    nach.setNummer(von.getNummer());
    nach.setPrioritaet(mappePrioritaet(von.getPrioritaet()));
    nach.setStatus(mappeStatus(von.getStatus()));
    nach.setTitel(von.getTitel());
    nach.setVerantwortlich(von.getVerantwortlich());
    nach.setRechtsgrundlage(von.getRechtsgrundlage());

    if (StringUtils.isNotBlank(von.getBearbeitet())) {
      Rolle bearbeitet = new Rolle();
      nach.setBearbeitet(bearbeitet);
      bearbeitet.setName(von.getBearbeitet());
    }
    if (StringUtils.isNotBlank(von.getSichtbar())) {
      Rolle sichtbar = new Rolle();
      nach.setSichtbar(sichtbar);
      sichtbar.setName(von.getSichtbar());
    }

    if (von.getKommentare() != null && !von.getKommentare().isEmpty()) {
      for (de.ivu.elect.interfaces.core.aufgabe.AufgabeKommentar komVon : von.getKommentare()) {
        AufgabeKommentar komNach = new AufgabeKommentar();
        nach.addAufgabeKommentarByAufgabe(komNach);
        mappe(komVon, komNach);
      }
    }

  }

  private void mappe(de.ivu.elect.interfaces.core.aufgabe.AufgabeKommentar von, AufgabeKommentar nach) {
    nach.setKommentar(von.getKommentar());
    nach.setAutor(von.getAutor());
    nach.setZeitpunkt(von.getZeitpunkt());
  }

  private AufgabenStatus mappeStatus(String status) {
    try {
      return AufgabenStatus.valueOf(status);
    } catch (Exception e) {
      // ignore
    }
    return AufgabenStatus.OHNE;
  }

  private AufgabenPrioritaet mappePrioritaet(String prioritaet) {
    try {
      return AufgabenPrioritaet.valueOf(prioritaet);
    } catch (Exception e) {
      // ignore
    }
    return AufgabenPrioritaet.OHNE;
  }

  private AufgabenErstellerTyp mappeErstellerTyp(String erstellerTyp) {
    try {
      return AufgabenErstellerTyp.valueOf(erstellerTyp);
    } catch (Exception e) {
      // ignore
    }
    return AufgabenErstellerTyp.ANWENDER;
  }

  private AufgabenEinheitTyp mappeEinheit(String dauerEinheit) {

    try {
      return AufgabenEinheitTyp.valueOf(dauerEinheit);
    } catch (Exception e) {
      // ignore
    }
    return AufgabenEinheitTyp.OHNE;
  }

  private Aufgabentyp mappeAufgabentype(String aufgabentyp) {
    try {
      return Aufgabentyp.valueOf(aufgabentyp);
    } catch (Exception e) {
      // ignore
    }
    return Aufgabentyp.INFORMATION;

  }

  public Aufgabenliste mappeAufgabenExtern(List<Aufgabe> aufgaben) {
    Aufgabenliste result = new Aufgabenliste();

    for (Aufgabe von : aufgaben) {
      de.ivu.elect.interfaces.core.aufgabe.Aufgabe nach = new de.ivu.elect.interfaces.core.aufgabe.Aufgabe();
      result.getAufgaben().add(nach);
      mappe(von, nach);
    }
    return result;
  }

  private void mappe(Aufgabe von, de.ivu.elect.interfaces.core.aufgabe.Aufgabe nach) {
    nach.setAufgabentyp(von.getAufgabentyp().name());
    nach.setBearbeiterKennung(von.getBearbeiterKennung());
    nach.setBeschreibung(von.getBeschreibung());
    nach.setDauerAnzahl(von.getDauerAnzahl());
    nach.setDauerEinheit(von.getDauerEinheit().name());
    nach.setErstellerKennung(von.getErstellerKennung());
    nach.setErstellerTyp(von.getErstellerTyp().name());
    nach.setErstelltAm(von.getErstelltAm());
    nach.setFaelligkeitAnzahl(von.getFaelligkeitAnzahl());
    nach.setFaelligkeitEinheit(von.getFaelligkeitEinheit().name());
    nach.setFaelligkeitZeitpunkt(von.getFaelligkeitZeitpunkt());
    nach.setKategorie(von.getKategorie());
    nach.setLoesung(von.getLoesung());
    nach.setNummer(von.getNummer());
    nach.setPrioritaet(von.getPrioritaet().name());
    nach.setStatus(von.getStatus().name());
    nach.setTitel(von.getTitel());
    nach.setVerantwortlich(von.getVerantwortlich());
    nach.setRechtsgrundlage(von.getRechtsgrundlage());
    if (von.getBearbeitet() != null) {
      nach.setBearbeitet(von.getBearbeitet().getName());
    }
    if (von.getSichtbar() != null) {
      nach.setSichtbar(von.getSichtbar().getName());
    }

    for (AufgabeKommentar komVon : von.getAufgabeKommentarsByAufgabe()) {
      de.ivu.elect.interfaces.core.aufgabe.AufgabeKommentar komNach = new de.ivu.elect.interfaces.core.aufgabe.AufgabeKommentar();
      nach.getKommentare().add(komNach);
      mappe(komVon, komNach);

    }

  }

  private void mappe(AufgabeKommentar von, de.ivu.elect.interfaces.core.aufgabe.AufgabeKommentar nach) {
    nach.setKommentar(von.getKommentar());
    nach.setAutor(von.getAutor());
    nach.setZeitpunkt(von.getZeitpunkt());
  }
}
