private async Task <EvaluationResponse> GetEvaluationAsync(InterpretationResponse.Interpretation i)
 {
     return(JsonConvert.DeserializeObject <EvaluationResponse>(await _client.GetStringAsync("/evaluate?expr=" + Uri.EscapeDataString(i.GetFirstQuery()) + "&attributes=person.first_name,person.last_name,type,start,end&count=200")));
 }
        public MainPage()
        {
            this.InitializeComponent();

            _client.DefaultRequestHeaders.Accept.Add(new System.Net.Http.Headers.MediaTypeWithQualityHeaderValue("application/json"));

            var focusStream    = Observable.FromEventPattern <RoutedEventArgs>(input, "GotFocus");
            var keyInputStream = Observable.FromEventPattern <TextChangedEventArgs>(input, "TextChanged");
            var keyPressTream  = Observable.FromEventPattern <KeyRoutedEventArgs>(input, "KeyDown");
            var enterStream    = keyPressTream.Where(e => e.EventArgs.Key == Windows.System.VirtualKey.Enter);

            keyPressTream
            .Where(e => e.EventArgs.Key == Windows.System.VirtualKey.Tab)
            .Subscribe(e =>
            {
                e.EventArgs.Handled = true;
                SetCurrentInterpretationAsText();
            });

            keyInputStream.Throttle(TimeSpan.FromMilliseconds(200))
            .Merge <object>(focusStream)
            .ObserveOnDispatcher()
            .Select(_ => input.Text)
            .DistinctUntilChanged()
            .Select(text => GetIntepretationsAsync(text).ToObservable())
            .Switch()
            .ObserveOnDispatcher()
            .Subscribe(
                response =>
            {
                suggestions.Children.Clear();
                results.Text = "";

                _currentInterpretation = response.interpretations.FirstOrDefault();

                foreach (var i in response.interpretations)
                {
                    StackPanel item  = new StackPanel();
                    item.Orientation = Orientation.Horizontal;

                    foreach (var e in i.GetEntities())
                    {
                        var block      = new TextBlock();
                        block.Margin   = new Thickness(0, 0, 5, 0);
                        block.FontSize = 20;
                        block.Text     = e.display;
                        switch (e.type)
                        {
                        case Entity.Type.Absence:
                            block.Foreground = new SolidColorBrush(Colors.Red);
                            break;

                        case Entity.Type.FirstName:
                            block.Foreground = new SolidColorBrush(Colors.ForestGreen);
                            break;

                        case Entity.Type.LastName:
                            block.Foreground = new SolidColorBrush(Colors.ForestGreen);
                            break;

                        case Entity.Type.Date:
                            block.Foreground = new SolidColorBrush(Colors.MediumSlateBlue);
                            break;

                        default:
                            break;
                        }
                        item.Children.Add(block);
                    }

                    item.Tapped += (_, __) =>
                    {
                        _currentInterpretation = i;
                        SetCurrentInterpretationAsText();
                    };
                    suggestions.Children.Add(item);
                }
            },
                error => Debug.WriteLine(error)
                );

            Observable.FromEventPattern <RoutedEventArgs>(submit, "Click")
            .Merge <object>(enterStream)
            .Select(_ => _currentInterpretation)
            .Where(i => i != null)
            .Select(i => GetEvaluationAsync(i).ToObservable())
            .Switch()
            .ObserveOnDispatcher()
            .Subscribe(e =>
            {
                results.Text = "";
                var absences = e.GetAbsences();
                foreach (var a in absences)
                {
                    results.Text += a.ToString() + "\n";
                }
            });
        }