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

namespace SC.XR.Unity
{
    class TrackableManager : Singleton<TrackableManager>
    {
        private List<Trackable> allTrackables = new List<Trackable>();
        private Dictionary<int, Trackable> oldTrackableDic = new Dictionary<int, Trackable>();

        public void GetTrackables<T>(List<T> trackables, TrackableQueryFilter filter) where T : Trackable
        {
            trackables.Clear();
            switch (filter)
            {
                case TrackableQueryFilter.All:
                    GetAllTrackable<T>(trackables);
                    break;
                case TrackableQueryFilter.New:
                    GetNewTrackable<T>(trackables);
                    break;
            }
        }

        private void GetAllTrackable<T>(List<T> trackables) where T : Trackable
        {
            //TODO
            trackables.Clear();
            TrackableApi.GetPlaneInfo(trackables);
            RefreshOldTrackable(trackables);
        }

        private void GetNewTrackable<T>(List<T> trackables) where T : Trackable
        {
            //TODO
            allTrackables.Clear();
            trackables.Clear();
            TrackableApi.GetPlaneInfo(allTrackables);
            for (int i = 0; i < allTrackables.Count; i++)
            {
                Trackable trackable = allTrackables[i];
                if (!oldTrackableDic.ContainsKey(trackable.trackableId))
                {
                    trackables.SafeAdd(trackable);
                }
            }
            RefreshOldTrackable(allTrackables);
        }

        private void RefreshOldTrackable<T>(List<T> trackables) where T : Trackable
        {
            oldTrackableDic.Clear();
            for (int i = 0; i < trackables.Count; i++)
            {
                Trackable trackable = trackables[i];
                oldTrackableDic[trackable.trackableId] = trackable;
            }
        }
    }
}