using System;
using System.Collections.Generic;
using System.IO;
using System.Threading.Tasks;
using DevExpress.Export;
using DevExpress.Mobile.Core;
using DevExpress.Mobile.Core.ConditionalFormatting;
using DevExpress.Mobile.DataGrid;
using DevExpress.Mobile.IO;
using Xamarin.Forms;

namespace DevExpress.GridDemo {
    public partial class ConditionalFormattingPage {
        readonly Dictionary<string, FormatConditionBase> formats = new Dictionary<string, FormatConditionBase>();

        public ConditionalFormattingPage() {
            PopulateFormats();
            InitializeComponent();
            foreach (string name in formats.Keys)
                cbConditionalFormatting.Items.Add(name);
            cbConditionalFormatting.SelectedIndex = 0;
            BindData();
        }

        void OnConditionalFormattingSelectedIndexChanged(object sender, EventArgs e) {
            ApplyConditionalFormatting();
        }
        async void BindData() {
            MainPageViewModel model = await LoadData();
            BindingContext = model;
        }
        Task<MainPageViewModel> LoadData() {
            return Task<MainPageViewModel>.Run(() => new MainPageViewModel(new DemoOrdersRepository()));
        }
        FormatConditionBase GetCurrentFormatCondition() {
            string name = cbConditionalFormatting.Items[cbConditionalFormatting.SelectedIndex];
            FormatConditionBase result;
            if (formats.TryGetValue(name, out result))
                return result;
            return null;
        }
        void ApplyConditionalFormatting() {
            grid.FormatConditions.Clear();
            FormatConditionBase condition = GetCurrentFormatCondition();
            if (condition != null)
                grid.FormatConditions.Add(condition);
        }

        void PopulateFormats() {
            AddDataBarFormatCondition();
            AddExpressionFormatCondition();
            AddColorScaleFormatCondition();
            AddTopBottomFormatCondition();
      AddIconSetFormatCondition();
            AddNoFormatCondition();
        }

        void AddExpressionFormatCondition() {
            FormatCondition condition = new FormatCondition();
            condition.FieldName = "Total";
            condition.Expression = "[Total] > 3000";
            condition.PredefinedFormatName = "BoldText";
            condition.ApplyToRow = true;
            formats.Add("Bold Totals > 3000", condition);
        }
        void AddColorScaleFormatCondition() {
            ColorScaleFormatCondition condition = new ColorScaleFormatCondition();
            condition.FieldName = "Total";
            condition.PredefinedFormatName = "RedYellowGreenColorScale";
            formats.Add("Totals Color Scale", condition);
        }
        void AddTopBottomFormatCondition() {
            TopBottomRuleFormatCondition condition = new TopBottomRuleFormatCondition();
            condition.FieldName = "Total";
            condition.Threshold = 5;
            condition.Rule = TopBottomRule.TopItems;
            condition.PredefinedFormatName = "YellowFillWithDarkYellowText";
            formats.Add("Top 5 Totals", condition);
        }
        void AddDataBarFormatCondition() {
            DataBarFormatCondition condition = new DataBarFormatCondition();
            condition.FieldName = "Total";
            condition.PredefinedFormatName = "LightBlueGradientDataBar";
            formats.Add("Totals Data Bars", condition);
        }
        void AddIconSetFormatCondition() {
            IconSetFormatCondition condition = new IconSetFormatCondition();
            condition.FieldName = "Total";
            condition.PredefinedFormatName = "Flags3IconSet";
            formats.Add("Flag Totals", condition);
        }
        void AddNoFormatCondition() {
            formats.Add("None", null);
        }
    }
}