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

import de.ivu.elect.business.kandidatur.entity.Kandidatur;
import de.ivu.elect.business.stimmzettel.entity.EntityAufStimmzettelDaten;

public enum StimmzettelFormatterKandidaturFormatDarstellung {

  STANDARD_INFOTEXT_INLINE_EXCLUDING_WOHNANGABEN {

    @Override
    public boolean isInfotextNewlineRequired() {
      return false;
    }

    @Override
    public String getNamen(EntityAufStimmzettelDaten entityAufStimmzettelDaten, Kandidatur kandidatur) {
      return formatNamen(entityAufStimmzettelDaten, kandidatur);
    }

    @Override
    public String getPseudonyme(EntityAufStimmzettelDaten entityAufStimmzettelDaten, Kandidatur kandidatur) {
      return formatPseudonyme(entityAufStimmzettelDaten, kandidatur);
    }

    @Override
    public boolean isInfotextOrtRendered() {
      return false;
    }

    @Override
    public boolean isInfotextOrtsteilRendered() {
      return false;
    }
  },

  STANDARD_INFOTEXT_INLINE_INCLUDING_ORTSTEIL { // ELECTKOM-709

    @Override
    public boolean isInfotextNewlineRequired() {
      return false;
    }

    @Override
    public String getNamen(EntityAufStimmzettelDaten entityAufStimmzettelDaten, Kandidatur kandidatur) {
      return formatNamen(entityAufStimmzettelDaten, kandidatur);
    }

    @Override
    public String getPseudonyme(EntityAufStimmzettelDaten entityAufStimmzettelDaten, Kandidatur kandidatur) {
      return formatPseudonyme(entityAufStimmzettelDaten, kandidatur);
    }

    @Override
    public boolean isInfotextOrtRendered() {
      return false;
    }

    @Override
    public boolean isInfotextOrtsteilRendered() {
      return true;
    }
  },

  STANDARD_INFOTEXT_INLINE_INCLUDING_ORT { // ELECTKOM-709

    @Override
    public boolean isInfotextNewlineRequired() {
      return false;
    }

    @Override
    public String getNamen(EntityAufStimmzettelDaten entityAufStimmzettelDaten, Kandidatur kandidatur) {
      return formatNamen(entityAufStimmzettelDaten, kandidatur);
    }

    @Override
    public String getPseudonyme(EntityAufStimmzettelDaten entityAufStimmzettelDaten, Kandidatur kandidatur) {
      return formatPseudonyme(entityAufStimmzettelDaten, kandidatur);
    }

    @Override
    public boolean isInfotextOrtRendered() {
      return true;
    }

    @Override
    public boolean isInfotextOrtsteilRendered() {
      return false;
    }
  },

  STANDARD_INFOTEXT_INLINE_INCLUDING_ORT_ORTSTEIL { // ELECTKOM-709

    @Override
    public boolean isInfotextNewlineRequired() {
      return false;
    }

    @Override
    public String getNamen(EntityAufStimmzettelDaten entityAufStimmzettelDaten, Kandidatur kandidatur) {
      return formatNamen(entityAufStimmzettelDaten, kandidatur);
    }

    @Override
    public String getPseudonyme(EntityAufStimmzettelDaten entityAufStimmzettelDaten, Kandidatur kandidatur) {
      return formatPseudonyme(entityAufStimmzettelDaten, kandidatur);
    }

    @Override
    public boolean isInfotextOrtRendered() {
      return true;
    }

    @Override
    public boolean isInfotextOrtsteilRendered() {
      return true;
    }
  },

  DOKUMENT_PLATZHALTER_STIMMZETTEL_FORMAT_INLINE { // ELECT-9238

    @Override
    public boolean usesDokumentPlatzhalterStimmzettelFormat() {
      return true;
    }

    @Override
    public boolean isInfotextNewlineRequired() {
      return false;
    }

    @Override
    public String getNamen(EntityAufStimmzettelDaten entityAufStimmzettelDaten, Kandidatur kandidatur) {
      return entityAufStimmzettelDaten.getStimmzettelFormatter().formatKandidaturNamen(entityAufStimmzettelDaten.getWahlParameterLoader(), kandidatur);
    }

    @Override
    public String getPseudonyme(EntityAufStimmzettelDaten entityAufStimmzettelDaten, Kandidatur kandidatur) {
      return formatPseudonyme(entityAufStimmzettelDaten, kandidatur); // ELECTMUC-2788, bisher kein eigener Format-Parameter!!!
    }

    @Override
    public String getInfotext(EntityAufStimmzettelDaten entityAufStimmzettelDaten, Kandidatur kandidatur) {
      return entityAufStimmzettelDaten.getStimmzettelFormatter().formatKandidaturInfotext(entityAufStimmzettelDaten.getWahlParameterLoader(), kandidatur);
    }

    @Override
    public boolean isInfotextOrtRendered() {
      return true;
    }

    @Override
    public boolean isInfotextOrtsteilRendered() {
      return true;
    }
  },

  STANDARD_INFOTEXT_NEWLINE_EXCLUDING_WOHNANGABEN {

    @Override
    public boolean isInfotextNewlineRequired() {
      return true;
    }

    @Override
    public String getNamen(EntityAufStimmzettelDaten entityAufStimmzettelDaten, Kandidatur kandidatur) {
      return STANDARD_INFOTEXT_INLINE_EXCLUDING_WOHNANGABEN.getNamen(entityAufStimmzettelDaten, kandidatur);
    }

    @Override
    public String getPseudonyme(EntityAufStimmzettelDaten entityAufStimmzettelDaten, Kandidatur kandidatur) {
      return STANDARD_INFOTEXT_INLINE_EXCLUDING_WOHNANGABEN.getPseudonyme(entityAufStimmzettelDaten, kandidatur);
    }

    @Override
    public String getInfotext(EntityAufStimmzettelDaten entityAufStimmzettelDaten, Kandidatur kandidatur) {
      return STANDARD_INFOTEXT_INLINE_EXCLUDING_WOHNANGABEN.getInfotext(entityAufStimmzettelDaten, kandidatur);
    }

    @Override
    public boolean isInfotextOrtRendered() {
      return STANDARD_INFOTEXT_INLINE_EXCLUDING_WOHNANGABEN.isInfotextOrtRendered();
    }

    @Override
    public boolean isInfotextOrtsteilRendered() {
      return STANDARD_INFOTEXT_INLINE_EXCLUDING_WOHNANGABEN.isInfotextOrtsteilRendered();
    }
  },

  STANDARD_INFOTEXT_NEWLINE_INCLUDING_ORTSTEIL {

    @Override
    public boolean isInfotextNewlineRequired() {
      return true;
    }

    @Override
    public String getNamen(EntityAufStimmzettelDaten entityAufStimmzettelDaten, Kandidatur kandidatur) {
      return STANDARD_INFOTEXT_INLINE_INCLUDING_ORTSTEIL.getNamen(entityAufStimmzettelDaten, kandidatur);
    }

    @Override
    public String getPseudonyme(EntityAufStimmzettelDaten entityAufStimmzettelDaten, Kandidatur kandidatur) {
      return STANDARD_INFOTEXT_INLINE_INCLUDING_ORTSTEIL.getPseudonyme(entityAufStimmzettelDaten, kandidatur);
    }

    @Override
    public String getInfotext(EntityAufStimmzettelDaten entityAufStimmzettelDaten, Kandidatur kandidatur) {
      return STANDARD_INFOTEXT_INLINE_INCLUDING_ORTSTEIL.getInfotext(entityAufStimmzettelDaten, kandidatur);
    }

    @Override
    public boolean isInfotextOrtRendered() {
      return STANDARD_INFOTEXT_INLINE_INCLUDING_ORTSTEIL.isInfotextOrtRendered();
    }

    @Override
    public boolean isInfotextOrtsteilRendered() {
      return STANDARD_INFOTEXT_INLINE_INCLUDING_ORTSTEIL.isInfotextOrtsteilRendered();
    }
  },

  STANDARD_INFOTEXT_NEWLINE_INCLUDING_ORT { // ELECTMUC-508, ELECTMUC-520

    @Override
    public boolean isInfotextNewlineRequired() {
      return true;
    }

    @Override
    public String getNamen(EntityAufStimmzettelDaten entityAufStimmzettelDaten, Kandidatur kandidatur) {
      return STANDARD_INFOTEXT_INLINE_INCLUDING_ORT.getNamen(entityAufStimmzettelDaten, kandidatur);
    }

    @Override
    public String getPseudonyme(EntityAufStimmzettelDaten entityAufStimmzettelDaten, Kandidatur kandidatur) {
      return STANDARD_INFOTEXT_INLINE_INCLUDING_ORT.getPseudonyme(entityAufStimmzettelDaten, kandidatur);
    }

    @Override
    public String getInfotext(EntityAufStimmzettelDaten entityAufStimmzettelDaten, Kandidatur kandidatur) {
      return STANDARD_INFOTEXT_INLINE_INCLUDING_ORT.getInfotext(entityAufStimmzettelDaten, kandidatur);
    }

    @Override
    public boolean isInfotextOrtRendered() {
      return STANDARD_INFOTEXT_INLINE_INCLUDING_ORT.isInfotextOrtRendered();
    }

    @Override
    public boolean isInfotextOrtsteilRendered() {
      return STANDARD_INFOTEXT_INLINE_INCLUDING_ORT.isInfotextOrtsteilRendered();
    }
  },

  STANDARD_INFOTEXT_NEWLINE_INCLUDING_ORT_ORTSTEIL {

    @Override
    public boolean isInfotextNewlineRequired() {
      return true;
    }

    @Override
    public String getNamen(EntityAufStimmzettelDaten entityAufStimmzettelDaten, Kandidatur kandidatur) {
      return STANDARD_INFOTEXT_INLINE_INCLUDING_ORT_ORTSTEIL.getNamen(entityAufStimmzettelDaten, kandidatur);
    }

    @Override
    public String getPseudonyme(EntityAufStimmzettelDaten entityAufStimmzettelDaten, Kandidatur kandidatur) {
      return STANDARD_INFOTEXT_INLINE_INCLUDING_ORT_ORTSTEIL.getPseudonyme(entityAufStimmzettelDaten, kandidatur);
    }

    @Override
    public String getInfotext(EntityAufStimmzettelDaten entityAufStimmzettelDaten, Kandidatur kandidatur) {
      return STANDARD_INFOTEXT_INLINE_INCLUDING_ORT_ORTSTEIL.getInfotext(entityAufStimmzettelDaten, kandidatur);
    }

    @Override
    public boolean isInfotextOrtRendered() {
      return STANDARD_INFOTEXT_INLINE_INCLUDING_ORT_ORTSTEIL.isInfotextOrtRendered();
    }

    @Override
    public boolean isInfotextOrtsteilRendered() {
      return STANDARD_INFOTEXT_INLINE_INCLUDING_ORT_ORTSTEIL.isInfotextOrtsteilRendered();
    }
  },

  DOKUMENT_PLATZHALTER_STIMMZETTEL_FORMAT_NEWLINE { // ELECT-9238

    @Override
    public boolean usesDokumentPlatzhalterStimmzettelFormat() {
      return DOKUMENT_PLATZHALTER_STIMMZETTEL_FORMAT_INLINE.usesDokumentPlatzhalterStimmzettelFormat();
    }

    @Override
    public boolean isInfotextNewlineRequired() {
      return true;
    }

    @Override
    public String getNamen(EntityAufStimmzettelDaten entityAufStimmzettelDaten, Kandidatur kandidatur) {
      return DOKUMENT_PLATZHALTER_STIMMZETTEL_FORMAT_INLINE.getNamen(entityAufStimmzettelDaten, kandidatur);
    }

    @Override
    public String getPseudonyme(EntityAufStimmzettelDaten entityAufStimmzettelDaten, Kandidatur kandidatur) {
      return DOKUMENT_PLATZHALTER_STIMMZETTEL_FORMAT_INLINE.getPseudonyme(entityAufStimmzettelDaten, kandidatur);
    }

    @Override
    public String getInfotext(EntityAufStimmzettelDaten entityAufStimmzettelDaten, Kandidatur kandidatur) {
      return DOKUMENT_PLATZHALTER_STIMMZETTEL_FORMAT_INLINE.getInfotext(entityAufStimmzettelDaten, kandidatur);
    }

    @Override
    public boolean isInfotextOrtRendered() {
      return DOKUMENT_PLATZHALTER_STIMMZETTEL_FORMAT_INLINE.isInfotextOrtRendered();
    }

    @Override
    public boolean isInfotextOrtsteilRendered() {
      return DOKUMENT_PLATZHALTER_STIMMZETTEL_FORMAT_INLINE.isInfotextOrtsteilRendered();
    }
  },

  ;

  StimmzettelFormatterKandidaturFormatDarstellung() {
  }

  public boolean containsNewline() {
    return isPseudonymeNewlineRequired() || isInfotextNewlineRequired();
  }

  public boolean usesDokumentPlatzhalterStimmzettelFormat() {
    return false;
  }

  public abstract String getNamen(EntityAufStimmzettelDaten entityAufStimmzettelDaten, Kandidatur kandidatur);

  public String getNamenSeparator(EntityAufStimmzettelDaten entityAufStimmzettelDaten, Kandidatur kandidatur) {
    return entityAufStimmzettelDaten.getStimmzettelFormatter().getKandidaturNamenSeparator(kandidatur);
  }

  public String getVornamen(EntityAufStimmzettelDaten entityAufStimmzettelDaten, Kandidatur kandidatur) {
    return entityAufStimmzettelDaten.getStimmzettelFormatter().formatKandidaturVornamen(kandidatur);
  }

  public String getNachname(EntityAufStimmzettelDaten entityAufStimmzettelDaten, Kandidatur kandidatur) {
    return entityAufStimmzettelDaten.getStimmzettelFormatter().formatKandidaturNachname(kandidatur);
  }

  public boolean isPseudonymeRendered() {
    return true;
  }

  public boolean isPseudonymeNewlineRequired() {
    return false;
  }

  public abstract String getPseudonyme(EntityAufStimmzettelDaten entityAufStimmzettelDaten, Kandidatur kandidatur);

  public boolean isInfotextRendered() {
    return true;
  }

  public abstract boolean isInfotextOrtRendered();

  public abstract boolean isInfotextOrtsteilRendered();

  public abstract boolean isInfotextNewlineRequired();

  public String getInfotext(EntityAufStimmzettelDaten entityAufStimmzettelDaten, Kandidatur kandidatur) {
    return entityAufStimmzettelDaten.getStimmzettelFormatter().getKandidaturInfotext(kandidatur, isInfotextOrtRendered(), isInfotextOrtsteilRendered());
  }

  public String getInfotextSeparator(EntityAufStimmzettelDaten entityAufStimmzettelDaten, Kandidatur kandidatur) {
    return entityAufStimmzettelDaten.getStimmzettelFormatter().getKandidaturInfotextSeparator(kandidatur);
  }

  private static String formatNamen(EntityAufStimmzettelDaten entityAufStimmzettelDaten, Kandidatur kandidatur) {
    return entityAufStimmzettelDaten.getStimmzettelFormatter().formatKandidaturNamen(kandidatur);
  }

  private static String formatPseudonyme(EntityAufStimmzettelDaten entityAufStimmzettelDaten, Kandidatur kandidatur) {
    return entityAufStimmzettelDaten.getStimmzettelFormatter().formatKandidaturPseudonyme(kandidatur);
  }
}
