using System;
using System.Collections.Generic;
using System.Linq;
using TimeScheduler.Common;
using TimeScheduler.Domain;
using TimeScheduler.Model;

namespace TimeScheduler.ViewModel
{
  /// <summary>ViewModel für die Diangoseoberfläche</summary>
  class DiagnoseViewModel : NotifyableObject
  {
    #region Konstruktion
    public DiagnoseViewModel() : this(new Domain.Impl.FileDomain()) { Refresh(); }

    /// <summary>Konstruktion</summary>
    public DiagnoseViewModel(IDomain provider)
    {
      Provider = provider;

      CreateCommands();
    }

    /// <summary>Datenbeschaffer</summary>
    protected IDomain Provider { get; private set; }
    #endregion

    #region Eigenschaften
    private IList<DateTime> months_;
    /// <summary>Auflistung der Monate mit Datenbestände</summary>
    public IList<DateTime> Months { get { return months_; } set { if (SetField(ref months_, value) && months_ != null && months_.Count > 0) SelectedMonth = months_.First(); } }

    private DateTime selectedMonth_;
    /// <summary>Aktuell selektierter Monat</summary>
    public DateTime SelectedMonth { get { return selectedMonth_; } set { if (SetField(ref selectedMonth_, value)) Refresh(selectedMonth_); } }

    private IList<ITimeItem> items_;
    public IList<ITimeItem> Items { get { return items_; } set { SetField(ref items_, value); } }
    #endregion

    #region Kommandos
    private void CreateCommands()
    {

    }

    private void Refresh() { Months = Provider.GetMonths().ToList(); }

    private void Refresh(DateTime month)
    {
      // Start und Ende festlegen
      var start = month;
      var end = month.AddMonths(1);

      // Schleife und zwischenspeicherung aufbauen
      var items = new List<ITimeItem>();
      while (start < end)
      {
        // Einzelne Tage abrufen und speichern
        items.AddRange(Provider.GetItems(start));
        start = start.AddDays(1);
      }

      // Und der Oberfläche bekannt geben
      Items = items;
    }
    #endregion  
  }
}
