
package de.ivu.elect.was.exchange.internet.velocity;

import static java.util.Arrays.asList;

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

import javax.annotation.Nullable;

import de.ivu.elect.business.gruppe.entity.PolitischeGruppe;
import de.ivu.elect.business.gruppe.entity.SystemGruppe;

@Deprecated // ELECT-7126 alte Internetpräsentation
public class DetailTableBerechner implements Serializable {

  private static final long serialVersionUID = 1L;

  private final List<PolitischeGruppe> politischeGruppen;

  private final Map<PolitischeGruppe, Long> stimmenProGruppeAktuelleWahl;

  private final Map<PolitischeGruppe, Long> stimmenProGruppeAktuelleWahlNurUrnenwahl;

  private final Map<PolitischeGruppe, Long> stimmenProGruppeAktuelleWahlNurBriefwahl;

  private final Map<PolitischeGruppe, Long> stimmenProGruppeVorperiode;

  private final Long stimmenGueltigeVorperiode;

  private final Long anzahlGueltigerStimmenAktuelleWahl;

  private final Long anzahlGueltigerStimmenAktuelleWahlNurUrnenwahl;

  private final Long anzahlGueltigerStimmenAktuelleWahlNurBriefwahl;

  private final Long anzahlGueltigerStimmenVorperiode;

  private final Long anzahlUnGueltigerStimmenAktuelleWahl;

  private final Long anzahlUnGueltigerStimmenAktuelleWahlNurUrnenwahl;

  private final Long anzahlUnGueltigerStimmenAktuelleWahlNurBriefwahl;

  private final Long anzahlUnGueltigerStimmenVorperiode;

  private transient Map<PolitischeGruppe, PolitischeGruppeProzentGewinnVerlust> stimmen;

  private transient Map<SystemGruppe, SystemGruppeProzentGewinnVerlust> stimmenProGueltigUndUngueltig;

  public DetailTableBerechner(List<PolitischeGruppe> politischeGruppen, Map<PolitischeGruppe, Long> stimmenProGruppeAktuelleWahl, Map<PolitischeGruppe, Long> stimmenProGruppeAktuelleWahlNurUrnenwahl,
      Map<PolitischeGruppe, Long> stimmenProGruppeAktuelleWahlNurBriefwahl, Map<PolitischeGruppe, Long> stimmenProGruppeVorperiode, Long stimmenGueltigeVorperiode,
      Long anzahlGueltigerStimmenAktuelleWahl, Long anzahlGueltigerStimmenAktuelleWahlNurUrnenwahl, Long anzahlGueltigerStimmenAktuelleWahlNurBriefwahl, Long anzahlUnGueltigerStimmenAktuelleWahl,
      Long anzahlUnGueltigerStimmenAktuelleWahlNurUrnenwahl, Long anzahlUnGueltigerStimmenAktuelleWahlNurBriefwahl, Long anzahlGueltigerStimmenVorperiode, Long anzahlUnGueltigerStimmenVorperiode) {
    super();

    this.politischeGruppen = politischeGruppen;

    this.stimmenProGruppeAktuelleWahl = stimmenProGruppeAktuelleWahl;
    this.stimmenProGruppeAktuelleWahlNurUrnenwahl = stimmenProGruppeAktuelleWahlNurUrnenwahl;
    this.stimmenProGruppeAktuelleWahlNurBriefwahl = stimmenProGruppeAktuelleWahlNurBriefwahl;
    this.stimmenProGruppeVorperiode = stimmenProGruppeVorperiode;

    this.stimmenGueltigeVorperiode = stimmenGueltigeVorperiode;

    this.anzahlGueltigerStimmenAktuelleWahl = anzahlGueltigerStimmenAktuelleWahl;
    this.anzahlGueltigerStimmenAktuelleWahlNurUrnenwahl = anzahlGueltigerStimmenAktuelleWahlNurUrnenwahl;
    this.anzahlGueltigerStimmenAktuelleWahlNurBriefwahl = anzahlGueltigerStimmenAktuelleWahlNurBriefwahl;
    this.anzahlGueltigerStimmenVorperiode = anzahlGueltigerStimmenVorperiode;

    this.anzahlUnGueltigerStimmenAktuelleWahl = anzahlUnGueltigerStimmenAktuelleWahl;
    this.anzahlUnGueltigerStimmenAktuelleWahlNurUrnenwahl = anzahlUnGueltigerStimmenAktuelleWahlNurUrnenwahl;
    this.anzahlUnGueltigerStimmenAktuelleWahlNurBriefwahl = anzahlUnGueltigerStimmenAktuelleWahlNurBriefwahl;
    this.anzahlUnGueltigerStimmenVorperiode = anzahlUnGueltigerStimmenVorperiode;
  }

  public Map<PolitischeGruppe, PolitischeGruppeProzentGewinnVerlust> getStimmen() {
    if (stimmen == null) {
      stimmen = new PolitischeGruppeProzentGewinnVerlustBerechner(politischeGruppen, stimmenProGruppeAktuelleWahl, stimmenProGruppeAktuelleWahlNurUrnenwahl, stimmenProGruppeAktuelleWahlNurBriefwahl,
          stimmenProGruppeVorperiode, stimmenGueltigeVorperiode).getPolitischeGruppeProzentGewinnVerluste();
    }

    return stimmen;
  }

  public Map<SystemGruppe, SystemGruppeProzentGewinnVerlust> getStimmenProGueltigUndUngueltig() {
    if (stimmenProGueltigUndUngueltig == null) {
      Map<SystemGruppe, Long> stimmenProGueltigUndUngueltigAktuelleWahl = new HashMap<>();
      stimmenProGueltigUndUngueltigAktuelleWahl.put(SystemGruppe.GUELTIGE, anzahlGueltigerStimmenAktuelleWahl);
      stimmenProGueltigUndUngueltigAktuelleWahl.put(SystemGruppe.UNGUELTIGE, anzahlUnGueltigerStimmenAktuelleWahl);

      Map<SystemGruppe, Long> stimmenProGueltigUndUngueltigAktuelleWahlNurUrnenwahl = new HashMap<>();
      stimmenProGueltigUndUngueltigAktuelleWahlNurUrnenwahl.put(SystemGruppe.GUELTIGE, anzahlGueltigerStimmenAktuelleWahlNurUrnenwahl);
      stimmenProGueltigUndUngueltigAktuelleWahlNurUrnenwahl.put(SystemGruppe.UNGUELTIGE, anzahlUnGueltigerStimmenAktuelleWahlNurUrnenwahl);

      Map<SystemGruppe, Long> stimmenProGueltigUndUngueltigAktuelleWahlNurBriefwahl = new HashMap<>();
      stimmenProGueltigUndUngueltigAktuelleWahlNurBriefwahl.put(SystemGruppe.GUELTIGE, anzahlGueltigerStimmenAktuelleWahlNurBriefwahl);
      stimmenProGueltigUndUngueltigAktuelleWahlNurBriefwahl.put(SystemGruppe.UNGUELTIGE, anzahlUnGueltigerStimmenAktuelleWahlNurBriefwahl);

      Map<SystemGruppe, Long> stimmenProGueltigUndUngueltigVorperiode = new HashMap<>();
      stimmenProGueltigUndUngueltigVorperiode.put(SystemGruppe.GUELTIGE, anzahlGueltigerStimmenVorperiode);
      stimmenProGueltigUndUngueltigVorperiode.put(SystemGruppe.UNGUELTIGE, anzahlUnGueltigerStimmenVorperiode);

      stimmenProGueltigUndUngueltig = new GueltigeUndUngueltigeProzentGewinnVerlustBerechner(asList(SystemGruppe.GUELTIGE, SystemGruppe.UNGUELTIGE), stimmenProGueltigUndUngueltigAktuelleWahl,
          stimmenProGueltigUndUngueltigAktuelleWahlNurUrnenwahl, stimmenProGueltigUndUngueltigAktuelleWahlNurBriefwahl, stimmenProGueltigUndUngueltigVorperiode,
          summiere(anzahlGueltigerStimmenAktuelleWahl, anzahlUnGueltigerStimmenAktuelleWahl), summiere(anzahlGueltigerStimmenVorperiode, anzahlUnGueltigerStimmenVorperiode))
              .getGueltigUndUnGueltigGruppeProzentGewinnVerlust();
    }

    return stimmenProGueltigUndUngueltig;
  }

  @Nullable
  public static Long summiere(Long a1, Long a2) {
    if (a1 != null && a2 != null) {
      return a1 + a2;
    }

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

    return a2;
  }
}
