package de.jost_net.JVerein.gui.control;

import java.rmi.RemoteException;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import de.jost_net.JVerein.Queries.MitgliedQuery;
import de.jost_net.JVerein.Queries.MitgliedQuery.MitgliedAuswahl;
import de.jost_net.JVerein.gui.parts.JVereinTablePart;
import de.jost_net.JVerein.io.PersonalbogenAusgabe;
import de.jost_net.JVerein.rmi.Mitglied;
import de.jost_net.JVerein.keys.Ausgabeart;
import de.willuhn.jameica.gui.AbstractView;
import de.willuhn.jameica.gui.Action;
import de.willuhn.jameica.gui.GUI;
import de.willuhn.jameica.gui.input.CheckboxInput;
import de.willuhn.jameica.gui.parts.Button;
import de.willuhn.jameica.system.OperationCanceledException;
import de.willuhn.logging.Logger;
import de.willuhn.util.ApplicationException;

public class PersonalbogenControl extends DruckMailControl
{

  private CheckboxInput zusatzbetrag;

  private CheckboxInput mitgliedskonto;

  private CheckboxInput vermerk;

  private CheckboxInput wiedervorlage;

  private CheckboxInput lehrgang;

  private CheckboxInput zusatzfelder;

  private CheckboxInput eigenschaften;

  private CheckboxInput arbeitseinsatz;

  private CheckboxInput spendenbescheinigung;

  public PersonalbogenControl(AbstractView view)
  {
    super(view);
  }

  public Button getStartPersonalbogenButton(Object currentObject)
  {
    Button button = new Button("Starten", new Action()
    {
      @Override
      public void handleAction(Object context)
      {
        try
        {
          saveFilterSettings();
          new PersonalbogenAusgabe(PersonalbogenControl.this).aufbereiten(
              getMitglieder(currentObject),
              (Ausgabeart) getAusgabeart().getValue(), getBetreffString(),
              getTxtString(), false, false, false);
        }
        catch (ApplicationException ae)
        {
          GUI.getStatusBar().setErrorText(ae.getMessage());
        }
        catch (OperationCanceledException e)
        {
          throw e;
        }
        catch (Exception e)
        {
          Logger.error("Fehler bei der Personalbogen Ausgabe.", e);
          GUI.getStatusBar().setErrorText(e.getMessage());
        }
      }
    }, null, true, "walking.png");
    return button;
  }

  @Override
  public void saveFilterSettings()
  {
    super.saveFilterSettings();
    if (zusatzbetrag != null)
    {
      settings.setAttribute("zusatzbetrag", (Boolean) zusatzbetrag.getValue());
    }
    if (mitgliedskonto != null)
    {
      settings.setAttribute("mitgliedskonto",
          (Boolean) mitgliedskonto.getValue());
    }
    if (vermerk != null)
    {
      settings.setAttribute("vermerk", (Boolean) vermerk.getValue());
    }
    if (wiedervorlage != null)
    {
      settings.setAttribute("wiedervorlage",
          (Boolean) wiedervorlage.getValue());
    }
    if (lehrgang != null)
    {
      settings.setAttribute("lehrgang", (Boolean) lehrgang.getValue());
    }
    if (zusatzfelder != null)
    {
      settings.setAttribute("zusatzfelder", (Boolean) zusatzfelder.getValue());
    }
    if (eigenschaften != null)
    {
      settings.setAttribute("eigenschaften",
          (Boolean) eigenschaften.getValue());
    }
    if (arbeitseinsatz != null)
    {
      settings.setAttribute("arbeitseinsatz",
          (Boolean) arbeitseinsatz.getValue());
    }
    if (spendenbescheinigung != null)
    {
      settings.setAttribute("spendenbescheinigung",
          (Boolean) spendenbescheinigung.getValue());
    }
  }

  private ArrayList<Mitglied> getMitglieder(Object object)
      throws RemoteException, ApplicationException
  {
    if (object instanceof Mitglied)
    {
      object = new Mitglied[] { (Mitglied) object };
    }
    if (object instanceof Mitglied[])
    {
      return new ArrayList<Mitglied>(Arrays.asList((Mitglied[]) object));
    }
    ArrayList<Mitglied> mitglieder = new MitgliedQuery(this)
        .get(MitgliedAuswahl.ALLE, null);
    if (mitglieder.size() == 0)
    {
      throw new ApplicationException(
          "Für die gewählten Filterkriterien wurden keine Mitglieder gefunden.");
    }
    return mitglieder;
  }

  @Override
  DruckMailEmpfaenger getDruckMailMitglieder(Object object, String option)
      throws RemoteException, ApplicationException
  {
    ArrayList<Mitglied> mitglieder = getMitglieder(object);
    List<DruckMailEmpfaengerEntry> liste = new ArrayList<>();
    String text = null;
    int ohneMail = 0;

    for (Mitglied m : mitglieder)
    {
      String mail = m.getEmail();
      if ((mail == null || mail.isEmpty())
          && getAusgabeart().getValue() == Ausgabeart.MAIL)
      {
        ohneMail++;
      }
      liste.add(new DruckMailEmpfaengerEntry("Personalbogen", mail, m.getName(),
          m.getVorname(), m.getMitgliedstyp()));
    }

    if (ohneMail == 1)
    {
      text = ohneMail + " Mitglied hat keine Mail Adresse.";
    }
    else if (ohneMail > 1)
    {
      text = ohneMail + " Mitglieder haben keine Mail Adresse.";
    }
    return new DruckMailEmpfaenger(liste, text);
  }

  @Override
  public List<Mitglied> getEmpfaengerList()
      throws RemoteException, ApplicationException
  {
    return getMitglieder(this.view.getCurrentObject());
  }

  @Override
  public String getInfoText(Object selection) throws RemoteException
  {
    Mitglied[] mitglieder = null;
    String text = "";

    if (selection instanceof Mitglied)
    {
      mitglieder = new Mitglied[] { (Mitglied) selection };
    }
    else if (selection instanceof Mitglied[])
    {
      mitglieder = (Mitglied[]) selection;
    }
    else
    {
      return "";
    }

    // Aufruf aus Mitglieder View
    if (mitglieder != null)
    {
      text = "Es wurden " + mitglieder.length + " Mitglieder ausgewählt";
      String fehlen = "";
      for (Mitglied m : mitglieder)
      {
        if (m.getEmail() == null || m.getEmail().isEmpty())
        {
          fehlen = fehlen + "\n - " + m.getName() + ", " + m.getVorname();
        }
      }
      if (fehlen.length() > 0)
      {
        text += "\nFolgende Mitglieder haben keine Mailadresse:" + fehlen;
      }
    }
    return text;
  }

  public CheckboxInput getZusatzbetrag()
  {
    if (zusatzbetrag != null)
    {
      return zusatzbetrag;
    }
    zusatzbetrag = new CheckboxInput(settings.getBoolean("zusatzbetrag", true));
    return zusatzbetrag;
  }

  public CheckboxInput getMitgliedskonto()
  {
    if (mitgliedskonto != null)
    {
      return mitgliedskonto;
    }
    mitgliedskonto = new CheckboxInput(
        settings.getBoolean("mitgliedskonto", true));
    return mitgliedskonto;
  }

  public CheckboxInput getVermerk()
  {
    if (vermerk != null)
    {
      return vermerk;
    }
    vermerk = new CheckboxInput(settings.getBoolean("vermerk", true));
    return vermerk;
  }

  public CheckboxInput getWiedervorlage()
  {
    if (wiedervorlage != null)
    {
      return wiedervorlage;
    }
    wiedervorlage = new CheckboxInput(
        settings.getBoolean("wiedervorlage", true));
    return wiedervorlage;
  }

  public CheckboxInput getLehrgang()
  {
    if (lehrgang != null)
    {
      return lehrgang;
    }
    lehrgang = new CheckboxInput(settings.getBoolean("lehrgang", true));
    return lehrgang;
  }

  public CheckboxInput getZusatzfelder()
  {
    if (zusatzfelder != null)
    {
      return zusatzfelder;
    }
    zusatzfelder = new CheckboxInput(settings.getBoolean("zusatzfelder", true));
    return zusatzfelder;
  }

  public CheckboxInput getEigenschaften()
  {
    if (eigenschaften != null)
    {
      return eigenschaften;
    }
    eigenschaften = new CheckboxInput(
        settings.getBoolean("eigenschaften", true));
    return eigenschaften;
  }

  public CheckboxInput getArbeitseinsatz()
  {
    if (arbeitseinsatz != null)
    {
      return arbeitseinsatz;
    }
    arbeitseinsatz = new CheckboxInput(
        settings.getBoolean("arbeitseinsatz", true));
    return arbeitseinsatz;
  }

  public CheckboxInput getSpendenbescheinigung()
  {
    if (spendenbescheinigung != null)
    {
      return spendenbescheinigung;
    }
    spendenbescheinigung = new CheckboxInput(
        settings.getBoolean("spendenbescheinigung", true));
    return spendenbescheinigung;
  }

  @Override
  protected void TabRefresh()
  {
    // Nichts tun, hier ist keine Tabelle implementiert
  }

  @Override
  protected JVereinTablePart getTablePart() throws RemoteException
  {
    // Nichts tun, hier ist keine Tabelle implementiert
    return null;
  }

  @Override
  protected String getTableTitle()
  {
    // Nichts tun, hier ist keine Tabelle implementiert
    return null;
  }

  @Override
  protected String getTableSubtitle()
  {
    // Nichts tun, hier ist keine Tabelle implementiert
    return null;
  }

  @Override
  protected String getTableDateiname()
  {
    // Nichts tun, hier ist keine Tabelle implementiert
    return null;
  }
}
