using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace bbiwarg.Detectors.Touch
{
    class TouchTracker
    {
        private List<TouchEvent>[] detectedTouchEvents;
        private List<TouchEvent> trackedTouchEvents;
        private int framesUntilTracked;

        public TouchTracker() {
            framesUntilTracked = 3;
            detectedTouchEvents = new List<TouchEvent>[framesUntilTracked];

            for (int i = 0; i < framesUntilTracked; i++) {
                detectedTouchEvents[i] = new List<TouchEvent>();
            }
        }

        public void setDetectedTouchEventsThisFrame(List<TouchEvent> touchEventsThisFrame) {
            for (int i = (framesUntilTracked-1); i > 0; i--) {
                detectedTouchEvents[i] = detectedTouchEvents[i - 1]; 
            }
            detectedTouchEvents[0] = touchEventsThisFrame;


            findTrackedTouches();
        }

        private void findTrackedTouches() {
            trackedTouchEvents = new List<TouchEvent>();

            foreach (TouchEvent te in detectedTouchEvents[0]) {
                bool tracked = true;
                for (int i = 1; i < framesUntilTracked; i++) {
                    if (!hasSimilarTouchEventInFrame(te, i)) tracked = false;
                }
                if (tracked)
                {
                    trackedTouchEvents.Add(te);
                    Console.WriteLine("touch tracked at x:" + te.getX() + " y:" + te.getY() + " [touchValue:" + te.getTouchValue() + "]");
                }
            }
        }

        private bool hasSimilarTouchEventInFrame(TouchEvent touchEvent, int frame) {
            float maxDistance = 20;

            foreach (TouchEvent te in detectedTouchEvents[frame]) {
                float distance = touchEvent.getDistanceTo(te);
                if (distance < maxDistance)
                    return true;
            }

            return false;
        }
    }
}