package de.ivu.elect.sitzberechnung.osv.exchange.konflikt;

import de.ivu.elect.sitzberechnung.Kandidatur;
import de.ivu.elect.sitzberechnung.SitzberechnungEntity;
import de.ivu.wahl.result.ElectionAndCandidatesAndVotes;
import de.ivu.wahl.result.P3ListCandidate;
import de.ivu.wahl.result.drawlots.DecisionType;
import de.ivu.wahl.result.drawlots.DrawingLotsAlternative;

public class OSVLegacyKonfliktTypeMapper {

  public static DrawingLotsAlternative getOSVAlternative(OSVLegacyKonfliktType osvLegacyKonfliktType,
                                                         ElectionAndCandidatesAndVotes ecv, SitzberechnungEntity entitaet) {

    if (osvLegacyKonfliktType.isP3ListenEntscheidung()) {
      return ecv.getP3ListsMap().get(entitaet.getKey());
    } else if (osvLegacyKonfliktType.isP2ListenEntscheidung()) {
      return ecv.getP2ListsMap().get(entitaet.getKey());
    } else if (osvLegacyKonfliktType.isKandidatenEntscheidung()) {
      return getOSVLegacyCandidate(entitaet, ecv);
    }

    throw new IllegalStateException("Unbekannter OSVLegacyKonfliktType: " + osvLegacyKonfliktType);
  }

  public static OSVLegacyKonfliktType fromDecisionType(DecisionType decisionType) {
    return OSVLegacyKonfliktType.valueOf(decisionType.name());
  }

  public static DecisionType toDecisionType(OSVLegacyKonfliktType osvLegacyKonfliktType) {
    return DecisionType.valueOf(osvLegacyKonfliktType.name());
  }

  protected static DrawingLotsAlternative getOSVLegacyCandidate(SitzberechnungEntity entitaet, ElectionAndCandidatesAndVotes ecv) {
    Kandidatur kandidatur = (Kandidatur) entitaet;
    return new P3ListCandidate(ecv.getP3ListsMap().get(kandidatur.getGruppe().getKey()), ecv.getCandidateByExternalKey(kandidatur.getKandidat().getKey()));
  }
}