using System.ComponentModel;
using System.ComponentModel.DataAnnotations;
using System.Web.Mvc;
using NzbDrone.Core.Model;
using NzbDrone.Web.Helpers.Validation;

namespace NzbDrone.Web.Models
{
    public class NotificationSettingsModel
    {
        //XBMC
        [DisplayName("Enabled")]
        [Description("Enable notifications for XBMC?")]
        public bool XbmcEnabled { get; set; }

        [DisplayName("Notify on Grab")]
        [Description("Send notification when episode is sent to SABnzbd?")]
        public bool XbmcNotifyOnGrab { get; set; }

        [DisplayName("Notify on Download")]
        [Description("Send notification when episode is downloaded?")]
        public bool XbmcNotifyOnDownload { get; set; }

        [DisplayName("Update on Download and Rename")]
        [Description("Update XBMC library after episode is downloaded or renamed?")]
        public bool XbmcUpdateLibrary { get; set; }

        [DisplayName("Clean on Download/Rename")]
        [Description("Clean XBMC library after an episode is downloaded or renamed?")]
        public bool XbmcCleanLibrary { get; set; }

        [DataType(DataType.Text)]
        [DisplayName("Hosts")]
        [Description("XBMC hosts with port, comma separated")]
        [DisplayFormat(ConvertEmptyStringToNull = false)]
        [RequiredIf("XbmcEnabled", true, ErrorMessage = "Required when XBMC Notifications are enabled")]
        public string XbmcHosts { get; set; }

        [DataType(DataType.Text)]
        [DisplayName("Username")]
        [Description("XBMC webserver username")]
        [DisplayFormat(ConvertEmptyStringToNull = false)]
        public string XbmcUsername { get; set; }

        [DataType(DataType.Text)]
        [DisplayName("Password")]
        [Description("XBMC webserver password")]
        [DisplayFormat(ConvertEmptyStringToNull = false)]
        public string XbmcPassword { get; set; }

        [DisplayName("Always Update")]
        [Description("Update Library even when a video is playing?")]
        public bool XbmcUpdateWhenPlaying { get; set; }

        //SMTP
        [DisplayName("Enabled")]
        [Description("Enable Email notifications?")]
        public bool SmtpEnabled { get; set; }

        [DisplayName("Notify on Grab")]
        [Description("Send notification when episode is sent to SABnzbd?")]
        public bool SmtpNotifyOnGrab { get; set; }

        [DisplayName("Notify on Download")]
        [Description("Send notification when episode is downloaded?")]
        public bool SmtpNotifyOnDownload { get; set; }

        [DataType(DataType.Text)]
        [DisplayName("Server")]
        [Description("SMTP Server Hostname")]
        [DisplayFormat(ConvertEmptyStringToNull = false)]
        [RequiredIf("SmtpEnabled", true, ErrorMessage = "Required when SMTP Notifications are enabled")]
        public string SmtpServer{ get; set; }

        [DataType(DataType.Text)]
        [DisplayName("Port")]
        [Description("SMTP Server Port")]
        [DisplayFormat(ConvertEmptyStringToNull = false)]
        [RequiredIf("SmtpEnabled", true, ErrorMessage = "Required when SMTP Notifications are enabled")]
        public int SmtpPort { get; set; }

        [DisplayName("SSL")]
        [Description("Does the SMTP Server use SSL?")]
        [DisplayFormat(ConvertEmptyStringToNull = false)]
        public bool SmtpUseSsl { get; set; }

        [DataType(DataType.Text)]
        [DisplayName("Username")]
        [Description("SMTP Server authentication username")]
        [DisplayFormat(ConvertEmptyStringToNull = false)]
        public string SmtpUsername { get; set; }

        [DataType(DataType.Text)]
        [DisplayName("Password")]
        [Description("SMTP Server authentication password")]
        [DisplayFormat(ConvertEmptyStringToNull = false)]
        public string SmtpPassword { get; set; }

        [DataType(DataType.Text)]
        [DisplayName("Send From Address")]
        [Description("Sender Email address")]
        [DisplayFormat(ConvertEmptyStringToNull = false)]
        [RequiredIf("SmtpEnabled", true, ErrorMessage = "Required when SMTP Notifications are enabled")]
        public string SmtpFromAddress { get; set; }

        [DataType(DataType.Text)]
        [DisplayName("Send To Addresses")]
        [Description("Comma separated list of addresses to email")]
        [DisplayFormat(ConvertEmptyStringToNull = false)]
        [RequiredIf("SmtpEnabled", true, ErrorMessage = "Required when SMTP Notifications are enabled")]
        public string SmtpToAddresses { get; set; }

        //Twitter
        [DisplayName("Enabled")]
        [Description("Enable notifications for Twitter?")]
        public bool TwitterEnabled { get; set; }

        [DisplayName("Notify on Grab")]
        [Description("Send notification when episode is sent to SABnzbd?")]
        public bool TwitterNotifyOnGrab { get; set; }

        [DisplayName("Notify on Download")]
        [Description("Send notification when episode is downloaded?")]
        public bool TwitterNotifyOnDownload { get; set; }

        //Growl
        [DisplayName("Enabled")]
        [Description("Enable notifications for Growl?")]
        public bool GrowlEnabled { get; set; }

        [DisplayName("Notify on Grab")]
        [Description("Send notification when episode is sent to SABnzbd?")]
        public bool GrowlNotifyOnGrab { get; set; }

        [DisplayName("Notify on Download")]
        [Description("Send notification when episode is downloaded?")]
        public bool GrowlNotifyOnDownload { get; set; }

        [DataType(DataType.Text)]
        [DisplayName("Host running Growl")]
        [Description("Host or IP Address:Port")]
        [DisplayFormat(ConvertEmptyStringToNull = false)]
        [RequiredIf("GrowlEnabled", true, ErrorMessage = "Required when Growl Notifications are enabled")]
        public string GrowlHost { get; set; }

        [DataType(DataType.Text)]
        [DisplayName("Growl host Password")]
        [Description("Password is required if Growl is running on another system")]
        [DisplayFormat(ConvertEmptyStringToNull = false)]
        public string GrowlPassword { get; set; }


        //Prowl
        [DisplayName("Enabled")]
        [Description("Enable notifications for Prowl?")]
        public bool ProwlEnabled { get; set; }

        [DisplayName("Notify on Grab")]
        [Description("Send notification when episode is sent to SABnzbd?")]
        public bool ProwlNotifyOnGrab { get; set; }

        [DisplayName("Notify on Download")]
        [Description("Send notification when episode is downloaded?")]
        public bool ProwlNotifyOnDownload { get; set; }

        [DataType(DataType.Text)]
        [DisplayName("API Keys")]
        [Description("Comma-Separated list of API Keys")]
        [DisplayFormat(ConvertEmptyStringToNull = false)]
        [RequiredIf("ProwlEnabled", true, ErrorMessage = "Required when Prowl Notifications are enabled")]
        public string ProwlApiKeys { get; set; }

        [DataType(DataType.Text)]
        [DisplayName("Priority")]
        [Description("Priority to send alerts to Prowl with")]
        [DisplayFormat(ConvertEmptyStringToNull = false)]
        public int ProwlPriority { get; set; }

        public SelectList ProwlPrioritySelectList { get; set; }

        //Plex
        [DisplayName("Enabled")]
        [Description("Enable notifications for Plex?")]
        public bool PlexEnabled { get; set; }

        [DisplayName("Notify on Grab")]
        [Description("Send notification when episode is sent to SABnzbd?")]
        public bool PlexNotifyOnGrab { get; set; }

        [DisplayName("Notify on Download")]
        [Description("Send notification when episode is downloaded?")]
        public bool PlexNotifyOnDownload { get; set; }

        [DisplayName("Update on Download and Rename")]
        [Description("Update Plex library after episode is downloaded or renamed?")]
        public bool PlexUpdateLibrary { get; set; }

        [DataType(DataType.Text)]
        [DisplayName("Server Host")]
        [Description("Plex Server host with port")]
        [DisplayFormat(ConvertEmptyStringToNull = false)]
        [RequiredIf("PlexUpdateLibrary", true, ErrorMessage = "Required when Plex Library Update is Enabled")]
        public string PlexServerHost { get; set; }

        [DataType(DataType.Text)]
        [DisplayName("Client Hosts")]
        [Description("Plex client hosts with port, comma separated for multiple clients")]
        [RequiredIfAny(new string[]{ "PlexNotifyOnGrab", "PlexNotifyOnDownload" }, new object[]{ true, true }, ErrorMessage = "Required when Plex Notifications are enabled")]
        [DisplayFormat(ConvertEmptyStringToNull = false)]
        public string PlexClientHosts { get; set; }

        [DataType(DataType.Text)]
        [DisplayName("Username")]
        [Description("Plex client webserver username")]
        [DisplayFormat(ConvertEmptyStringToNull = false)]
        public string PlexUsername { get; set; }

        [DataType(DataType.Text)]
        [DisplayName("Password")]
        [Description("Plex client webserver password")]
        [DisplayFormat(ConvertEmptyStringToNull = false)]
        public string PlexPassword { get; set; }
    }
}