using DevExpress.Data.Filtering;
using DevExpress.Mobile.DataGrid;
using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.Threading.Tasks;
using Xamarin.Forms;
using DevExpress.Mobile.DataGrid.Theme;

namespace DevExpress.GridDemo {
    public partial class TestPage : ContentPage {
        class CustomerNameComparer : IComparer<IRowData> {
            #region IComparer implementation
            public int Compare(IRowData x, IRowData y) {
                return Comparer<string>.Default.Compare((string)x.GetFieldValue("Customer.Name"), (string)y.GetFieldValue("Customer.Name"));
            }
            #endregion
        }

        public TestPage() {
            InitializeComponent();
            //List<OrderSeverity> severityList = new List<OrderSeverity>();
            //severityList.Add(new OrderSeverity() { Severity = Severity.Severe, DisplayText = "SEVERE !" });
            //severityList.Add(new OrderSeverity() { Severity = Severity.Moderate, DisplayText = "Moderate" });
            //severityList.Add(new OrderSeverity() { Severity = Severity.Minor, DisplayText = "minor" });
            //colSeverity.ItemsSource = severityList;
            //colSeverity.DisplayMember = "DisplayText";
            //colSeverity.ValueMember = "Severity";
            BindData();

      grid.SwipeButtonShowing += Showing;
      grid.SwipeButtonClick += Click;
      //grid.Theme = new DevExpress.Mobile.DataGrid.Theme.DarkTheme();
            SetAppearanceForControlPanel();
      //

      //grid.Scroller.SetBinding<MainPageViewModel>(GridControl.IsRefreshingProperty, v => v.IsBusy);
            //grid.Filter.ColumnFilters.Add(new GridAutoFilter() { FilterExpression = CriteriaOperator.Parse("[Customer.Name] LIKE 'A%'") });
            
            /*
            grid.dataController.Comparer = new CustomerNameComparer();
            grid.dataController.GetRow(0);
            grid.dataController.Comparer = null;
            grid.dataController.GetRow(0);
            grid.dataController.Comparer = new CustomerNameComparer();
            grid.dataController.GetRow(0);
            */
            //grid.BackgroundColor = Color.Gray;
        }

    void Showing(object sender, SwipeButtonShowingEventArgs e) {
      if(e.RowHandle == 1) {
        if(e.ButtonInfo.ButtonName == "Test1") {
          e.IsVisible = false;
        }
      }
    }

    void Click(object sender, SwipeButtonEventArgs e) {

    }

        void gridCustomizeCell(CustomizeCellEventArgs e) {
            if (e.FieldName == "Total" && !e.IsSelected) {
                string name = (string)grid.GetCellValue(e.RowHandle, "Customer.Name");
                if (!String.IsNullOrEmpty(name) && name.StartsWith("ann", StringComparison.CurrentCultureIgnoreCase)) {
                    decimal total = Convert.ToDecimal(e.Value);
                    if (total < 100)
                        e.BackgroundColor = Color.Red;
                    else if (total > 1000)
                        e.BackgroundColor = Color.Green;
                    e.Handled = true;
                }
            }
        }
        void gridOnCustomUnboundColumnData(object sender, GridColumnDataEventArgs e) {
            if (e.Column.FieldName == "Number3") {
                if (e.IsGetData)
                    e.Value = (int)e.RowData.GetFieldValue("Id") * 3;
                else if (e.IsSetData)
                    e.EditableRowData.SetFieldValue("Id", -371);
            }
        }
        async void BindData() {
            BindingContext = await LoadData();
        }
        Task<MainPageViewModel> LoadData() {
      return Task<MainPageViewModel>.Run(() => new MainPageViewModel(new DemoOrdersRepository()));
        }
        void OnGroupClicked(object sender, EventArgs e) {
            Debug.WriteLine("Click");
            grid.Columns["Customer.Name"].IsGrouped = btnGroup.Text == "Group By Name" ? true : false;
            //if (btnGroup.Text == "Group By Name")
            //    grid.BeginRowEdit(grid.SelectedRowHandle, "Id");
            //else
            //    grid.EndRowEdit(grid.SelectedRowHandle);
            btnGroup.Text = btnGroup.Text == "Group By Name" ? "Remove Grouping" : "Group By Name";
            //grid.DeleteRow(grid.SelectedRowHandle);
        }
        void OnChangeThemeClicked(object sender, EventArgs e) {
      GridThemeManager.ThemeName = GridThemeManager.ThemeName == Themes.Default ? Themes.Dark : Themes.Default;
            SetAppearanceForControlPanel();
            btnChangeTheme.Text = btnChangeTheme.Text == "Dark Theme" ? "Light Theme" : "Dark Theme";
            //string ourText = btnGroup.Text;
            //btnGroup.Text = "Changing...";
            //btnGroup.Text = ourText;
        }
        void OnScrollClicked(object sender, EventArgs e) {
            grid.ScrollToRow(50);
        }
        void SetAppearanceForControlPanel() {
      if (GridThemeManager.ThemeName == Themes.Dark) {
                SetBlackButtons();
            } else {       
                SetWhiteButtons();
            }
        }

        void SetWhiteButtons() {
            controlPanel.BackgroundColor = Color.FromRgb(150, 150, 150);
            btnChangeTheme.ButtonColor = Color.FromRgb(210, 210, 210);
            btnChangeTheme.TextColor = Color.Black;
            btnChangeTheme.ImageSource = "lightChart.png";

            btnGroup.BorderColor = Color.FromRgb(150, 150, 150);
            btnGroup.ButtonColor = Color.FromRgb(210, 210, 210);
            btnGroup.TextColor = Color.Black;
      btnGroup.ImageSource = "lightFolder.png";
        }

        void SetBlackButtons() {
            controlPanel.BackgroundColor = GridThemeManager.Theme.CellCustomizer.BorderColor;
            btnChangeTheme.ButtonColor = Color.Black;
            btnChangeTheme.TextColor = Color.White;
      btnChangeTheme.ImageSource = "darkChart.png";

            btnGroup.BorderColor = GridThemeManager.Theme.CellCustomizer.BorderColor;
            btnGroup.ButtonColor = Color.Black;
            btnGroup.TextColor = Color.White;
      btnGroup.ImageSource = "darkFolder.png";
        }
    }
}