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

import static de.ivu.elect.jee.entity.EntityUtil.castTo;

import java.io.Serializable;
import java.util.HashMap;
import java.util.LinkedHashMap;
import java.util.Map;

import javax.annotation.Nullable;
import javax.faces.application.FacesMessage.Severity;

import de.ivu.elect.business.kandidatur.entity.Direktkandidatur;
import de.ivu.elect.business.kandidatur.entity.Kandidatur;
import de.ivu.elect.business.kandidatur.entity.Listenkandidatur;
import de.ivu.elect.business.stimmzettel.entity.EntityAufStimmzettelDaten;
import de.ivu.elect.jee.entity.Entity;

public abstract class AbstractKumulierteStimmen implements KumulierteStimmen, Serializable {

  private static final long serialVersionUID = 1L;

  private final Map<Severity, Map<String, Object[]>> messagesPerSeverity;

  protected final EntityAufStimmzettelDaten entityAufStimmzettelDaten;

  protected final Long anzahlDirektstimmen;

  protected final Long anzahlListenstimmen;

  protected AbstractKumulierteStimmen(EntityAufStimmzettelDaten entityAufStimmzettelDaten, @Nullable Long anzahlDirektstimmen, @Nullable Long anzahlListenstimmen) {
    super();

    this.messagesPerSeverity = new HashMap<>();

    this.entityAufStimmzettelDaten = entityAufStimmzettelDaten;

    this.anzahlDirektstimmen = anzahlDirektstimmen;
    this.anzahlListenstimmen = anzahlListenstimmen;
  }

  public Map<Severity, Map<String, Object[]>> getMessagesPerSeverity() {
    return messagesPerSeverity;
  }

  public void addMessage(Severity severity, String msgKey, Object... params) {
    messagesPerSeverity.putIfAbsent(severity, new LinkedHashMap<>());
    messagesPerSeverity.get(severity).put(msgKey, params);
  }

  @Nullable
  public Long getStimmzettelPosition(Kandidatur kandidatur) {
    if (kandidatur != null) {
      if (kandidatur.isListenkandidatur()) {
        return castTo(kandidatur, Listenkandidatur.class).getStimmzettelPosition(entityAufStimmzettelDaten).getPosition();
      }

      if (kandidatur.isDirektkandidatur()) {
        return castTo(kandidatur, Direktkandidatur.class).getDirektkandidat().getStimmzettelPosition(entityAufStimmzettelDaten).getPosition();
      }
    }

    return null;
  }

  protected String getName(Kandidatur kandidatur) {
    return kandidatur.getStimmzettelPersonendaten(entityAufStimmzettelDaten).getName();
  }

  @Nullable
  public Long getAnzahlDirektstimmen() {
    return anzahlDirektstimmen;
  }

  @Nullable
  public Long getAnzahlListenstimmen() {
    return anzahlListenstimmen;
  }

  @Nullable
  public Long getAnzahlGesamtstimmen() {
    if (getAnzahlDirektstimmen() != null && getAnzahlListenstimmen() != null) {
      return getAnzahlDirektstimmen() + getAnzahlListenstimmen();
    }

    if (getAnzahlDirektstimmen() != null) {
      return getAnzahlDirektstimmen();
    }

    if (getAnzahlListenstimmen() != null) {
      return getAnzahlListenstimmen();
    }

    return null;
  }

  public void copyEntityAttributesToOtherEntity(Entity entity) {
    throw new UnsupportedOperationException();
  }

  public void setProtokollierteAttributeMitWerten(Map map) {
    throw new UnsupportedOperationException();
  }
}
