using System;
using System.Globalization;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Media.Imaging;
using ThinkGeo.MapSuite.SilverlightCore;
using ThinkGeo.MapSuite.SilverlightEdition;

namespace CSharp_Silverlight_HowDoISamples.Samples
{
    public partial class ServiceAreaDefinition : UserControl
    {
        private SimpleMarkerOverlay markerOverlay;
        private InMemoryFeatureLayer routeLayer;
        private PointShape sourcePoint;

        public ServiceAreaDefinition()
        {
            InitializeComponent();
            this.Loaded += new RoutedEventHandler(ServiceAreaDefinition_Loaded);
        }

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

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

            markerOverlay = new SimpleMarkerOverlay();
            Map1.Overlays.Add("SimpleMarkerOverlay", markerOverlay);

            // Add the start and end flag
            RenderCenterMarker(txtSourceFeatureId.Text);

            routeLayer = new InMemoryFeatureLayer();
            routeLayer.ZoomLevelSet.ZoomLevel01.DefaultAreaStyle.FillSolidBrush = new GeoSolidBrush(GeoColor.FromArgb(100, GeoColor.StandardColors.Blue));
            routeLayer.ZoomLevelSet.ZoomLevel01.DefaultLineStyle.OuterPen.Color = GeoColor.StandardColors.Red;
            routeLayer.ZoomLevelSet.ZoomLevel01.ApplyUntilZoomLevel = ApplyUntilZoomLevel.Level20;
            LayerOverlay routeOverlay = new LayerOverlay();
            routeOverlay.Layers.Add("routeLayer", routeLayer);
            Map1.Overlays.Add("RouteOverlay", routeOverlay);

            Map1.CurrentExtent = new RectangleShape(-97.7589906891967, 30.291409034941, -97.6954759797241, 30.2460904314254);
        }

        private void GetServiceArea_Click(object sender, RoutedEventArgs e)
        {
            GeoDataService.GeoDataGettingClient client = new CSharp_Silverlight_HowDoISamples.GeoDataService.GeoDataGettingClient();
            client.GetServiceAreaCompleted += new EventHandler(client_GetServiceAreaCompleted);
            int drivingMinutes = int.Parse(txtTime.Text);
            string point = String.Format("{0},{1}", sourcePoint.X.ToString(CultureInfo.InvariantCulture), sourcePoint.Y.ToString(CultureInfo.InvariantCulture));
            string speedUnit = ((System.Windows.Controls.ContentControl)(cmbSpeedUnit.SelectedItem)).Content.ToString();
            client.GetServiceAreaAsync(point, new TimeSpan(0, drivingMinutes, 0), float.Parse(txtSpeed.Text), speedUnit);
        }

        void client_GetServiceAreaCompleted(object sender, CSharp_Silverlight_HowDoISamples.GeoDataService.GetServiceAreaCompletedEventArgs e)
        {
            if (e.Error == null)
            {
                string wkt = e.Result;
                PolygonShape route = BaseShape.CreateShapeFromWellKnownData(wkt) as PolygonShape;

                routeLayer.InternalFeatures.Clear();
                routeLayer.InternalFeatures.Add(new Feature(route));
                Map1.CurrentExtent = route.GetBoundingBox();
                Map1.Refresh();
            }
        }

        internal void RenderCenterMarker(string featureId)
        {
            GeoDataService.GeoDataGettingClient client = new CSharp_Silverlight_HowDoISamples.GeoDataService.GeoDataGettingClient();
            client.GetPointShapeByIdCompleted += new EventHandler(client_GetStartPointShapeByIdCompleted);
            client.GetPointShapeByIdAsync(featureId);
        }

        void client_GetStartPointShapeByIdCompleted(object sender, CSharp_Silverlight_HowDoISamples.GeoDataService.GetPointShapeByIdCompletedEventArgs e)
        {
            if (e.Error == null)
            {
                string[] positions = e.Result.Split(',');
                sourcePoint = new PointShape(double.Parse(positions[0], CultureInfo.InvariantCulture), double.Parse(positions[1], CultureInfo.InvariantCulture));

                Marker marker = new Marker(sourcePoint);
                marker.ImageSource = new BitmapImage(new Uri("/theme/Star.png", UriKind.RelativeOrAbsolute)); ;
                markerOverlay.Markers.Add(marker);

                GetServiceArea_Click(null, null);

                Map1.Refresh();
            }
        }
    }
}