﻿using System.Collections;
using System.Collections.Generic;
using System.Linq;
using UnityEngine;

namespace Arugula.Prototypical
{

    public class CameraTarget : MonoBehaviour
    {

        public static List<CameraTarget> All = new List<CameraTarget>();

        public static CameraTarget GetNextByTime(string meta = "")
        {
            return All.Where(x => x.enabled && x.gameObject.activeInHierarchy && (meta == "" ? true : x.meta == meta)).OrderBy(x => x.usedTime).FirstOrDefault();
        }

        public static CameraTarget GetNextByPriority(string meta = null)
        {
            return All.Where(x => x.enabled && x.gameObject.activeInHierarchy && (meta == "" ? true : x.meta == meta)).OrderBy((x) => x.priority + x.priorityBoost).FirstOrDefault();
        }

        public static CameraTarget GetNext(CameraTarget t = null, string meta = null)
        {
            int index = All.IndexOf(t);
            if (index < 0)
                return All.FirstOrDefault(x => x.enabled && x.gameObject.activeInHierarchy && (meta == "" ? true : x.meta == meta));

            for (int i = index; i < All.Count; i++)
            {
                if (All[i].enabled && All[i].gameObject.activeInHierarchy && (meta == "" ? true : All[i].meta == meta))
                    return All[i];
            }

            for (int i = 0; i < index; i++)
            {
                if (All[i].enabled && All[i].gameObject.activeInHierarchy && (meta == "" ? true : All[i].meta == meta))
                    return All[i];
            }

            return t;
        }

        public string meta = "";
        public int priority = 0;

        [System.NonSerialized]
        public int priorityBoost = 0;

        [System.NonSerialized]
        public float usedTime;

        void Awake()
        {
            All.Add(this);
        }

        void OnDestroy()
        {
            All.Remove(this);
        }

        public void Use()
        {
            usedTime = Time.unscaledTime;
        }
    }

}
