using System.Windows;
using System.Windows.Controls;
using ThinkGeo.MapSuite.SilverlightCore;
using ThinkGeo.MapSuite.SilverlightEdition;
using CSharp_Silverlight_HowDoISamples;
using System;
using System.Globalization;
using System.Collections.ObjectModel;
using System.Collections.Generic;

namespace CSharp_Silverlight_HowDoISamples.Samples
{
    public partial class GetRoadInformationByRoadId : UserControl
    {
        private InMemoryFeatureLayer currentRoadLayer;
        private InMemoryFeatureLayer adjacentRoadsLayer;

        public GetRoadInformationByRoadId()
        {
            InitializeComponent();
            this.Loaded += new RoutedEventHandler(GetRoadInformationByRoadId_Loaded);
        }

        void GetRoadInformationByRoadId_Loaded(object sender, RoutedEventArgs e)
        {
            Map1.MapUnit = GeographyUnit.DecimalDegree;

            WorldMapKitWmsSilverlightOverlay baseOverlay = new WorldMapKitWmsSilverlightOverlay();
            Map1.Overlays.Add(baseOverlay);

            LayerOverlay overlay = new LayerOverlay();
            Map1.Overlays.Add("routeOverlay", overlay);

            currentRoadLayer = new InMemoryFeatureLayer();
            currentRoadLayer.Open();
            currentRoadLayer.ZoomLevelSet.ZoomLevel01.DefaultLineStyle = new LineStyle(new GeoPen(GeoColor.FromArgb(100, GeoColor.SimpleColors.Red), 6));
            currentRoadLayer.ZoomLevelSet.ZoomLevel01.ApplyUntilZoomLevel = ApplyUntilZoomLevel.Level20;
            overlay.Layers.Add("currentRoadLayer", currentRoadLayer);

            adjacentRoadsLayer = new InMemoryFeatureLayer();
            adjacentRoadsLayer.Open();
            adjacentRoadsLayer.ZoomLevelSet.ZoomLevel01.DefaultLineStyle = new LineStyle(new GeoPen(GeoColor.FromArgb(100, GeoColor.SimpleColors.Yellow), 6));
            adjacentRoadsLayer.ZoomLevelSet.ZoomLevel01.ApplyUntilZoomLevel = ApplyUntilZoomLevel.Level20;
            overlay.Layers.Add("adjacentRoadsLayer", adjacentRoadsLayer);

            Map1.CurrentExtent = new RectangleShape(-97.719413308724725, 30.265265470131723, -97.714209823235834, 30.261547928437082);
        }

        private void GetRoadInformation_Click(object sender, RoutedEventArgs e)
        {
            GeoDataService.GeoDataGettingClient client = new CSharp_Silverlight_HowDoISamples.GeoDataService.GeoDataGettingClient();
            client.GetRouteSegmentByFeatureIdCompleted += new System.EventHandler(client_GetRouteSegmentByFeatureIdCompleted);
            client.GetRouteSegmentByFeatureIdAsync(txtFeatureId.Text);
        }

        void client_GetRouteSegmentByFeatureIdCompleted(object sender, CSharp_Silverlight_HowDoISamples.GeoDataService.GetRouteSegmentByFeatureIdCompletedEventArgs e)
        {
            if (e.Error == null)
            {
                Dictionary routeSegment = e.Result;
                RenderRoadInformation(routeSegment);
                RenderAdjacentRoadsInformation(routeSegment);
            }
        }

        private void RenderRoadInformation(Dictionary road)
        {
            string featureId = road["featureId"].Split(new string[] { "::" }, StringSplitOptions.RemoveEmptyEntries)[0];
            RequestFeature(featureId);

            txtStartPoint.Text = road["startPoint"];
            txtEndPoint.Text = road["endPoint"];

            switch (road["type"])
            {
                case "0":
                    txtRoadType.Text = "Local Road";
                    break;
                case "1":
                    txtRoadType.Text = "Major Road";
                    break;
                case "2":
                    txtRoadType.Text = "High Way";
                    break;
                default:
                    break;
            }
        }

        private void RequestFeature(string featureId)
        {
            GeoDataService.GeoDataGettingClient client = new CSharp_Silverlight_HowDoISamples.GeoDataService.GeoDataGettingClient();
            client.GetFeatureByIdCompleted += new EventHandler(client_GetFeatureByIdCompleted);
            client.GetFeatureByIdAsync(featureId);
        }

        void client_GetFeatureByIdCompleted(object sender, CSharp_Silverlight_HowDoISamples.GeoDataService.GetFeatureByIdCompletedEventArgs e)
        {
            if (e.Error == null)
            {
                string feature = e.Result;
                currentRoadLayer.InternalFeatures.Clear();
                Feature silverlightFeature = new Feature(BaseShape.CreateShapeFromWellKnownData(feature));
                currentRoadLayer.InternalFeatures.Add(silverlightFeature);

                LineShape line = ((MultilineShape)silverlightFeature.GetShape()).Lines[0];
                txtLength.Text = Math.Round(line.GetLength(Map1.MapUnit, DistanceUnit.Meter), 4).ToString(CultureInfo.InvariantCulture);
                Map1.Refresh();
            }
        }

        private void RenderAdjacentRoadsInformation(Dictionary road)
        {
            ObservableCollection featureIds = new ObservableCollection();
            foreach (string id in road["startAdjacentIds"].Split('_'))
            {
                featureIds.Add(id);
            }
            foreach (string id in road["endAdjacentIds"].Split('_'))
            {
                featureIds.Add(id);
            }

            GeoDataService.GeoDataGettingClient client = new CSharp_Silverlight_HowDoISamples.GeoDataService.GeoDataGettingClient();
            client.GetFeaturesByIdsCompleted += new EventHandler(client_GetFeaturesByIdsCompleted);
            client.GetFeaturesByIdsAsync(featureIds);
        }

        void client_GetFeaturesByIdsCompleted(object sender, CSharp_Silverlight_HowDoISamples.GeoDataService.GetFeaturesByIdsCompletedEventArgs e)
        {
            if (e.Error == null)
            {
                Collection features = e.Result;
                adjacentRoadsLayer.InternalFeatures.Clear();
                foreach (string wkt in features)
                {
                    Feature silverlightFeature = new Feature(BaseShape.CreateShapeFromWellKnownData(wkt));
                    adjacentRoadsLayer.InternalFeatures.Add(silverlightFeature);
                }
                Map1.Refresh();
            }
        }
    }
}