using System.Collections.Generic;

using BS.Shared;

namespace BeWo.Core.Config
{
    public class AppSettings
    {
        private bool mIsServiceRecordNoticeMandatory = true;

        private bool mIsPasswordSecurityActiv = false;

        private bool mIsEndDateVisible = true;

        private bool mShowOnlyMySupportConcepts = true;

        private WindowStateType mWindowStateType = WindowStateType.Default;

        private ServiceRecordTimeInterval mLastSelectedServiceRecordTimeInterval = ServiceRecordTimeInterval.All;

        public enum WindowStateType
        {
            Default,
            Maximised
        }

        public bool IsServiceRecordNoticeMandatory
        {
            get { return mIsServiceRecordNoticeMandatory; }

            set { mIsServiceRecordNoticeMandatory = value; }
        }

        public bool IsPasswordSecurityActiv
        {
            get { return mIsPasswordSecurityActiv; }

            set { mIsPasswordSecurityActiv = value; }
        }

        public bool IsEndDateVisible
        {
            get { return mIsEndDateVisible; }

            set { mIsEndDateVisible = value; }
        }

        public int MaxDaysEditServiceRecordsAllowed { get; set; }

        public int HilfeplanAuslaufAuswahl { get; set; }

        public int AnzTageZeiterfassErfolgt { get; set; }

        public bool HideServiceRecordInsertedByAndInsertedOn { get; set; }

        public bool ShowAdvisedAttendedFlag { get; set; }

        private bool _showAllClients;

        public bool ShowAllClients
        {
            get { return _showAllClients; }
            set
            {
                if (_showAllClients != value)
                {
                    _showAllClients = value;
                    IsDirty = true;
                }
            }
        }

        public bool ShowDatevFields { get; set; }

        private bool _showExpiredSupportConcepts = true;

        public bool ShowExpiredSupportConcepts
        {
            get { return _showExpiredSupportConcepts; }
            set
            {
                if (_showExpiredSupportConcepts != value)
                {
                    _showExpiredSupportConcepts = value;
                    IsDirty = true;
                }
            }
        }

        private bool _showOnlyMyClients;

        public bool ShowOnlyMyClients
        {
            get { return _showOnlyMyClients; }
            set
            {
                if (_showOnlyMyClients != value)
                {
                    _showOnlyMyClients = value;
                    IsDirty = true;
                }
            }
        }

        private bool _showServiceRecordGridControl;

        public bool ShowServiceRecordGridControl
        {
            get { return _showServiceRecordGridControl; }
            set
            {
                if (_showServiceRecordGridControl != value)
                {
                    _showServiceRecordGridControl = value;
                    IsDirty = true;
                }
            }
        }

        public bool ShowLargeCustomerNotice { get; set; }

        public bool ShowOnlyMySupportConcepts
        {
            get { return mShowOnlyMySupportConcepts; }

            set
            {
                if (mShowOnlyMySupportConcepts != value)
                {
                    mShowOnlyMySupportConcepts = value;
                    IsDirty = true;
                }
            }
        }

        public bool ZeigeNurMeineTermine
        {
            get { return mZeigeNurMeineTermine; }
            set
            {
                if (mZeigeNurMeineTermine != value)
                {
                    mZeigeNurMeineTermine = value;
                    IsDirty = true;
                }
            }
        }

	    private double _DocumentationFontSize = 11d;
	    public double DocumentationFontSize
	    {
			get { return _DocumentationFontSize; }
		    set
		    {
			    if (!_DocumentationFontSize.Equals(value))
			    {
				    _DocumentationFontSize = value;
				    IsDirty = true;
			    }
		    }
	    }

        private string _startupPanelMaximized;

        public string StartupPanelMaximized
        {
            get { return _startupPanelMaximized; }
            set
            {
                string newValue = value;
                if (newValue == string.Empty)
                    newValue = null;
                if (_startupPanelMaximized != newValue)
                {
                    _startupPanelMaximized = value;
                    IsDirty = true;
                }
            }
        }

        private List<string> _startupPanelOrder;

        public List<string> StartupPanelOrder
        {
            get { return _startupPanelOrder; }
            set
            {
                if (IsOrderDifferent(_startupPanelOrder, value))
                {
                    _startupPanelOrder = value;
                    IsDirty = true;
                }
            }
        }

	    private int _NDays;
        private bool mZeigeNurMeineTermine;

        public int NDays
		{
			get { return _NDays; }

			set
			{
				if (_NDays != value)
				{
					_NDays = value;
					IsDirty = true;
				}
			}
		}

        private bool IsOrderDifferent(List<string> oldOrder, List<string> newOrder)
        {
            if (oldOrder == null && newOrder != null)
                return true;
            else if (oldOrder != null && newOrder == null)
                return true;
            else if (oldOrder != null && newOrder != null)
            {
                if (oldOrder.Count != newOrder.Count)
                    return true;
                else
                {
                    for (int i = 0; i < oldOrder.Count; i++)
                    {
                        if (newOrder[i] != oldOrder[i])
                            return true;
                    }
                }
            }
            return false;
        }

        public WindowStateType WindowState
        {
            get { return mWindowStateType; }

            set
            {
                if (mWindowStateType != value)
                {
                    mWindowStateType = value;
                    IsDirty = true;
                }
            }
        }

        public ServiceRecordTimeInterval LastSelectedServiceRecordTimeInterval
        {
            get { return mLastSelectedServiceRecordTimeInterval; }

            set
            {
                if (mLastSelectedServiceRecordTimeInterval != value)
                {
                    mLastSelectedServiceRecordTimeInterval = value;
                    IsDirty = true;
                }
            }
        }

        public bool IsDirty { get; set; }

        public string TimeRecordingMenuName { get; set; }

		public bool ShowDistanceFields { get; set; }

		public bool ShowTeamNews { get; set; }

		public bool ShowMarker { get; set; }

		public bool ShowResources { get; set; }

		public bool ShowAdditionalService { get; set; }

		public bool ShowCustomerDistanceFields { get; set; }
		
		public bool ShowRoundedDurationInEmployeeAnalysis { get; set; }

		public bool ShowAnnualReport { get; set; }

		public bool IsSchedulerAllowed { get; set; }

		public bool IsWohnheimAllowed { get; set; }

		public bool IsMedicationAllowed { get; set; }

		public bool PrinterSettingsUsePaperKind { get; set; }

		public bool PrinterSettingsUseLandscape { get; set; }

		public bool PrinterSettingsUseMargins { get; set; }
	}
}