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

import java.util.Arrays;

import org.apache.commons.lang3.StringUtils;

import de.ivu.elect.business.stimmeingabe.entity.Ergebniseingabestufe;

public enum Eml510 {

  // Export PSB / Import PSB (ReportungUnits)
  EML510a {
    @Override
    public String getId() {
      return "510a";
    }

    @Override
    public EmlVoteSource getPsbImportSource() {
      return EmlVoteSource.REPORTING_UNIT;
    }

    @Override
    public EmlVoteSource getHsbImportSource() {
      return EmlVoteSource.UNSUPPORTED;
    }

    @Override
    public EmlVoteSource getCsbImportSource() {
      return EmlVoteSource.UNSUPPORTED;
    }

    @Override
    public Ergebniseingabestufe getPsbErgebniseingabestufe() {
      return Ergebniseingabestufe.VORSTUFE_01;
    }

    @Override
    public Ergebniseingabestufe getHsbErgebniseingabestufe() {
      return Ergebniseingabestufe.VORSTUFE_01;
    }

    @Override
    public Ergebniseingabestufe getCsbErgebniseingabestufe() {
      return Ergebniseingabestufe.VORSTUFE_01;
    }

  },

  // Export PSB / Import HSB (Total Votes) / Import PSB (ReportungUnits)
  EML510b {
    @Override
    public String getId() {
      return "510b";
    }

    @Override
    public EmlVoteSource getPsbImportSource() {
      return EmlVoteSource.REPORTING_UNIT_TEST_ONLY;
    }

    @Override
    public EmlVoteSource getHsbImportSource() {
      return EmlVoteSource.TOTAL_VOTES;
    }

    @Override
    public EmlVoteSource getCsbImportSource() {
      return EmlVoteSource.UNSUPPORTED;
    }

    @Override
    public Ergebniseingabestufe getPsbErgebniseingabestufe() {
      return Ergebniseingabestufe.ENDSTUFE;
    }

    @Override
    public Ergebniseingabestufe getHsbErgebniseingabestufe() {
      return Ergebniseingabestufe.VORSTUFE_01;
    }

    @Override
    public Ergebniseingabestufe getCsbErgebniseingabestufe() {
      return Ergebniseingabestufe.VORSTUFE_01;
    }

  },

  // Export HSB / Import CSB (Total Votes) / Import HSB (ReportungUnits)
  EML510c {
    @Override
    public String getId() {
      return "510c";
    }

    @Override
    public EmlVoteSource getPsbImportSource() {
      return EmlVoteSource.UNSUPPORTED;
    }

    @Override
    public EmlVoteSource getHsbImportSource() {
      return EmlVoteSource.REPORTING_UNIT_TEST_ONLY;
    }

    @Override
    public EmlVoteSource getCsbImportSource() {
      return EmlVoteSource.TOTAL_VOTES;
    }

    @Override
    public Ergebniseingabestufe getPsbErgebniseingabestufe() {
      return Ergebniseingabestufe.VORSTUFE_01;
    }

    @Override
    public Ergebniseingabestufe getHsbErgebniseingabestufe() {
      return Ergebniseingabestufe.ENDSTUFE;
    }

    @Override
    public Ergebniseingabestufe getCsbErgebniseingabestufe() {
      return Ergebniseingabestufe.VORSTUFE_01;
    }

  },
  // Export CSB / Import CSB (ReportungUnits)
  EML510d {
    @Override
    public String getId() {
      return "510d";
    }

    @Override
    public EmlVoteSource getPsbImportSource() {
      return EmlVoteSource.REPORTING_UNIT_TEST_ONLY; // Bei GR...
    }

    @Override
    public EmlVoteSource getHsbImportSource() {
      return EmlVoteSource.UNSUPPORTED;
    }

    @Override
    public EmlVoteSource getCsbImportSource() {
      return EmlVoteSource.REPORTING_UNIT_TEST_ONLY;
    }

    @Override
    public Ergebniseingabestufe getPsbErgebniseingabestufe() {
      return Ergebniseingabestufe.ENDSTUFE;
    }

    @Override
    public Ergebniseingabestufe getHsbErgebniseingabestufe() {
      return Ergebniseingabestufe.ENDSTUFE;
    }

    @Override
    public Ergebniseingabestufe getCsbErgebniseingabestufe() {
      return Ergebniseingabestufe.ENDSTUFE;
    }

  },
  UNBEKANNT {
    @Override
    public String getId() {
      return "";
    }

    @Override
    public EmlVoteSource getPsbImportSource() {
      return EmlVoteSource.UNSUPPORTED;
    }

    @Override
    public EmlVoteSource getHsbImportSource() {
      return EmlVoteSource.UNSUPPORTED;
    }

    @Override
    public EmlVoteSource getCsbImportSource() {
      return EmlVoteSource.UNSUPPORTED;
    }

    @Override
    public Ergebniseingabestufe getPsbErgebniseingabestufe() {
      throw new UnsupportedOperationException();
    }

    @Override
    public Ergebniseingabestufe getHsbErgebniseingabestufe() {
      throw new UnsupportedOperationException();
    }

    @Override
    public Ergebniseingabestufe getCsbErgebniseingabestufe() {
      throw new UnsupportedOperationException();
    }

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

  public boolean isGueltigeEml510() {
    return true;
  }

  public abstract String getId();

  public abstract EmlVoteSource getPsbImportSource();

  public abstract EmlVoteSource getHsbImportSource();

  public abstract EmlVoteSource getCsbImportSource();

  public abstract Ergebniseingabestufe getPsbErgebniseingabestufe(); // ELECT-10065
  public abstract Ergebniseingabestufe getHsbErgebniseingabestufe(); // ELECT-10065
  public abstract Ergebniseingabestufe getCsbErgebniseingabestufe(); // ELECT-10065

  public static Eml510 from(String id) {
    if (StringUtils.isBlank(id)) {
      return UNBEKANNT;
    }

    return Arrays.stream(values()).filter(value -> value.getId().equalsIgnoreCase(id)).findFirst().orElse(UNBEKANNT);
  }

}
