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

import java.util.Collection;
import java.util.List;

import org.apache.commons.lang3.StringUtils;

import de.ivu.elect.business.gebietsbaum.boundary.AbstractGebietsartDAO;
import de.ivu.elect.business.gebietsbaum.boundary.GebietsartTemplate;
import de.ivu.elect.business.mandant.entity.Mandant;
import de.ivu.elect.jee.faces.Messages;


import static java.util.Objects.nonNull;

public abstract class AbstractGebietsart implements GebietsartBase, GebietsartTemplate {

  private static final long serialVersionUID = 1L;

  public AbstractGebietsart() {
    super();
  }

  public String lokalisiere(Messages messages) {
    // return messages.getMessageForMessageKey("Gebietsart." + getName()); // Funktioniert in Standart nicht, weil keine Enum...
    return getTitelWennLeerName();
  }

  public <CustomGebietsartTemplate extends GebietsartTemplate> CustomGebietsartTemplate getCustomGebietsartTemplate(Collection<CustomGebietsartTemplate> gebietsartTemplates) {
    for (CustomGebietsartTemplate gebietsartTemplate : gebietsartTemplates) {
      if (isGebietsart(gebietsartTemplate)) {
        return gebietsartTemplate;
      }
    }

    throw new IllegalStateException("Keine Enum für Wert gefunden: '" + getName() + "'");
  }

  public String getTitelWennLeerName() {
    if (StringUtils.isBlank(getTitel())) {
      return getName();
    }
    return getTitel();
  }

  public static Gebietsart loadGebietsartByTemplate(Mandant mandant, GebietsartTemplate gebietsartTemplate, AbstractGebietsartDAO dao) {
    Gebietsart unattachedGebietsart = createGebietsartFromTemplate(gebietsartTemplate);

    List<Gebietsart> findByName = dao.findByName(mandant, unattachedGebietsart.getName());

    if (findByName.size() != 1) {
      throw new IllegalStateException(
          "Es darf nur eine Gebietsart mit dem Namen='" + unattachedGebietsart.getName() + "' geben! Gefundene Gebietsarten [Anzahl=" + findByName.size() + "]: " + findByName);
    }

    return findByName.get(0);
  }

  public static Gebietsart createGebietsartFromTemplate(GebietsartTemplate gebietsartTemplate) {
    Gebietsart gebietsart = new Gebietsart();
    fillGebietsartFromTemplate(gebietsart, gebietsartTemplate);
    return gebietsart;
  }
  public static void  fillGebietsartFromTemplate(Gebietsart gebietsart, GebietsartTemplate gebietsartTemplate) {
    gebietsart.setName(gebietsartTemplate.getGebietsartName());
    gebietsart.setPosition(gebietsartTemplate.getSortierPosition());
    gebietsart.setBezirksart(gebietsartTemplate.getGebietsartBezirksart());
    gebietsart.setIcon(gebietsartTemplate.getGebietsartIcon());
    gebietsart.setKennzeichen(gebietsartTemplate.getKennzeichen());
    gebietsart.setTitel(gebietsartTemplate.getGebietsartTitle());
    gebietsart.setDarstellung(gebietsartTemplate.getDarstellung());

  }

  public boolean isGebietsart(GebietsartTemplate gebietsartTemplate) {
    return nonNull(gebietsartTemplate) && gebietsartTemplate.equalsGebietsart((Gebietsart) this);
  }

  @Override
  public long getSortierPosition() {
    return getPosition();
  }

  @Override
  public boolean equalsGebiet(Gebiet gebiet) {
    return gebiet.getGebietsart().equals(this);
  }

  @Override
  public GebietsartBezirksart getGebietsartBezirksart() {
    return getBezirksart();
  }

  @Override
  public GebietsartIcon getGebietsartIcon() {
    return getIcon();
  }

  @Override
  public String getGebietsartTitle() {
    return getTitel();
  }

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