using System.Collections.Generic;
using SkiaSharp;
using TouchTracking;

namespace TheGameExtreme.view
{
    public class TouchManipulationBitmap
    {
        public SKPoint InitialPoint { get; set; }
        SKPaint textPaint;
        Dictionary<long, TouchManipulationInfo> touchDictionary = new Dictionary<long, TouchManipulationInfo>();
        public string Value;

        public TouchManipulationBitmap(SKPaint textPaint, decimal value)
        {
            this.textPaint = textPaint;
            Value = value.ToString();
            //if (value > 0 && value < 10)
            //{
            //    Value = "0" + value.ToString();
            //}
            //else
            //{
            //    Value = value.ToString();
            //}

            Matrix = SKMatrix.MakeIdentity();

            TouchManager = new TouchManipulationManager
            {
                Mode = TouchManipulationMode.PanOnly
            };
        }

        public TouchManipulationManager TouchManager { set; get; }

        public SKMatrix Matrix { set; get; }

        public void Paint(SKCanvas canvas, SKColor color)
        {
            canvas.Save();

            SKMatrix matrix = Matrix;
            canvas.Concat(ref matrix);

            textPaint.Color = color;
            textPaint.StrokeWidth = 5;
            textPaint.Style = SKPaintStyle.Stroke;

            SKRect textBounds = new SKRect();
            textPaint.MeasureText(Value, ref textBounds);

            SKRoundRect card = new SKRoundRect(textBounds);
            card.Inflate(35, 55);


            canvas.DrawRoundRect(card, textPaint);
            canvas.DrawText(Value, 0, 0, textPaint);

            canvas.Restore();

        }

        public void ChangeColor(SKColor color)
        {
            textPaint.Color = color;
        }

        public bool HitTest(SKPoint location)
        {
            // Invert the matrix
            SKMatrix inverseMatrix;

            if (Matrix.TryInvert(out inverseMatrix))
            {
                // Transform the point using the inverted matrix
                SKPoint transformedPoint = inverseMatrix.MapPoint(location);

                // Check if it's in the untransformed bitmap rectangle
                SKRect rect = new SKRect(0, 0, textPaint.MeasureText(Value), textPaint.TextSize);
                return rect.Contains(transformedPoint);
            }
            return false;
        }

        public void ProcessTouchEvent(long id, TouchActionType type, SKPoint location)
        {
            switch (type)
            {
                case TouchActionType.Pressed:
                    touchDictionary.Add(id, new TouchManipulationInfo
                    {
                        PreviousPoint = location,
                        NewPoint = location
                    });
                    break;

                case TouchActionType.Moved:
                    TouchManipulationInfo info = touchDictionary[id];
                    info.NewPoint = location;
                    Manipulate();
                    info.PreviousPoint = info.NewPoint;
                    break;

                case TouchActionType.Released:

                case TouchActionType.Cancelled:
                    touchDictionary.Remove(id);
                    break;
            }
        }

        void Manipulate()
        {
            TouchManipulationInfo[] infos = new TouchManipulationInfo[touchDictionary.Count];
            touchDictionary.Values.CopyTo(infos, 0);
            SKMatrix touchMatrix = SKMatrix.MakeIdentity();

            //if (infos.Length == 1)
            //{
                SKPoint prevPoint = infos[0].PreviousPoint;
                SKPoint newPoint = infos[0].NewPoint;
                SKPoint pivotPoint = Matrix.MapPoint(textPaint.MeasureText(Value) / 2, textPaint.TextSize / 2);

                touchMatrix = TouchManager.OneFingerManipulate(prevPoint, newPoint, pivotPoint);
            //}
            //else if (infos.Length >= 2)
            //{
            //    int pivotIndex = infos[0].NewPoint == infos[0].PreviousPoint ? 0 : 1;
            //    SKPoint pivotPoint = infos[pivotIndex].NewPoint;
            //    SKPoint newPoint = infos[1 - pivotIndex].NewPoint;
            //    SKPoint prevPoint = infos[1 - pivotIndex].PreviousPoint;

            //    touchMatrix = TouchManager.TwoFingerManipulate(prevPoint, newPoint, pivotPoint);
            //}

            SKMatrix matrix = Matrix;
            SKMatrix.PostConcat(ref matrix, touchMatrix);
            Matrix = matrix;
        }
    }
}