using System;
using System.Collections.Generic;
using System.Collections.ObjectModel;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using DevExpress.Data;
using Xamarin.Forms;

namespace DevExpress.GridDemo {
    public partial class GroupDatesPage {
        ColumnGroupInterval[] intervals;

    public static readonly BindableProperty SelectedIntervalProperty = BindableProperty.Create("SelectedInterval", typeof(ColumnGroupInterval), typeof(GroupDatesPage), ColumnGroupInterval.Default, BindingMode.OneWay, null, (d, o, n) => { ((GroupDatesPage)d).OnColumnGroupIntervalChanged(); });
    public static readonly BindableProperty OrdersProperty = BindableProperty.Create("Orders", typeof(ObservableCollection<Order>), typeof(GroupDatesPage), null);

        public GroupDatesPage() {
            intervals = new ColumnGroupInterval[] {
                ColumnGroupInterval.DateRange,
                ColumnGroupInterval.Date,
                ColumnGroupInterval.DateMonth,
                ColumnGroupInterval.DateQuarter,
                ColumnGroupInterval.DateYear
            };

            InitializeComponent();
            SelectedInterval = intervals[0];
            OnColumnGroupIntervalChanged();
            BindData();
        }

        public ColumnGroupInterval[] Intervals { get { return intervals; } }
        public ColumnGroupInterval SelectedInterval {
            get { return (ColumnGroupInterval)GetValue(SelectedIntervalProperty); }
            set { SetValue(SelectedIntervalProperty, value); }
        }
        public ObservableCollection<Order> Orders {
            get { return (ObservableCollection<Order>)GetValue(OrdersProperty); }
            set { SetValue(OrdersProperty, value); }
        }

        void OnColumnGroupIntervalChanged() {
            colDate.SortOrder = SelectedInterval == ColumnGroupInterval.DateRange ? ColumnSortOrder.Descending : ColumnSortOrder.Ascending;
            colDate.GroupInterval = SelectedInterval;
        }

        async void BindData() {
            this.BindingContext = this;

            MainPageViewModel model =  await LoadData();
            this.Orders = model.Orders;
        }
        Task<MainPageViewModel> LoadData() {
            return Task<MainPageViewModel>.Run(() => new MainPageViewModel(new DemoOrdersRepository()));
        }
    }
}