
package de.ivu.elect.was.exchange.ergebnis;

import static org.apache.commons.lang3.StringUtils.containsIgnoreCase;

import java.util.List;
import java.util.function.Function;

import de.ivu.elect.business.ergebnis.boundary.ErgebnisdokumentTyp;
import de.ivu.elect.business.exchange.control.FileKonfiguration;
import de.ivu.elect.business.gebietsbaum.boundary.WahlverwaltungGebietInformation;
import de.ivu.elect.business.gebietsbaum.entity.Gebiet;
import de.ivu.elect.business.gebietsbaum.entity.Wahldurchfuehrungsgebiet;
import de.ivu.elect.exchange.ExportMapper;

public interface ErgebnisdokumentTypDocumentExportMapper<T, C> extends ExportMapper<T, C> {

  String ERFASSUNGSGEBIET_GEBIETSREFERENZ_DEFAULT_FORMAT = "%1$s %2$s %3$s";

  ErgebnisdokumentTyp getErgebnisdokumentTyp();

  default WahlverwaltungGebietInformation createDocumentKeyAuswertungsgebiet(WahlverwaltungGebietInformation auswertungsgebietInformation, List<Wahldurchfuehrungsgebiet> auswertungsgebiete,
      Function<Gebiet, String> auswertungsgebietSuffixFct) {
    return auswertungsgebietInformation;
  }

  default WahlverwaltungGebietInformation createDocumentKeyStimmzettelgebiet(WahlverwaltungGebietInformation stimmzettelgebietInformation, List<Wahldurchfuehrungsgebiet> auswertungsgebiete,
      Function<Gebiet, String> auswertungsgebietSuffixFct) {
    return new WahlverwaltungGebietInformation(stimmzettelgebietInformation) {

      @Override
      protected String createSimpleFileNameOrFallback(FileKonfiguration fileKonfiguration) {
        String result = super.createSimpleFileNameOrFallback(fileKonfiguration);

        if (auswertungsgebiete.size() == 1) {
          Wahldurchfuehrungsgebiet auswertungsgebiet = auswertungsgebiete.get(0);

          boolean auswertungsgebietSuffixRequired = auswertungsgebiet != null && !auswertungsgebiet.isWurzelgebiet()
              && !stimmzettelgebietInformation.getGebiet().filter(stimmzettelgebiet -> stimmzettelgebiet.isInGebietshierarchieUntergeordnetesGebietVon(auswertungsgebiet)).isPresent();

          if (auswertungsgebietSuffixRequired) {
            String auswertungsgebietSuffix = auswertungsgebietSuffixFct.apply(auswertungsgebiet);

            if (!containsIgnoreCase(result, auswertungsgebietSuffix)) {
              return result + "-" + auswertungsgebietSuffix;
            }
          }
        }

        return result;
      }
    };
  }

  default WahlverwaltungGebietInformation createDocumentKeyGemeinde(WahlverwaltungGebietInformation gemeindeInformation, List<Wahldurchfuehrungsgebiet> auswertungsgebiete,
      Function<Gebiet, String> auswertungsgebietSuffixFct) {
    return gemeindeInformation;
  }
}
