using Elwig.Helpers;
using System;
using System.Threading.Tasks;
using System.Windows;
using System.Windows.Threading;

namespace Elwig.Windows {
    public abstract class ContextWindow : Window {

        protected AppDbContext Context { get; private set; }
        protected bool LockContext { get; set; } = false;

        private readonly DispatcherTimer ContextRenewTimer;
        private static readonly int ContextRenewSec = 10;

        public ContextWindow() : base() {
            ContextRenewTimer = new DispatcherTimer();
            ContextRenewTimer.Tick += new EventHandler(OnRenewContext);
            ContextRenewTimer.Interval = new TimeSpan(0, 0, ContextRenewSec);
            ContextRenewTimer.Start();
            Context = new();
            Loaded += OnLoaded;
        }

        private void OnRenewContext(object? sender, EventArgs evt) {
            if (LockContext || !Context.HasBackendChanged) return;
            Context.Dispose();
            Context = new();
            RenewContext().GetAwaiter().GetResult();
        }

        private void OnLoaded(object sender, RoutedEventArgs evt) {
            RenewContext().GetAwaiter().GetResult();
        }

        protected override void OnClosed(EventArgs evt) {
            base.OnClosed(evt);
            Context.Dispose();
        }

        abstract protected Task RenewContext();
    }
}