﻿#if UNITY_EDITOR
using System.Collections;
using System.Collections.Generic;
using System.Linq;
using UnityEngine;
using UnityEditor;

namespace Arugula.Animation
{

    [CustomEditor(typeof(AnimatedSpriteData))]
    public class AnimatedSpriteDataInspector : Editor
    {
        AnimatedSpriteData data;

        public string previewSequence = "";
        private void OnEnable()
        {
            data = (AnimatedSpriteData)target;

        }

        public override void OnInspectorGUI()
        {
            base.OnInspectorGUI();

            if (data.sequences.Length == 0)
            {
                if (GUILayout.Button("Intuit Sequences"))
                {
                    IntuitSequences();
                }
            }
        }

        void IntuitSequences()
        {
            if (data.GetSkin() == null || data.sequences.Length > 0)
                return;

            Dictionary<string, List<string>> table = new Dictionary<string, List<string>>();

            foreach (var spr in data.GetSkin().sprites)
            {
                string[] parts = spr.name.Split(new char[] { '_' }, System.StringSplitOptions.RemoveEmptyEntries);

                string anim = parts[parts.Length - 2];

                if (!table.ContainsKey(anim))
                    table.Add(anim, new List<string>());

                table[anim].Add(spr.name);
            }

            foreach (var list in table.Values)
            {
                var sorted = list.OrderBy(x => int.Parse(x.Split('_').Last())).ToArray();
                list.Clear();
                foreach (var s in sorted)
                    list.Add(s);
            }

            data.sequences = new AnimatedSprite.Sequence[table.Count];
            int i = 0;
            var skin = data.GetSkin();
            foreach (var kp in table)
            {
                var seq = new AnimatedSprite.Sequence(kp.Key);
                var list = kp.Value;
                foreach (var f in list)
                {
                    int index = skin.sprites.FindIndex(x => x.name == f);
                    seq.frames.Add(index);
                    seq.durations.Add(0.25f);
                    seq.events.Add(new AnimatedSprite.Event());
                }

                data.sequences[i] = seq;
                i++;
            }
        }
    }
}
#endif