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

import java.util.ArrayList;
import java.util.Collection;
import java.util.Collections;
import java.util.List;

import javax.annotation.Nullable;
import javax.persistence.NoResultException;
import javax.persistence.Transient;

import de.ivu.elect.business.gebietsbaum.entity.EntityMitGebiet;
import de.ivu.elect.business.gebietsbaum.entity.Gebiet;
import de.ivu.elect.business.niederschrift.boundary.AbstractNiederschriftStatusAenderungDAO;
import de.ivu.elect.business.wahl.entity.Wahl;

public abstract class AbstractNiederschrift implements NiederschriftBase, EntityMitGebiet {

  private static final long serialVersionUID = 1L;

  @Transient
  private transient boolean neuesteNiederschriftStatusAenderungBereitsGesucht = false;

  @Transient
  private transient NiederschriftStatusAenderung neuesteNiederschriftStatusAenderung = null;

  public AbstractNiederschrift() {
    super();
  }

  public Wahl getWahl() {
    if (getGebiet() != null) {
      return getGebiet().getWahl();
    }

    return null;
  }

  @Override
  public Gebiet getGebiet() {
    return getWahldurchfuehrungsgebiet();
  }

  public Collection<NiederschriftStatusAenderung> getNiederschriftStatusAenderungen() {
    return getNiederschriftStatusAenderungsByNiederschrift();
  }

  public Collection<NiederschriftKorrektur> getNiederschriftKorrekturen() {
    return getNiederschriftKorrektursByNiederschrift();
  }

  public List<NiederschriftKorrektur> getNiederschriftKorrekturenSortiertNachZeitstempelAufsteigend() {
    List<NiederschriftKorrektur> result = new ArrayList<>(getNiederschriftKorrektursByNiederschrift());
    Collections.sort(result, new NiederschriftKorrekturByZeitstempelComparator());

    return result;
  }

  @Nullable
  public NiederschriftStatusAenderung findNeuesteNiederschriftStatusAenderung(AbstractNiederschriftStatusAenderungDAO niederschriftStatusAenderungDAO) {
    if (neuesteNiederschriftStatusAenderungBereitsGesucht) {
      return neuesteNiederschriftStatusAenderung;
    }

    try {
      neuesteNiederschriftStatusAenderung = niederschriftStatusAenderungDAO.findByNiederschriftAndMaxZeitstempel((Niederschrift) this);
    } catch (NoResultException ignored) {
      neuesteNiederschriftStatusAenderung = null;
    }

    neuesteNiederschriftStatusAenderungBereitsGesucht = true;

    return neuesteNiederschriftStatusAenderung;
  }
}
