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

import de.ivu.elect.business.wahl.entity.Wahl;
import de.ivu.elect.util.FileUtil;

import javax.annotation.Nonnull;
import java.io.File;
import java.text.SimpleDateFormat;
import java.util.function.Supplier;

public enum InternetPraesentationZentraleAblagePfad {


  MANDANTNUMMER_WAHLTERMINNUMMER_DATUM_WAHLART_VERZEICHNIS {
    @Override
    public String getPfad(Supplier<String> ergebnisartPathMitWahlnameFilesystemKompatibel, Supplier<String> ergebnisart, Wahl wahl) {
      return getMandantNummer(wahl) + "_" + getWahlterminnummer(wahl) + "_" + getWahldatum(wahl) + "_" + getWahlart(wahl);
    }
  },
  MANDANTNUMMER_WAHLTERMINNUMMER_DATUM_WAHLART_BAUM {
    @Override
    public String getPfad(Supplier<String> ergebnisartPathMitWahlnameFilesystemKompatibel, Supplier<String> ergebnisart, Wahl wahl) {
      return getMandantNummer(wahl) + File.separator + getWahlterminnummer(wahl) + File.separator + getWahldatum(wahl) + File.separator + getWahlart(wahl);
    }
  },

  MANDANTNUMMER_WAHLTERMINNUMMER_DATUM_WAHLART_ERGEBNISART_VERZEICHNIS {
    @Override
    public String getPfad(Supplier<String> ergebnisartPathMitWahlnameFilesystemKompatibel, Supplier<String> ergebnisart, Wahl wahl) {
      return getMandantNummer(wahl) + "_" + getWahlterminnummer(wahl) + "_" + getWahldatum(wahl) + "_" + getWahlart(wahl) + "_" + FileUtil.normalizeFileName(ergebnisart.get());
    }
  },
  MANDANTNUMMER_WAHLTERMINNUMMER_DATUM_WAHLART_ERGEBNISART_BAUM {
    @Override
    public String getPfad(Supplier<String> ergebnisartPathMitWahlnameFilesystemKompatibel, Supplier<String> ergebnisart, Wahl wahl) {
      return getMandantNummer(wahl) + File.separator + getWahlterminnummer(wahl) + File.separator + getWahldatum(wahl) + File.separator + getWahlart(wahl) + File.separator + FileUtil.normalizeFileName(ergebnisart.get());
    }
  },


  PRIMAERSCHLUESSEL {
    @Override
    public String getPfad(Supplier<String> ergebnisartPathMitWahlnameFilesystemKompatibel, Supplier<String> ergebnisart, Wahl wahl) {
      return wahl.getId().toString();
    }
  },


  LEGACY {
    @Override
    public String getPfad(Supplier<String> ergebnisartPathMitWahlnameFilesystemKompatibel, Supplier<String> ergebnisart, Wahl wahl) {
      return ergebnisartPathMitWahlnameFilesystemKompatibel.get();
    }
  };

  private static String getWahlart(Wahl wahl) {
    return FileUtil.normalizeFileName(wahl.getWahlart().getName());
  }

  @Nonnull
  private static String getWahldatum(Wahl wahl) {
    return new SimpleDateFormat("yyyyMMdd").format(wahl.getWahldatum());
  }

  private static String getWahlterminnummer(Wahl wahl) {
    return FileUtil.normalizeFileName(wahl.getWahltermin().getNummer());
  }

  private static Long getMandantNummer(Wahl wahl) {
    return wahl.getMandant().getNummer();
  }


  public abstract String getPfad(Supplier<String> ergebnisartPathMitWahlnameFilesystemKompatibel, Supplier<String> ergebnisart, Wahl wahl);

}
