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

import java.util.Map;
import java.util.Optional;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import de.ivu.elect.business.gebietsbaum.entity.NlGebietCustomData;
import de.ivu.elect.business.gebietsbaum.entity.Wahldurchfuehrungsgebiet;
import de.ivu.elect.sitzberechnung.Gebiet;
import de.ivu.elect.sitzberechnung.Liste;
import de.ivu.elect.sitzberechnung.osv.exchange.OSVLegacySitzberechnungWahlart;
import de.ivu.elect.sitzberechnung.osv.exchange.OSVLegacySitzberechnungseingabe;
import de.ivu.elect.sitzberechnung.osv.exchange.Stel;
import de.ivu.elect.was.sitzberechnung.entity.ElectSitzberechnungGebiet;
import de.ivu.elect.was.sitzberechnung.entity.SitzberechnungStel;

public class ElectOSVLegacySitzberechnungseingabe implements OSVLegacySitzberechnungseingabe {

  private static final Logger LOG = LoggerFactory.getLogger(ElectOSVLegacySitzberechnungseingabe.class);

  private final OSVLegacySitzberechnungWahlart osvLegacySitzberechnungWahlart;

  private final Map<Liste, SitzberechnungStel> stelsFuerListen;

  private final int preferencialBarrierDenominator;

  private final int preferencialBarrierNumerator;

  private final Map<String, String> gebietsnummerFuerKeyMap;

  public ElectOSVLegacySitzberechnungseingabe(OSVLegacySitzberechnungWahlart osvLegacySitzberechnungWahlart, Map<Liste, SitzberechnungStel> stelsFuerListen,
                                              int preferencialBarrierNumerator, int preferencialBarrierDenominator, Map<String, String> gebietsnummerFuerKeyMap) {
    this.osvLegacySitzberechnungWahlart = osvLegacySitzberechnungWahlart;
    this.stelsFuerListen = stelsFuerListen;
    this.preferencialBarrierDenominator = preferencialBarrierDenominator;
    this.preferencialBarrierNumerator = preferencialBarrierNumerator;
    this.gebietsnummerFuerKeyMap = gebietsnummerFuerKeyMap;
  }

  @Override
  public int getVoteValueFuerGebiet(Gebiet gebiet) {
    if (OSVLegacySitzberechnungWahlart.EK.equals(
        osvLegacySitzberechnungWahlart) /* 99 %|| OSVLegacySitzberechnungWahlart.EP.equals(osvLegacySitzberechnungWahlart)*/) {
      Wahldurchfuehrungsgebiet wahldurchfuehrungsgebiet = ((ElectSitzberechnungGebiet) gebiet).getEntity();
      Long voteValue = wahldurchfuehrungsgebiet.getCustomData(NlGebietCustomData.class).getVoteValue();
      if (voteValue == null) {
        LOG.warn("Vote value fehlt: " + wahldurchfuehrungsgebiet);
        return 1; // fallback
      }
      return voteValue.intValue();
    }

    return 1;
  }

  @Override
  public OSVLegacySitzberechnungWahlart getOSVLegacySitzberechnungWahlart() {
    return osvLegacySitzberechnungWahlart;
  }

  @Override
  public Optional<Stel> getStelFuerListe(Liste liste) {
    return Optional.ofNullable(stelsFuerListen.get(liste));
  }

  @Override //ELECT-9883
  public int getPreferencialBarrierDenominator() {
    return preferencialBarrierDenominator;
  }

  @Override //ELECT-9883
  public int getPreferencialBarrierNumerator() {
    return preferencialBarrierNumerator;
  }

  @Override
  public String getGebietsnummerFuerKey(String gebietskey) {
    return gebietsnummerFuerKeyMap.get(gebietskey);
  }
}
