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

import java.io.Serializable;
import java.util.Calendar;
import java.util.Date;

public class WahlterminStichtagCalculator implements Serializable {

  private static final long serialVersionUID = 1L;

  public WahlterminStichtagCalculator() {
    super();
  }

  public static Date calculateTagVormWahltagByAnzahlTage(Wahltermin wahltermin, int anzahlTage) {
    if (wahltermin == null) {
      throw new IllegalArgumentException("Wahltermin darf nicht null sein");
    }

    return calculateTagVormStichtagByAnzahlTage(wahltermin.getWahldatum(), anzahlTage);
  }

  public static Date calculateTagVormWahltagByAnzahlMonate(Wahltermin wahltermin, int anzahlMonate) {
    if (wahltermin == null) {
      throw new IllegalArgumentException("Wahltermin darf nicht null sein");
    }

    return calculateTagVormStichtagByAnzahlMonate(wahltermin.getWahldatum(), anzahlMonate);
  }

  public static Date calculateTagVormStichtagByAnzahlTage(Date stichtag, int anzahlTage) {
    return calculateTagVormStichtag(stichtag, Calendar.DAY_OF_MONTH, anzahlTage);
  }

  public static Date calculateTagVormStichtagByAnzahlMonate(Date stichtag, int anzahlMonate) {
    return calculateTagVormStichtag(stichtag, Calendar.MONTH, anzahlMonate);
  }

  private static Date calculateTagVormStichtag(Date stichtag, int field, int anzahl) {
    if (stichtag == null) {
      throw new IllegalArgumentException("Stichtag darf nicht null sein");
    }

    Calendar calendar = Calendar.getInstance();
    calendar.setTime(stichtag);
    calendar.add(field, -anzahl);

    return calendar.getTime();
  }
}
