using System;
using System.Threading.Tasks;
using System.Collections.Generic;
using Windows.UI.Xaml;
using Windows.UI.Xaml.Controls;
using Windows.Storage;

// 基本ページのアイテム テンプレートについては、http://go.microsoft.com/fwlink/?LinkId=234237 を参照してください

namespace FooEditor
{
    /// <summary>
    /// 多くのアプリケーションに共通の特性を指定する基本ページ。
    /// </summary>
    public sealed partial class MainPage : FooEditor.Common.LayoutAwarePage
    {
        MainPageViewModel vm;
        public MainPage()
        {
            this.InitializeComponent();
            this.vm = new MainPageViewModel();
            this.vm.ContentChanged += Vm_ContentChanged;
            this.DataContext = this.vm;
            this.DocumentCollectionBar.DataContext = this.vm;
        }

        /// <summary>
        /// このページには、移動中に渡されるコンテンツを設定します。前のセッションからページを
        /// 再作成する場合は、保存状態も指定されます。
        /// </summary>
        /// <param name="navigationParameter">このページが最初に要求されたときに
        /// <see cref="Frame.Navigate(Type, Object)"/> に渡されたパラメーター値。
        /// </param>
        /// <param name="pageState">前のセッションでこのページによって保存された状態の
        /// ディクショナリ。ページに初めてアクセスするとき、状態は null になります。</param>
        protected override async void LoadState(Object navigationParameter, Dictionary<String, Object> pageState)
        {
            this.BottomAppBar.Opened += this.AppBar_Opened;
            await this.vm.NavigateHomePage(pageState);
        }

        public async Task OnLoadFile(IReadOnlyCollection<IStorageItem> files)
        {
            await this.vm.CreateDocuments(files);
        }

        public void NavigateHome()
        {
            this.Frame.Navigate(typeof(HomePage), this.vm.DocumentCollection);
        }

        private void Vm_ContentChanged(object sender, ContentType e)
        {
            if (e == ContentType.Home)
                this.NavigateHome();
            else
                this.Frame.Content = this.vm.DocumentCollection.Current.doc;
        }

        void AppBar_Opened(object sender, object e)
        {
            AppBar appBar = (AppBar)sender;
            appBar.IsOpen = !this.vm.IsAppBarClosed();
        }

        /// <summary>
        /// アプリケーションが中断される場合、またはページがナビゲーション キャッシュから破棄される場合、
        /// このページに関連付けられた状態を保存します。値は、
        /// <see cref="SuspensionManager.SessionState"/> のシリアル化の要件に準拠する必要があります。
        /// </summary>
        /// <param name="pageState">シリアル化可能な状態で作成される空のディクショナリ。</param>
        protected override void SaveState(Dictionary<String, Object> pageState)
        {
            this.vm.LeaveMainPage(pageState);
        }

        private void DocumentCollectionList_ItemClick(object sender, ItemClickEventArgs e)
        {
            DocumentPageInfo info = (DocumentPageInfo)e.ClickedItem;
            this.vm.DocumentCollection.ActiveDocument(info);
        }
    }
}
