
package de.ivu.elect.dokumente.ergebnis;

import static org.apache.commons.lang3.StringUtils.capitalize;
import static org.apache.commons.lang3.StringUtils.lowerCase;
import static org.apache.commons.lang3.StringUtils.trimToEmpty;

import de.ivu.document.generator.template.BaseDocument;
import de.ivu.document.generator.template.annotations.DocumentSimpleField;
import de.ivu.elect.business.gebietsbaum.boundary.WahlverwaltungGebietInformation;
import de.ivu.elect.business.gebietsbaum.entity.Gebiet;

public class ErgebnisDocumentGebietDocument extends BaseDocument {

  private static final long serialVersionUID = 1L;

  @DocumentSimpleField("Art")
  public String art;

  @DocumentSimpleField("Art-Formatiert")
  public String artFormatiert;

  @DocumentSimpleField("Name")
  public String name;

  @DocumentSimpleField("Nummer")
  public String nummer;

  /**
   * Nummer in erwartetem Format, das je nach Wahlart/Gebietsart variiert, bspw. mit/ohne Kennung Bundesland im AGS.
   */
  @DocumentSimpleField("Nummer-Formatiert")
  public String nummerFormatiert;

  @DocumentSimpleField("Kuerzel")
  public String kuerzel;

  public ErgebnisDocumentGebietDocument() {
    this("", "", "", "", "", "");
  }

  public ErgebnisDocumentGebietDocument(WahlverwaltungGebietInformation gebietInformation) {
    this(gebietInformation.getArt(), gebietInformation.getName(), gebietInformation.getNummer(), gebietInformation.getNummer(), gebietInformation.getKuerzel());
  }

  public ErgebnisDocumentGebietDocument(Gebiet gebiet, String nummerFormatiert) {
    this(gebiet.getGebietsart() == null ? "" : gebiet.getGebietsart().getName(), gebiet.getGebietsart() == null ? "" : gebiet.getGebietsart().getTitel(), gebiet.getName(), gebiet.getNummer(),
        nummerFormatiert, gebiet.getKuerzel());
  }

  public ErgebnisDocumentGebietDocument(String art, String name, String nummer, String nummerFormatiert, String kuerzel) {
    this(art, capitalize(lowerCase(art)) /* SAMTGEMEINDE -> Samtgemeinde, naive Implementierung, sollte für > 90 % der Fälle korrekt sein... */, name, nummer, nummerFormatiert, kuerzel);
  }

  public ErgebnisDocumentGebietDocument(String art, String artFormatiert, String name, String nummer, String nummerFormatiert, String kuerzel) {
    super();

    this.art = trimToEmpty(art); // ELECT-13077
    this.artFormatiert = trimToEmpty(artFormatiert);

    this.name = trimToEmpty(name);

    this.nummer = trimToEmpty(nummer);
    this.nummerFormatiert = trimToEmpty(nummerFormatiert);

    this.kuerzel = trimToEmpty(kuerzel);
  }

  public ErgebnisDocumentGebietDocument copy() {
    return copy(new ErgebnisDocumentGebietDocument());
  }

  protected ErgebnisDocumentGebietDocument copy(ErgebnisDocumentGebietDocument target) {
    target.name = name;
    target.nummer = nummer;
    target.nummerFormatiert = nummerFormatiert;
    target.kuerzel = kuerzel;

    return target;
  }
}
