using System;
using System.Linq;
using AyaNova.Models;

namespace AyaNova.Util
{

    /// <summary>
    /// Contains static mirror copy in memory of Operations related settings stored in db 
    /// that are accessed frequently by server
    /// </summary>
    internal static class ServerGlobalOpsSettingsCache
    {
        //BOOT flag, set during boot and 
        //is used to control generator from starting
        internal static bool BOOTING { get; set; }

        internal static GlobalOpsBackupSettings Backup { get; set; }
        internal static GlobalOpsNotificationSettings Notify { get; set; }
        internal static DateTime NextBackup { get; set; }
        /// <summary>
        /// Populate and / or create the settings
        /// </summary>     
        internal static void Initialize(AyContext ct = null)
        {
            //fetch or create as not provided (meaning this was called from Startup.cs)
            Backup = ct.GlobalOpsBackupSettings.FirstOrDefault(z => z.Id == 1);
            if (Backup == null)
            {
                Backup = new GlobalOpsBackupSettings();
                ct.GlobalOpsBackupSettings.Add(Backup);
                ct.SaveChanges();
            }
            NextBackup = FileUtil.MostRecentAutomatedBackupFileDate();
            SetNextBackup();


            Notify = ct.GlobalOpsNotificationSettings.FirstOrDefault(z => z.Id == 1);
            if (Notify == null)
            {
                Notify = new GlobalOpsNotificationSettings();
                ct.GlobalOpsNotificationSettings.Add(Notify);
                ct.SaveChanges();
            }
        }

        internal static void SetNextBackup()
        {
            DateTime utcNow = DateTime.UtcNow;
            //Has last backup run more than 24 hours ago?
            if (NextBackup < utcNow.AddHours(-24))
            {
                //set it to today then
                NextBackup = new DateTime(utcNow.Year, utcNow.Month, utcNow.Day, Backup.BackupTime.Hour, Backup.BackupTime.Minute, 0, DateTimeKind.Utc);
                //Make sure next backup is in the future
                if (NextBackup < utcNow)
                    NextBackup = NextBackup.AddDays(1);
            }
            else
            {
                //less than 24 hours, set it to tomorrow
                NextBackup = new DateTime(utcNow.Year, utcNow.Month, utcNow.Day, Backup.BackupTime.Hour, Backup.BackupTime.Minute, 0, DateTimeKind.Utc);
                NextBackup = NextBackup.AddDays(1);
            }
        }

    }//eoc
}//eons