
package de.ivu.elect.business.kandidatur.entity;

import java.util.List;

import javax.annotation.Nullable;

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

import de.ivu.elect.business.ergebnis.control.OSVLegacyErgebnisDatenParser;
import de.ivu.elect.business.person.entity.PersonendatenPK;
import de.ivu.elect.business.wahl.entity.Wahl;
import de.ivu.elect.sitzberechnung.osv.exchange.p22.MitVorzugGewaehlteKandidatur;
import de.ivu.elect.sitzberechnung.osv.exchange.p22.OSVLegacyErgebnisDaten;

public class NlWasListenkandidatur extends NlListenkandidatur {

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

  public NlWasListenkandidatur(Listenkandidatur listenkandidatur) {
    super(listenkandidatur);
  }

  public boolean isUeberVorzugGewaehlt() {
    Wahl wahl = getWahl();
    if (wahl == null) {
      LOG.warn("Wahl is null: " + getKandidatur());
      return false;
    }

    OSVLegacyErgebnisDaten osvLegacyErgebnisDaten = OSVLegacyErgebnisDatenParser.parseOSVLegacyErgebnisDaten(wahl);

    List<MitVorzugGewaehlteKandidatur> mitVorzugGewaehlteKandidaturen = osvLegacyErgebnisDaten.getMitVorzugGewaehlteKandidaturen();
    if (mitVorzugGewaehlteKandidaturen == null) {
      LOG.warn("mitVorzugGewaehlteKandidaturen is null: " + getKandidatur());
      return false;
    }

    return mitVorzugGewaehlteKandidaturen.stream().anyMatch(this::mitVorzugGewaehlteKandidaturPredicate);
  }

  private boolean mitVorzugGewaehlteKandidaturPredicate(MitVorzugGewaehlteKandidatur mitVorzugGewaehlteKandidatur) {
    if (mitVorzugGewaehlteKandidatur == null) {
      LOG.warn("mitVorzugGewaehlteKandidatur is null: " + getKandidatur());
      return false;
    }
    String kandidaturKey = mitVorzugGewaehlteKandidatur.getKandidaturKey();
    if (kandidaturKey == null) {
      LOG.warn("kandidaturKey is null: " + getKandidatur());
      return false;
    }
    PersonendatenPK pk = getPk();
    if (pk == null) {
      LOG.warn("pk is null: " + getKandidatur());
      return false;

    }
    return kandidaturKey.equals(pk.toString());
  }

  public Long getKleinsteWahlkreisNummer() {
    Listenkandidatur kandidatur = getKandidatur().castTo(Listenkandidatur.class).getEntity();
    Long result = bestimmeWahlkreisnummer(kandidatur);
    for (Listenkandidatur listenkandidatur : kandidatur.getIdentischVerknuepfteListenkandidaturen()) {
      Long nummerL = bestimmeWahlkreisnummer(listenkandidatur);
      if (result == null || nummerL != null && nummerL < result) {
        result = nummerL;
      }
    }
    if (result == null) {
      return 0L;
    }
    return result;
  }

  @Nullable
  private Long bestimmeWahlkreisnummer(Kandidatur k) {
    try {
      return Long.parseLong(k.getGebiet().getNummer());
    } catch (Exception e) {
      return null;
    }
  }
}
