
package de.ivu.elect.was.sitzberechnung.control;

import de.ivu.elect.business.ergebnis.entity.Gewaehlt;
import de.ivu.elect.business.ergebnis.entity.GewaehltStatus;
import de.ivu.elect.business.ergebnis.entity.GewaehltStatusVergabe;
import de.ivu.elect.jee.entity.customdata.CustomData;
import de.ivu.elect.jee.entity.customdata.EmptyCustomData;
import de.ivu.elect.was.sitzberechnung.entity.AbstractElectSitzberechnungKandidatur;
import de.ivu.elect.was.sitzberechnung.entity.ElectSitzberechnungEntities;

public abstract class AbstractElectGewaehltMapper extends AbstractElectSitzberechnungMapper implements ElectGewaehltMapper {

  protected AbstractElectGewaehltMapper() {
    super();
  }

  @Override
  public de.ivu.elect.business.ergebnis.entity.Gewaehlt mapIntern(ElectSitzberechnungContext sitzberechnungContext, ElectSitzberechnungEntities sitzberechnungEntities,
                                                                  de.ivu.elect.sitzberechnung.Gewaehlt gewaehlt) {
    Gewaehlt result = new Gewaehlt(createCustomData());
    result.setKandidaturOhneUpdateBeziehung/*ELECT-16209*/(((AbstractElectSitzberechnungKandidatur<?>) gewaehlt.getKandidatur()).getEntity());
    result.setGewaehltStatus(mapGewaehltStatus(gewaehlt.getGewaehltStatus()));
    result.setGewaehltStatusVergabe(mapGewaehltStatusVergabe(gewaehlt.getGewaehltStatusVergabe())); // ELECT-16036
    result.setRang(gewaehlt.getRang());

    return result;
  }

  protected CustomData createCustomData() {
    return EmptyCustomData.INSTANCE;
  }

  protected GewaehltStatus mapGewaehltStatus(de.ivu.elect.sitzberechnung.GewaehltStatus gewaehltStatus) {
    try {
      return GewaehltStatus.valueOf(gewaehltStatus.name());
    } catch (Exception ex) {
      throw new IllegalStateException("GewaehltStatus unbekannt [gewaehltStatus = " + gewaehltStatus + "]", ex);
    }
  }

  protected GewaehltStatusVergabe mapGewaehltStatusVergabe(de.ivu.elect.sitzberechnung.GewaehltStatusVergabe gewaehltStatusVergabe) {
    try {
      return GewaehltStatusVergabe.valueOf(gewaehltStatusVergabe.name());
    } catch (Exception ex) {
      throw new IllegalStateException("GewaehltStatusVergabe unbekannt [gewaehltStatusVergabe = " + gewaehltStatusVergabe + "]", ex);
    }
  }
}
