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

import java.util.Collections;
import java.util.Map;
import java.util.concurrent.atomic.AtomicLong;

import de.ivu.elect.business.gebietsbaum.entity.Gebiet;
import de.ivu.elect.business.gruppe.entity.Gruppe;
import de.ivu.elect.business.kandidatur.entity.Listenkandidatur;
import de.ivu.elect.business.wahlvorschlag.entity.ReferendumOption;

/**
 *  on 25.01.2016.
 */
public class ReadOnlyGruppenStimmen extends Stimmen {

  private static final long serialVersionUID = 1L;

  private final long ergebnisId;

  private final long gebietId;

  private final long gruppeId;

  private final Long referendumOptionId;

  private final Long listenkandidaturId;


  public ReadOnlyGruppenStimmen(long stimmenId, long ergebnisId, long gebietId, long gruppeId, Long referendumOptionId, long anzahl, Stimmenart stimmenart) {
    this(stimmenId, ergebnisId, gebietId, gruppeId, referendumOptionId, anzahl, stimmenart, null);
  }

  public ReadOnlyGruppenStimmen(long stimmenId, long ergebnisId, long gebietId, long gruppeId, Long referendumOptionId, long anzahl, Stimmenart stimmenart, Long listenkandidaturId) {
    this.ergebnisId = ergebnisId;
    this.gebietId = gebietId;
    this.gruppeId = gruppeId;
    this.referendumOptionId = referendumOptionId;
    this.listenkandidaturId = listenkandidaturId;
    this.id = stimmenId;
    this.anzahl = anzahl;
    this.stimmenart = stimmenart;
  }

  public void init(Map<Long, Ergebnis> ergebnisNachId, Map<Long, Gebiet> gebietNachId, Map<Long, Gruppe> gruppeNachId, Map<Long, ReferendumOption> refrendumOptionNachId) {
    init(ergebnisNachId, gebietNachId, gruppeNachId, refrendumOptionNachId, Collections.emptyMap());
  }

  public void init(Map<Long, Ergebnis> ergebnisNachId, Map<Long, Gebiet> gebietNachId, Map<Long, Gruppe> gruppeNachId,
                   Map<Long, ReferendumOption> refrendumOptionNachId, Map<Long, Listenkandidatur> listenkandidaturenNachId) {
    ergebnis = ergebnisNachId.get(ergebnisId);
    if (ergebnis == null) {
      throw new IllegalStateException("Ergebnis nicht gefunden: " + ergebnisNachId + ", habe: " + ergebnisNachId);
    }
    gebiet = gebietNachId.get(gebietId);
    if (gebiet == null) {
      throw new IllegalStateException("Gebiet nicht gefunden: " + gebietId + ", habe: " + gebietNachId);
    }
    gruppe = gruppeNachId.get(gruppeId);
    if (gruppe == null) {
      throw new IllegalStateException("Gruppe nicht gefunden: " + gruppeId + ", habe: " + gruppeNachId);
    }
    if (referendumOptionId != null) {
      referendumOption = refrendumOptionNachId.get(referendumOptionId);
      if (referendumOption == null) {
        throw new IllegalStateException("ReferendumOption Nicht gefunden: " + referendumOptionId + ", habe: " + refrendumOptionNachId);
      }
    }
    if (listenkandidaturId != null) {
      listenkandidatur = listenkandidaturenNachId.get(listenkandidaturId);
      if (listenkandidatur == null) {
        throw new IllegalStateException("Listenkandidatur Nicht gefunden: " + listenkandidaturId + ", habe: " + listenkandidaturenNachId);
      }
    }
  }

}
