
package de.ivu.elect.exchange.person.mapper;

import java.util.ArrayList;
import java.util.Collection;
import java.util.List;
import java.util.Map;

import de.ivu.elect.business.person.entity.Personendaten;
import de.ivu.elect.business.veranstaltung.entity.Veranstaltung;
import de.ivu.elect.exchange.EntityMapper;
import de.ivu.elect.interfaces.core.Person;
import de.ivu.elect.interfaces.core.Teilnahme;
import de.ivu.elect.interfaces.core.TeilnehmerRolle;
import de.ivu.elect.interfaces.core.TeilnehmerStatus;
import de.ivu.elect.interfaces.core.VeranstaltungReferenz;

public class TeilnahmeMapper {

  public TeilnahmeMapper() {
    super();
  }

  public void mappeTeilnahme(Person personExtern, Collection<de.ivu.elect.business.veranstaltung.entity.Teilnahme> internList) {
    for (de.ivu.elect.business.veranstaltung.entity.Teilnahme intern : internList) {
      Teilnahme extern = new Teilnahme();

      extern.setVeranstaltungReferenz(mappeVeranstaltungReferenz(intern.getVeranstaltung()));
      extern.setTeilnehmerRolle(map(intern.getTeilnehmerRolle()));
      extern.setTeilnehmerStatus(map(intern.getTeilnehmerStatus()));
      extern.setBemerkung(intern.getBemerkung());

      personExtern.getTeilnahmen().add(extern);
    }
  }

  public List<de.ivu.elect.business.veranstaltung.entity.Teilnahme> mappeTeilnahme(Person personExtern, Personendaten personIntern, Map<VeranstaltungReferenz, Veranstaltung> veranstaltungInternMap) {
    List<de.ivu.elect.business.veranstaltung.entity.Teilnahme> internList = new ArrayList<>();

    for (Teilnahme extern : personExtern.getTeilnahmen()) {
      de.ivu.elect.business.veranstaltung.entity.Teilnahme intern = new de.ivu.elect.business.veranstaltung.entity.Teilnahme();

      intern.setPersonendaten(personIntern);
      intern.setVeranstaltung(mappeVeranstaltungReferenz(extern.getVeranstaltungReferenz(), veranstaltungInternMap));
      intern.setTeilnehmerRolle(map(extern.getTeilnehmerRolle()));
      intern.setTeilnehmerStatus(map(extern.getTeilnehmerStatus()));
      intern.setBemerkung(extern.getBemerkung());

      internList.add(intern);
    }

    return internList;
  }

  private Veranstaltung mappeVeranstaltungReferenz(VeranstaltungReferenz veranstaltungReferenz, Map<VeranstaltungReferenz, Veranstaltung> internMap) {
    Veranstaltung intern = internMap.get(veranstaltungReferenz);

    if (intern == null) {
      throw new IllegalStateException("Veranstaltung referenziert, aber nicht in Datei enthalten: " + veranstaltungReferenz);
    }

    return intern;
  }

  de.ivu.elect.business.veranstaltung.entity.TeilnehmerStatus map(TeilnehmerStatus extern) {
    return de.ivu.elect.business.veranstaltung.entity.TeilnehmerStatus.valueOf(extern.name());
  }

  de.ivu.elect.business.veranstaltung.entity.TeilnehmerRolle map(TeilnehmerRolle extern) {
    return de.ivu.elect.business.veranstaltung.entity.TeilnehmerRolle.valueOf(extern.name());
  }

  TeilnehmerStatus map(de.ivu.elect.business.veranstaltung.entity.TeilnehmerStatus intern) {
    return TeilnehmerStatus.valueOf(intern.name());
  }

  TeilnehmerRolle map(de.ivu.elect.business.veranstaltung.entity.TeilnehmerRolle intern) {
    return TeilnehmerRolle.valueOf(intern.name());
  }

  private VeranstaltungReferenz mappeVeranstaltungReferenz(Veranstaltung intern) {
    VeranstaltungReferenz extern = new VeranstaltungReferenz();
    extern.setId(EntityMapper.createIdInDatei(intern));

    return extern;
  }
}
