
package de.ivu.elect.business.gebietsbaum.control;

import org.apache.commons.lang3.StringUtils;

import de.ivu.elect.business.gebietsbaum.boundary.GebietsartTemplate;
import de.ivu.elect.business.gebietsbaum.entity.Gebiet;

/**
 * @deprecated
 * @see WahlverwaltungGebietInformationResolver
 * @see WahlverwaltungGebietDescriptor
 */
@Deprecated
public abstract class AbstractCustomGebietInformationen implements CustomGebietInformationen {

  @Override
  public String getAmtlicherGemeindeschluessel(Gebiet untergeordnetesGebiet) {
    return fuehrendeNullen(2, getBundeslandNummer(untergeordnetesGebiet)) + " " + getAmtlicherGemeindeschluesselOhneLaenderkennziffer(untergeordnetesGebiet);
  }

  @Override
  public String getAmtlicherGemeindeschluesselOhneLaenderkennziffer(Gebiet untergeordnetesGebiet) {
    // das mit den 3 Nullen dürfte so nur für Großstädte stimmen, wie die Zahl für andere Gemeinden zu bestimmen ist bleibt offen
    // siehe http://de.wikipedia.org/wiki/Amtlicher_Gemeindeschl%C3%BCssel
    return fuehrendeNullen(3, getGemeindeNummer(untergeordnetesGebiet)) + " 000";
  }

  /**
   * @deprecated
   * @see ErgebnisExportGebietFormatter#formatGebietsreferenz
   */
  @Override
  @Deprecated
  public String getGemeindekennzifferFuerErgebnisdokument(Gebiet erfassungsgebiet) {
    // hier sollte eigentlich nur der Amtliche Gemeindeschlüssel stehen (im Ergebnisdokument steht: "Statistische Gemeindekennziffer, sechsstellig oder Länderkennziffer")
    // tatsächlich werden viele Städte in mehrere Wahlkreise unterteilt, sodass wir diese (so wollten es jedenfalls die Münchner) voranstellen, falls vorhanden.
    StringBuilder builder = new StringBuilder();

    if (!getWahlkreisNummer(erfassungsgebiet).isEmpty()) {
      builder.append(fuehrendeNullen(3, getWahlkreisNummer(erfassungsgebiet))).append(" ");
    }
    builder.append(getAmtlicherGemeindeschluesselOhneLaenderkennziffer(erfassungsgebiet));

    return builder.toString();
  }

  protected abstract String getBundeslandNummer(Gebiet untergeordnetesGebiet);

  @Override
  public String getGemeindeName(Gebiet untergeordnetesGebiet) {
    return getGemeinde(untergeordnetesGebiet).getName();
  }

  protected String getGemeindeNummer(Gebiet untergeordnetesGebiet) {
    return getGemeinde(untergeordnetesGebiet).getNummer();
  }

  protected Gebiet getGemeinde(Gebiet untergeordnetesGebiet) {
    return untergeordnetesGebiet.getWurzelgebiet();
  }

  @Override
  public String getWahlkreisNummerMitName(Gebiet untergeordnetesGebiet) {
    if (getWahlkreisName(untergeordnetesGebiet).isEmpty() || getWahlkreisNummer(untergeordnetesGebiet).isEmpty()) {
      return "";
    }

    return getWahlkreisNummer(untergeordnetesGebiet) + " " + getWahlkreisName(untergeordnetesGebiet);
  }

  @Override
  public String getWahlbezirkNummerMitName(Gebiet erfassungsgebiet) {
    return getWahlbezirkNummer(erfassungsgebiet) + " " + getWahlbezirkName(erfassungsgebiet);
  }

  @Override
  public String getWahlbezirkName(Gebiet erfassungsgebiet) {
    return erfassungsgebiet.getName();
  }

  @Override
  public String getWahlbezirkNummer(Gebiet erfassungsgebiet) {
    return erfassungsgebiet.getNummer();
  }

  protected static String fuehrendeNullen(int stellen, String s) {
    return StringUtils.leftPad(s, stellen, "0");
  }

  protected Gebiet getGebiet(Gebiet untergeordnetesGebiet, GebietsartTemplate... gebietsarten) {
    for (GebietsartTemplate gebietsart : gebietsarten) {
      Gebiet result = untergeordnetesGebiet.findeGebietMitGebietsartInUebergeordneterHierarchieOrReturnNull(gebietsart);
      if (result != null) {
        return result;
      }
    }
    return null;

  }

  protected String getNummerFuerArt(Gebiet untergeordnetesGebiet, GebietsartTemplate... gebietsarten) {
    return nummerNotNull(getGebiet(untergeordnetesGebiet, gebietsarten));
  }

  protected String getNameFuerArt(Gebiet untergeordnetesGebiet, GebietsartTemplate... gebietsarten) {
    return nameNotNull(getGebiet(untergeordnetesGebiet, gebietsarten));
  }

  private String nummerNotNull(Gebiet gebiet) {
    if (gebiet == null) {
      return "";
    }
    return gebiet.getNummer();
  }

  private String nameNotNull(Gebiet gebiet) {
    if (gebiet == null) {
      return "";
    }
    return gebiet.getName();
  }
}
