﻿using System.Collections;
using System.Collections.Generic;
using System;
using System.IO;
using UnityEngine;
using UnityEditor;

[CustomEditor(typeof(T1AnimMono))]
public class T1AnimMonoEditor : Editor
{
    public T1Animation anim;
    private string animName;
    public string AnimName
    {
        get { return animName; }
        set
        {
            if (animName != value)
            {
                animName = value;
                EditorPrefs.SetString("T1.animName", animName);
            }
        }
    }
    private string animLoadPath;
    public string AnimLoadPath
    {
        get { return animLoadPath; }
        set
        {
            if (animLoadPath != value)
            {
                animLoadPath = value;
                EditorPrefs.SetString("T1.animLoadPath", animLoadPath);
            }
        }
    }
    private string animSavePath;
    public string AnimSavePath
    {
        get { return animSavePath; }
        set
        {
            if (animSavePath != value)
            {
                animSavePath = value;
                EditorPrefs.SetString("T1.animSavePath", animSavePath);
            }
        }
    }
    private float animScale;
    public float AnimScale
    {
        get { return animScale; }
        set
        {
            if (animScale != value)
            {
                animScale = value;
                EditorPrefs.SetFloat("T1.animScale", animScale);
            }
        }
    }

    private SerializedProperty animProp;
    private SerializedProperty modelGOProp;

    void OnEnable()
    {
        animProp = serializedObject.FindProperty("anim");
        modelGOProp = serializedObject.FindProperty("modelGO");
        AnimLoadPath = EditorPrefs.GetString("T1.animLoadPath");
        AnimSavePath = EditorPrefs.GetString("T1.animSavePath");
        AnimName = EditorPrefs.GetString("T1.animName");
        AnimScale = EditorPrefs.GetFloat("T1.animScale", 256.0f);
    }

    public override void OnInspectorGUI()
    {
        T1AnimMono mb = target as T1AnimMono;
        anim = mb.anim;

        serializedObject.Update();

        EditorGUILayout.Space();

        GUILayout.BeginHorizontal();
        if (GUILayout.Button("Load File"))
        {
            string path = EditorUtility.OpenFilePanel("Open Anim file", AnimLoadPath, "bin");
            if (!string.IsNullOrEmpty(path))
            {
                AnimLoadPath = Path.GetDirectoryName(path);
                AnimName = Path.GetFileNameWithoutExtension(path);
                anim.LoadAnim(path);
            }
        }

        if (GUILayout.Button("Save File"))
        {
            string path = EditorUtility.SaveFilePanel("Save Anim file", AnimSavePath, AnimName, "bin");
            if (!string.IsNullOrEmpty(path))
            {
                anim.SortBlocks();
                AnimSavePath = Path.GetDirectoryName(path);
                AnimName = Path.GetFileNameWithoutExtension(path);
                anim.SaveAnim(path);
            }
        }
        GUILayout.EndHorizontal();

        AnimName = EditorGUILayout.TextField("Filename", AnimName);

        GUILayout.BeginHorizontal();
        EditorGUILayout.PropertyField(modelGOProp, new GUIContent(""), true, GUILayout.ExpandWidth(false));
        if (GUILayout.Button("Create Animation"))
        {
            GameObject go = mb.modelGO;
            if (go.GetComponent<T1AnimationAssistant>() == null)
            {
                EditorUtility.DisplayDialog("Error", "You must have an T1AnimationAssistant Component on your GameObject", "OK");
            }
            else
            {
                Animation animation = go.GetComponent<Animation>();
                if (animation != null)
                {
                    //Create New Animation
                    mb.anim = new T1Animation();
                    anim = mb.anim;

                    //Set Anim Blocks with Animation Clips
                    AnimationClip[] animClips = AnimationUtility.GetAnimationClips(go);
                    for (int i = 0; i < animClips.Length; i++)
                    {
                        if (animClips[i] != null)
                            anim.AddBlockFromClip(animClips[i], go);
                    }

                    //Additional Processes
                    anim.Rotate(90.0f, 0.0f, 0.0f);
                    anim.Scale(256.0f);
                    anim.SortBlocks();
                }
                else
                {
                    EditorUtility.DisplayDialog("Error", "You must have an Animation Component on your GameObject", "OK");
                }
            }
        }
        GUILayout.EndHorizontal();

        EditorGUILayout.Space();

        GUILayout.BeginHorizontal();
        GUILayout.FlexibleSpace();
        if (GUILayout.Button("Validate and Fix Errors"))
        {
            anim.Validate();
        }
        GUILayout.FlexibleSpace();
        GUILayout.EndHorizontal();

        EditorGUILayout.LabelField("", GUI.skin.horizontalSlider);

        //GUILayout.BeginHorizontal();
        //AnimScale = EditorGUILayout.FloatField(AnimScale);
        //if (GUILayout.Button("Scale Model"))
        //{
        //    anim.Scale(AnimScale);
        //}
        //GUILayout.EndHorizontal();

        //if (GUILayout.Button("Sort Blocks"))
        //{
        //    anim.SortBlocks();
        //}

        //EditorGUILayout.HelpBox("Keyframe Event Types\n55  - Play footstep sound\n232 - Disable blocking sector(args: 0 - unused, 1 - x offset, 2 - y offset, 3 - z offset)\n233 - Enable blocking sector(args: 0 - unused, 1 - x offset, 2 - y offset, 3 - z offset)\n248 - Play sound(args: 0 - SoundID, 1 - x offset, 2 - y offset, 3 - z offset)\n407 - Removes actor\n900 - Spawn particle(args: 0 - Particle ID, 1 - x offset, 2 - y offset, 3 - z offset)", MessageType.None);

        //EditorGUILayout.LabelField("", GUI.skin.horizontalSlider);

        //base.OnInspectorGUI();
        EditorUtility.SetDirty(target);

        EditorGUILayout.PropertyField(animProp, new GUIContent("Animation"), true);

        serializedObject.ApplyModifiedProperties();
    }
}
