package de.ivu.elect.core.exchange.stimmen.csv.dynamic;

import java.util.Arrays;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import javax.annotation.Nullable;

import org.apache.commons.lang3.StringUtils;

import de.ivu.elect.business.wahl.entity.Wahldurchfuehrung;

public class DynamicStimmenSource {

  private final Wahldurchfuehrung wahldurchfuehrung;

  private final List<String> header;

  private final List<String> row;

  private final int zeile;

  private final Map<String, Integer> positionCache = new HashMap<>();

  private final Map<String, Object> cache = new HashMap<>();

  public DynamicStimmenSource(List<String> header, List<String> row, int zeile, Wahldurchfuehrung wahldurchfuehrung) {
    this.header = header;
    this.row = row;
    this.zeile = zeile;
    this.wahldurchfuehrung = wahldurchfuehrung;
    for (int i = 0; i < header.size(); i++) {
      positionCache.put(normalizeHeader(header.get(i)), i);
    }
  }

  private String normalizeHeader(String s) {
    if (StringUtils.isBlank(s)) {
      return s;
    }
    return s.toLowerCase().trim();
  }

  public Wahldurchfuehrung getWahldurchfuehrung() {
    return wahldurchfuehrung;
  }

  public int getZeile() {
    return zeile;
  }

  public List<String> getHeader() {
    return header;
  }

  public List<String> getRow() {
    return row;
  }

  @Nullable
  public String getValue(String... headers) {
    return Arrays.stream(headers).map(this::getHeader).filter(StringUtils::isNotBlank).findFirst().orElse(null);
  }

  @Nullable
  public String getHeader(String h) {
    Integer position = positionCache.get(normalizeHeader(h));
    if (position == null || row.size() < position) {
      return null;
    }
    return row.get(position);
  }

  public boolean isWahlNurDirektstimmen() {
    return wahldurchfuehrung.isWahlMitDirektkandidatengebieten() && !wahldurchfuehrung.isWahlMitListengebieten();
  }

  public boolean isWahlNurListenstimmen() {
    return !wahldurchfuehrung.isWahlMitDirektkandidatengebieten() && wahldurchfuehrung.isWahlMitListengebieten();
  }

  public boolean isWahlMitListenkandidaturStimmen() {
    return wahldurchfuehrung.isWahlMitListenkandidatenStimmen();
  }

  public Map<String, Object> getCache() {
    return cache;
  }

  @Override
  public String toString() {
    return "KomStimmenSource{" +
        "header=" + header +
        ", row=" + row +
        ", zeile=" + zeile +
        '}';
  }
}
