
package de.ivu.elect.dokumente.ergebnistabelle;

import de.ivu.document.generator.template.OdtDocumentBuilder;
import de.ivu.document.generator.template.odt.elements.OdtElement;
import de.ivu.document.generator.template.odt.styles.DocumentStyleTemplate;
import de.ivu.document.generator.template.odt.styles.OdtPageLayout;
import de.ivu.document.generator.template.odt.styles.OdtTableCellStyle;
import de.ivu.document.generator.template.odt.styles.OdtTableColumnStyle;
import de.ivu.document.generator.template.odt.styles.OdtTextParagraphStyle;

public enum ErgebnistabelleSpreadsheetStyleTemplate implements DocumentStyleTemplate {

  PAGE_LAYOUT_LANDSCAPE {

    @Override
    public void addTo(OdtDocumentBuilder documentBuilder) {
      super.addTo(documentBuilder);
      documentBuilder.setMasterPagePageLayout(this);
    }

    @Override
    public OdtElement createStyle() {
      return OdtPageLayout.createStyleLandscape(this);
    }

    @Override
    protected void fillStyle(OdtElement styleElement) {
      // nothing to do
    }
  },

  CELL_STYLE_DEFAULT {

    @Override
    public OdtElement createStyle() {
      return OdtTableCellStyle.createStyleBorderSmallBlack(this);
    }

    @Override
    protected void fillStyle(OdtElement styleElement) {
      OdtTableCellStyle style = (OdtTableCellStyle) styleElement;
      style.addPadding("0.05cm"); // Abstand zw. Zellinhalt und Rahmen
      style.addVerticalAlign("middle");
    }
  },

  CELL_STYLE_BORDERLESS {

    @Override
    public OdtElement createStyle() {
      return OdtTableCellStyle.createStyleBorderNone(this);
    }

    @Override
    protected void fillStyle(OdtElement styleElement) {
      OdtTableCellStyle style = (OdtTableCellStyle) styleElement;
      style.addPadding("0.05cm"); // Abstand zw. Zellinhalt und Rahmen
      style.addVerticalAlign("top");
    }
  },

  /** Für die mittlere, die Überschrift enthaltende Spalte der Kopftabelle der Ergebnistabellen */
  COLUMN_STYLE_HEADLINE_MID {

    @Override
    public OdtElement createStyle() {
      return new OdtTableColumnStyle(this);
    }

    @Override
    protected void fillStyle(OdtElement styleElement) {
      OdtTableColumnStyle style = (OdtTableColumnStyle) styleElement;
      style.addRelativeWidth(6803);
    }
  },

  /** ELECTBB-278 Die Überschrift ist bei Berlin breiter, mit neuem Stil am einfachsten zu implementieren. */
  COLUMN_STYLE_HEADLINE_MID_WIDE {

    @Override
    public OdtElement createStyle() {
      return new OdtTableColumnStyle(this);
    }

    @Override
    protected void fillStyle(OdtElement styleElement) {
      OdtTableColumnStyle style = (OdtTableColumnStyle) styleElement;
      style.addRelativeWidth(8703);
    }
  },

  /** Für die linke und rechte Spalte der Kopftabelle der Ergebnistabellen */
  COLUMN_STYLE_HEADLINE_SIDE {

    @Override
    public OdtElement createStyle() {
      return new OdtTableColumnStyle(this);
    }

    @Override
    protected void fillStyle(OdtElement styleElement) {
      OdtTableColumnStyle style = (OdtTableColumnStyle) styleElement;
      style.addRelativeWidth(3883);
    }
  },

  TEXT_STYLE_DEFAULT {

    @Override
    public OdtElement createStyle() {
      return new OdtTextParagraphStyle(this);
    }

    @Override
    protected void fillStyle(OdtElement styleElement) {
      OdtTextParagraphStyle style = (OdtTextParagraphStyle) styleElement;
      style.addFontName("Arial");
      style.addFontSize("7pt");
    }
  },

  TEXT_STYLE_BOLD {

    @Override
    public OdtElement createStyle() {
      return new OdtTextParagraphStyle(this);
    }

    @Override
    protected void fillStyle(OdtElement styleElement) {
      OdtTextParagraphStyle style = (OdtTextParagraphStyle) styleElement;

      TEXT_STYLE_DEFAULT.fillStyle(style);
      style.addFontWeight("bold");
    }

  },

  TEXT_STYLE_NUMBER {

    @Override
    public OdtElement createStyle() {
      return new OdtTextParagraphStyle(this);
    }

    @Override
    protected void fillStyle(OdtElement styleElement) {
      OdtTextParagraphStyle style = (OdtTextParagraphStyle) styleElement;

      TEXT_STYLE_DEFAULT.fillStyle(style);
      style.addTextAlign("right");
    }
  },

  TEXT_STYLE_BOLD_NUMBER {

    @Override
    public OdtElement createStyle() {
      return new OdtTextParagraphStyle(this);
    }

    @Override
    protected void fillStyle(OdtElement styleElement) {
      OdtTextParagraphStyle style = (OdtTextParagraphStyle) styleElement;

      TEXT_STYLE_NUMBER.fillStyle(style);
      style.addFontWeight("bold");
    }
  },

  TEXT_STYLE_TABLE_HEADER {

    @Override
    public OdtElement createStyle() {
      return new OdtTextParagraphStyle(this);
    }

    @Override
    protected void fillStyle(OdtElement styleElement) {
      OdtTextParagraphStyle style = (OdtTextParagraphStyle) styleElement;

      TEXT_STYLE_DEFAULT.fillStyle(style);
      style.addFontWeight("bold");
      style.addTextAlign("center");
    }
  },

  TEXT_STYLE_HEADLINE {

    @Override
    public OdtElement createStyle() {
      return new OdtTextParagraphStyle(this);
    }

    @Override
    protected void fillStyle(OdtElement styleElement) {
      OdtTextParagraphStyle style = (OdtTextParagraphStyle) styleElement;

      TEXT_STYLE_DEFAULT.fillStyle(style);
      style.addFontSize("16pt");
      style.addFontWeight("bold");
      style.addTextAlign("center");
      style.addMarginBottom("0.1cm");
    }
  },

  TEXT_STYLE_SUB_HEADLINE {

    @Override
    public OdtElement createStyle() {
      return new OdtTextParagraphStyle(this);
    }

    @Override
    protected void fillStyle(OdtElement styleElement) {
      OdtTextParagraphStyle style = (OdtTextParagraphStyle) styleElement;

      TEXT_STYLE_DEFAULT.fillStyle(style);
      style.addFontSize("10pt");
      style.addTextAlign("center");
      style.addMarginBottom("0.1cm");
    }
  },

  /** Neben der Überschrift stehende Informationen */
  TEXT_STYLE_HEADLINE_LEFT {

    @Override
    public OdtElement createStyle() {
      return new OdtTextParagraphStyle(this);
    }

    @Override
    protected void fillStyle(OdtElement styleElement) {
      OdtTextParagraphStyle style = (OdtTextParagraphStyle) styleElement;

      TEXT_STYLE_DEFAULT.fillStyle(style);
      style.addFontSize("10pt");
      style.addTextAlign("left");
      style.addMarginBottom("0.1cm");
    }
  },

  /** Neben der Überschrift stehende Informationen */
  TEXT_STYLE_HEADLINE_RIGHT {

    @Override
    public OdtElement createStyle() {
      return new OdtTextParagraphStyle(this);
    }

    @Override
    protected void fillStyle(OdtElement styleElement) {
      OdtTextParagraphStyle style = (OdtTextParagraphStyle) styleElement;

      TEXT_STYLE_DEFAULT.fillStyle(style);
      style.addFontSize("10pt");
      style.addTextAlign("right");
      style.addMarginBottom("0.1cm");
    }
  },

  /** Kein Zeilenumbruch in Tabellenzellen */
  TEXT_STYLE_CELL_WITHOUT_LINE_BREAK {

    @Override
    public OdtElement createStyle() {
      return new OdtTextParagraphStyle(this);
    }

    @Override
    protected void fillStyle(OdtElement styleElement) {
      OdtTextParagraphStyle style = (OdtTextParagraphStyle) styleElement;

      TEXT_STYLE_DEFAULT.fillStyle(style);
      style.addMarginRight("-20cm"); // Text verschwindet so hinter dem Ende der Tabellenzelle
    }
  },

  /** Für Platzhalter für handschriftliche Unterschriften */
  TEXT_STYLE_UNTERSCHRIFT {
    @Override
    public OdtElement createStyle() {
      return new OdtTextParagraphStyle(this);
    }

    @Override
    protected void fillStyle(OdtElement styleElement) {
      OdtTextParagraphStyle style = (OdtTextParagraphStyle) styleElement;
      style.addFontName("Arial");
      style.addFontSize("12pt");
    }
  };

  @Override
  public String getName() {
    return name();
  }

  public void addTo(OdtDocumentBuilder documentBuilder) {
    OdtElement styleElement = createStyle();
    fillStyle(styleElement);
    documentBuilder.addStyle(styleElement);
  }

  public abstract OdtElement createStyle();

  protected abstract void fillStyle(OdtElement styleElement);

  public static void addAllStylesTo(OdtDocumentBuilder documentBuilder) {
    for (ErgebnistabelleSpreadsheetStyleTemplate style : values()) {
      style.addTo(documentBuilder);
    }
  }

}
