
package de.ivu.elect.presentation.wahlvorschlag.table;

import de.ivu.elect.business.gebietsbaum.boundary.AbstractGebietDAO;
import de.ivu.elect.business.gebietsbaum.entity.Gebiet;
import de.ivu.elect.business.wahl.entity.NlWahlart;
import de.ivu.elect.business.wahl.entity.Wahl;
import de.ivu.elect.business.wahlvorschlag.entity.Liste;
import de.ivu.elect.business.wahlvorschlag.entity.StelInformationen;
import de.ivu.elect.jee.faces.Messages;
import de.ivu.elect.jee.presentation.dynamictable.ColumnType;
import de.ivu.elect.presentation.gruppe.table.NlGruppeListenStelColumn;
import de.ivu.elect.presentation.wahlvorschlag.NlListeStelInformationCache;

public class NlListeStelColumn extends AbstractWahlvorschlagColumn<Liste> {

  private static final long serialVersionUID = 1L;

  protected NlListeStelColumn(Messages messages, NlListeStelInformationCache nlListeStelInformationCache) {
    super("NlListeStelColumn", messages, "nl.liste.art.column", ColumnType.STRING, liste -> {
      StelInformationen stelInformationen = nlListeStelInformationCache.getStelInformationen(liste);

      if (stelInformationen.isEchterStel()) {
        return messages.getMessageForMessageKey("listengruppe.mit.stel", stelInformationen.getStelNummerAnzeige());
      }

      if (stelInformationen.isUnechterStel()) {
        return messages.getMessageForMessageKey("listengruppe.unechter.stel", stelInformationen.getStelNummerAnzeige());
      }

      return messages.lokalisiere(stelInformationen.getNlPolitischeGruppeArt());
    });
  }

  public static boolean isRendered(Gebiet gebiet, AbstractGebietDAO gebietDAO) {
    if (gebiet == null) {
      return false;
    }

    Wahl wahl = gebiet.getWahl();

    if (wahl == null) {
      return false;
    }

    return isPsWahlOberstesGebiet(wahl, gebiet) || NlGruppeListenStelColumn.isRendered(wahl, gebietDAO); // ELECT-13408
  }

  private static boolean isPsWahlOberstesGebiet(Wahl wahl, Gebiet gebiet) {
    // ELECT-13614 Spezialbehandlung PS1
    return !gebiet.hasUebergeordnetesGebiet() && (NlWahlart.PROVINCIALE_STATEN.equalsWahlart(wahl) || NlWahlart.PROVINCIALE_STATEN1.equalsWahlart(
        wahl) || NlWahlart.PROVINCIALE_STATEN2.equalsWahlart(wahl));
  }
}
