
package de.ivu.elect.business.benutzerverwaltung.boundary;

import java.util.ArrayList;
import java.util.Date;
import java.util.List;

import org.apache.deltaspike.core.api.scope.ConversationGroup;
import org.apache.deltaspike.core.api.scope.GroupedConversationScoped;

import de.ivu.elect.business.benutzerverwaltung.entity.Benutzer;
import de.ivu.elect.business.benutzerverwaltung.entity.BenutzerEinsatzort;
import de.ivu.elect.business.benutzerverwaltung.entity.NachrichtEmpfaengerGruppeArt;
import de.ivu.elect.business.benutzerverwaltung.entity.NachrichtProperties.EmpfaengerGruppeArtMitLeererAuswahlProperty;
import de.ivu.elect.business.benutzerverwaltung.entity.NachrichtProperties.ZeitpunktProperty;
import de.ivu.elect.business.benutzerverwaltung.entity.RolleConstants;
import de.ivu.elect.jee.presentation.dynamicform.AbstractStringProperty;
import de.ivu.elect.jee.presentation.dynamicform.Property;
import de.ivu.elect.jee.presentation.dynamicform.TimestampDateProperty;
import de.ivu.elect.jee.presentation.dynamicform.TimestampTimeProperty;
import de.ivu.elect.jee.presentation.search.AbstractSearchParameters;

@GroupedConversationScoped
@ConversationGroup(AbstractNachrichtSearchParameters.class)
public class NachrichtSearchParameters extends AbstractNachrichtSearchParameters {

  private static final long serialVersionUID = 1L;

  private Benutzer login;

  private BenutzerEinsatzort benutzerEinsatzort;

  private Long letzteId;

  private NachrichtEmpfaengerGruppeArt empfaengerGruppeArt;

  private String empfaengerRolleFreitext;

  private Date zeitpunktVon;

  private Date zeitpunktBis;

  public NachrichtSearchParameters() {
    super();
  }

  public BenutzerEinsatzort getBenutzerEinsatzort() {
    return benutzerEinsatzort;
  }

  public void setBenutzerEinsatzort(BenutzerEinsatzort benutzerEinsatzort) {
    this.benutzerEinsatzort = benutzerEinsatzort;
  }

  public Benutzer getLogin() {
    return login;
  }

  public void setLogin(Benutzer login) {
    this.login = login;
  }

  public Long getLetzteId() {
    return letzteId;
  }

  public void setLetzteId(Long letzteId) {
    this.letzteId = letzteId;
  }

  public NachrichtEmpfaengerGruppeArt getEmpfaengerGruppeArt() {
    return empfaengerGruppeArt;
  }

  public void setEmpfaengerGruppeArt(NachrichtEmpfaengerGruppeArt empfaengerGruppeArt) {
    this.empfaengerGruppeArt = empfaengerGruppeArt;
  }

  public Property getEmpfaengerGruppeArtProperty() {
    return new EmpfaengerGruppeArtMitLeererAuswahlProperty(null) {

      @Override
      public NachrichtEmpfaengerGruppeArt getValue() {
        return getEmpfaengerGruppeArt();
      }

      @Override
      public void setValue(NachrichtEmpfaengerGruppeArt value) {
        setEmpfaengerGruppeArt(value);
      }

      @Override
      public List<NachrichtEmpfaengerGruppeArt> getValues() {
        List<NachrichtEmpfaengerGruppeArt> values = new ArrayList<>(super.getValues());
        values.remove(NachrichtEmpfaengerGruppeArt.ANTWORT);

        return values;
      }
    };
  }

  public String getEmpfaengerRolleFreitext() {
    return empfaengerRolleFreitext;
  }

  public void setEmpfaengerRolleFreitext(String empfaengerRolleFreitext) {
    this.empfaengerRolleFreitext = empfaengerRolleFreitext;
  }

  public Property getEmpfaengerRolleFreitextProperty() {
    return new AbstractStringProperty() {

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

      @Override
      public int getDefaultMaxLength() {
        return RolleConstants.BESCHREIBUNG_MAX_LENGTH;
      }

      @Override
      public String getDefaultLabel() {
        return getMessage(RolleConstants.MESSAGE_KEY_ENTITY_MEHRZAHL);
      }

      @Override
      public void setValue(String value) {
        setEmpfaengerRolleFreitext(value);
      }

      @Override
      public String getValue() {
        return getEmpfaengerRolleFreitext();
      }

      @Override
      public String getTooltip() {
        return getMessage(AbstractSearchParameters.WILDCARD_TOOLTIP_MSG_KEY);
      }
    };
  }

  public Date getZeitpunktVon() {
    return zeitpunktVon;
  }

  public void setZeitpunktVon(Date zeitpunktVon) {
    this.zeitpunktVon = zeitpunktVon;
  }

  public Property getZeitpunktVonDateProperty() {
    return new TimestampDateProperty(new ZeitpunktVonProperty());
  }

  public Property getZeitpunktVonTimeProperty() {
    return new TimestampTimeProperty(new ZeitpunktVonProperty());
  }

  public Date getZeitpunktBis() {
    return zeitpunktBis;
  }

  public void setZeitpunktBis(Date zeitpunktBis) {
    this.zeitpunktBis = zeitpunktBis;
  }

  public Property getZeitpunktBisDateProperty() {
    return new TimestampDateProperty(new ZeitpunktBisProperty());
  }

  public Property getZeitpunktBisTimeProperty() {
    return new TimestampTimeProperty(new ZeitpunktBisProperty());
  }

  private final class ZeitpunktVonProperty extends ZeitpunktProperty {

    public ZeitpunktVonProperty() {
      super(null);
    }

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

    @Override
    public Date getValue() {
      return getZeitpunktVon();
    }

    @Override
    public void setValue(Date value) {
      setZeitpunktVon(value);
    }

    @Override
    public String getDefaultLabel() {
      return getMessage("entity.einzahl.NACHRICHT.ZEITPUNKT_VON_FORMAT", super.getDefaultLabel());
    }
  }

  private final class ZeitpunktBisProperty extends ZeitpunktProperty {

    public ZeitpunktBisProperty() {
      super(null);
    }

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

    @Override
    public Date getValue() {
      return getZeitpunktBis();
    }

    @Override
    public void setValue(Date value) {
      setZeitpunktBis(value);
    }

    @Override
    public String getDefaultLabel() {
      return getMessage("entity.einzahl.NACHRICHT.ZEITPUNKT_BIS_FORMAT", super.getDefaultLabel());
    }
  }
}
