package ch.zhaw.gartenverwaltung;

import ch.zhaw.gartenverwaltung.backgroundtasks.email.SmtpCredentials;
import ch.zhaw.gartenverwaltung.types.HardinessZone;
import javafx.beans.property.BooleanProperty;
import javafx.beans.property.SimpleBooleanProperty;

import java.util.List;
import java.util.Objects;

/**
 * Singleton Class to store default Settings and User Settings
 */
public class Settings {
    /*
     * The Class instance to use everywhere
     */

    private static final Settings instance;
    /**
     * The current Hardiness zone initialized as default value Zone_8A
     */
    private HardinessZone currentHardinessZone = HardinessZone.ZONE_8A;
    /**
     * Setting to show or hide the Tutorial in Main Menu
     */
    private final BooleanProperty showTutorial = new SimpleBooleanProperty(false);
    /**
     * The SMTP Credentials which are used to send E-Mail Notifications
     * The following Google Account is created for Testing:
     * E-Mail Address: pm3.hs22.it21b.win.team1@gmail.com
     * Account Password: Gartenverwaltung.PM3.2022
     * SMTP Password: bisefhhjtrrhtoqr
     */
    private SmtpCredentials smtpCredentials = new SmtpCredentials("imap.gmail.com", "587", "pm3.hs22.it21b.win.team1@gmail.com", "pm3.hs22.it21b.win.team1@gmail.com", "bisefhhjtrrhtoqr", true);
    /**
     * List of Receivers for E-Mailnotifications. Multiple E-Mailadresses can be separated by ";"
     * Following Public E-mail address  was used for Testing: pm3.hs22.it21b.win.team1@mailinator.com
     * The E-Mail inbox of this address can be found here: https://www.mailinator.com/v4/public/inboxes.jsp?to=pm3.hs22.it21b.win.team1
     */
    private String mailNotificationReceivers = "pm3.hs22.it21b.win.team1@mailinator.com";
    /**
     * String Template to create E-Mail Subject for Notifications
     * Variables: Task Name
     */
    private String mailNotificationSubjectTemplate = "Task %s is due!";
    /**
     * String Template to create E-Mail Text for Notifications
     * Variables: Task Name, plant Name, nextExecution, Task description
     */
    private String mailNotificationTextTemplate = "Dear user\nYour gardentask %s for plant %s is due at %tF. Don't forget to confirm in your application if the task is done.\nTask description:\n%s";

    /**
     * Location of the garden can be set by user (Used for Weather Service)
     */
    private String location = "";

    /*
      Create Instance of Settings
     */
    static {
        instance = new Settings();
    }

    public static Settings getInstance() {
        return Settings.instance;
    }

    /**
     * Private constructor to prevent Classes from creating more instances
     */
    private Settings() {}

    public HardinessZone getCurrentHardinessZone() {
        return currentHardinessZone;
    }

    /**
     * Method to set the current Hardiness Zone. If no Hardiness Zone is given the default zone (ZONE_8A) will be used.
     * @param currentHardinessZone the new Hardiness Zone
     */
    public void setCurrentHardinessZone(HardinessZone currentHardinessZone) {
        this.currentHardinessZone = Objects.requireNonNullElse(currentHardinessZone, HardinessZone.ZONE_8A);
    }

    public void setShowTutorial (boolean showTutorial) {
        this.showTutorial.setValue(showTutorial);
    }

    public BooleanProperty getShowTutorialProperty() {
        return this.showTutorial;
    }

    public boolean getShowTutorial() {
        return this.showTutorial.get();
    }

    public void setLocation(String location) {
        this.location = location;
    }

    public String getLocation() {
        return this.location;
    }
  
    public SmtpCredentials getSmtpCredentials() {
        return smtpCredentials;
    }

    public String getMailNotificationReceivers() {
        return mailNotificationReceivers;
    }

    public String getMailNotificationSubjectTemplate() {
        return mailNotificationSubjectTemplate;
    }

    public String getMailNotificationTextTemplate() {
        return mailNotificationTextTemplate;
    }
}
