using C1.Xaml.Maps;
using System;
using System.IO;
using System.Threading.Tasks;
using Windows.Foundation;
using Windows.Storage;
using Windows.UI;
using Windows.UI.Xaml.Media;


namespace ControlExplorer.Controls.Maps
{
    public class Utils
    {
        public static Geometry CreateBaloon()
        {
            PathGeometry pg = new PathGeometry();
            pg.Transform = new TranslateTransform() { X = -10, Y = -24.14 };
            PathFigure pf = new PathFigure() { StartPoint = new Point(10, 24.14), IsFilled = true, IsClosed = true };
            pf.Segments.Add(new ArcSegment() { SweepDirection = SweepDirection.Counterclockwise, Point = new Point(5, 19.14), RotationAngle = 45, Size = new Size(10, 10) });
            pf.Segments.Add(new ArcSegment() { SweepDirection = SweepDirection.Clockwise, Point = new Point(15, 19.14), RotationAngle = 270, Size = new Size(10, 10), IsLargeArc = true });
            pf.Segments.Add(new ArcSegment() { SweepDirection = SweepDirection.Counterclockwise, Point = new Point(10, 24.14), RotationAngle = 45, Size = new Size(10, 10) });
            pg.Figures.Add(pf);
            return pg;
        }

        public static async Task LoadShapeFromResource(C1VectorLayer vl, Uri resname, Uri dbfname, Location location, bool clear, ProcessShapeItem pv)
        {
            var resource = await StorageFile.GetFileFromApplicationUriAsync(resname);
            if (resource == null)
                return;
            var dbfResource = await StorageFile.GetFileFromApplicationUriAsync(dbfname);

            using (Stream dataStream = await resource.OpenStreamForReadAsync())
            {
                using (Stream dbfStream = await dbfResource.OpenStreamForReadAsync())
                {
                    if (clear)
                        vl.Children.Clear();
                    vl.LoadShape(dataStream, dbfStream, location, true, pv);
                }
            }
        }

        public static async Task LoadKMZFromResources(C1VectorLayer vl, Uri resname, bool clear, ProcessVectorItem pv)
        {
            var resource = await StorageFile.GetFileFromApplicationUriAsync(resname);
            if (resource == null)
                return;

            using (Stream zipStream = await resource.OpenStreamForReadAsync())
            {
                if (zipStream != null)
                {
                    if (clear)
                        vl.Children.Clear();

                    vl.LoadKMZ(zipStream, true, pv);
                }
            }
        }

        static Random rnd = new Random();

        public static Color GetRandomColor(byte a)
        {
            return Color.FromArgb(a, (byte)rnd.Next(255), (byte)rnd.Next(255), (byte)rnd.Next(255));
        }

        public static Color GetRandomColor(byte min, byte a)
        {
            return Color.FromArgb(a, (byte)(min + rnd.Next(255 - min)),
              (byte)(min + rnd.Next(255 - min)), (byte)(min + rnd.Next(255 - min)));
        }
    }
}
