using System;
using System.Collections.Generic;
using System.Windows;
using System.Linq;
using RainmeterStudio.Business;
using RainmeterStudio.Core.Documents;
using RainmeterStudio.Core.Model.Events;
using RainmeterStudio.UI.Dialogs;
using RainmeterStudio.UI.ViewModel;
using RainmeterStudio.Core.Model;
namespace RainmeterStudio.UI.Controller
{
    public class DocumentController
    {
        #region Managers
        /// 
        /// Gets or sets the document manager
        /// 
        protected DocumentManager DocumentManager { get; private set; }
        /// 
        /// Gets or sets the project manager
        /// 
        protected ProjectManager ProjectManager { get; private set; }
        #endregion
        #region Commands
        public Command DocumentCreateCommand { get; private set; }
        #endregion
        /// 
        /// Triggered when a document is opened
        /// 
        public event EventHandler DocumentOpened
        {
            add { DocumentManager.DocumentOpened += value; }
            remove { DocumentManager.DocumentOpened -= value; }
        }
        /// 
        /// Triggered when a document is closed
        /// 
        public event EventHandler DocumentClosed
        {
            add { DocumentManager.DocumentClosed += value; }
            remove { DocumentManager.DocumentClosed -= value; }
        }
        public Window OwnerWindow { get; set; }
        public DocumentController(DocumentManager documentManager, ProjectManager projectManager)
        {
            DocumentManager = documentManager;
            ProjectManager = projectManager;
            DocumentCreateCommand = new Command("DocumentCreateCommand", () => CreateWindow());
        }
        public void CreateWindow(IDocumentTemplate defaultFormat = null, string defaultPath = "")
        {
            // Show dialog
            var dialog = new CreateDocumentDialog(this)
            {
                Owner = OwnerWindow,
                SelectedTemplate = new DocumentTemplateViewModel(defaultFormat),
                SelectedPath = defaultPath
            };
            bool? res = dialog.ShowDialog();
            if (!res.HasValue || !res.Value)
                return;
            var format = dialog.SelectedTemplate;
            var path = dialog.SelectedPath;
            // Call manager
            DocumentManager.Create(format.Template);
        }
        public void Create(IDocumentTemplate format)
        {
            // Call manager
            DocumentManager.Create(format);
        }
        /// 
        /// Gets a list of document templates view models
        /// 
        public IEnumerable DocumentTemplates
        {
            get
            {
                return DocumentManager.DocumentTemplates.Select(t => new DocumentTemplateViewModel(t));
            }
        }
    }
}