﻿using UnityEngine;
using UnityEditor;
using UnityEditor.SceneManagement;

namespace LicenseSpring
{

    [CanEditMultipleObjects]
    public class LicenseSpringWindow : EditorWindow
    {
        #region Declaration

        /// <summary>
        /// Logo Licensespring company
        /// </summary>
        static Texture2D logo;

        /// <summary>
        /// API data add from site
        /// </summary>
        static string apiKey;
        static string productCode;
        static string sharedKey;

        /// <summary>
        /// Display user data status
        /// </summary>
        string statusData;

        /// <summary>
        /// Buttons names
        /// </summary>
        string applySettings;
        string sdkDoc;
        string visitSite;

        /// <summary>
        /// Example scene buttons
        /// </summary>
        string exampleLicense;
        string checkLicenseExample;
        string trialKeyExample;
        string activateLicenseExample;

        /// <summary>
        /// SDK GameObject
        /// </summary>
        static GameObject sdkObject;

        SerializedProperty activeProperty;

        static LicenseSpringWindowSettings windowSettings;


        /// <summary>
        /// Text colors from sdk data text
        /// </summary>
        private GUIStyle dataStyle;

        private bool sdkDataStatus;

        #endregion

        void Initialization()
        {
            if (LoadWindowData())
            {
                apiKey = windowSettings.ApiKey;
                productCode = windowSettings.ProductCode;
                sharedKey = windowSettings.SharedKey;

                sdkObject = GameObject.Find("LicenseSpringSDK");
                
                if (sdkObject == null)
                {
                    statusData = "Please input API key and product code.";
                    sdkDataStatus = false;
                } else
                {
                    statusData = "API data loaded.";
                    sdkDataStatus = true;
                }
            } else
            {
                apiKey = "";
                productCode = "";
                sharedKey = "";

                sdkObject = null;
            }
            

            applySettings = "Apply settings and create SDK object";
            sdkDoc = "Open online SDK doc";
            visitSite = "Visit Licensespring site";

            exampleLicense = "Open license ONLINE activation";
            checkLicenseExample = "Open license OFFLINE activation";
        }

        void WindowSettings()
        {
            logo = (Texture2D)Resources.Load("LicenseSpringLogo", typeof(Texture2D));
            hideFlags = HideFlags.HideInInspector;
        }

        bool LoadWindowData()
        {
            windowSettings = Resources.Load<LicenseSpringWindowSettings>("LicenseSpring/windowSettings");

            if (windowSettings == null)
            {
                windowSettings = CreateInstance<LicenseSpringWindowSettings>();
                AssetDatabase.CreateAsset(windowSettings, "Assets/Resources/LicenseSpring/windowSettings.asset");
                return false;
            } else
            {
                return true;
            }
        }
 
        static void SaveWindowData()
        {
            windowSettings.ApiKey = apiKey;
            windowSettings.ProductCode = productCode;
            windowSettings.SharedKey = sharedKey;

            AssetDatabase.SaveAssets();
            AssetDatabase.Refresh();
        }

        [MenuItem("Window/Licensespring Settings _F10")]
        public static void ShowWindow()
        {
            CreateInstance(nameof(LicenseSpringWindow));

            EditorWindow window = EditorWindow.GetWindow(typeof(LicenseSpringWindow));
            window.maxSize = new Vector2(400f, 600f);
            window.minSize = window.maxSize;
        }

        void OnEnable()
        {
            WindowSettings();
            Initialization();
        }

        void OnGUI()
        {
            GUI.backgroundColor = Color.white;

            GUILayout.Label(logo);

            EditorGUILayout.LabelField("\n");

            apiKey = EditorGUILayout.TextField("API key:", apiKey);
            sharedKey = EditorGUILayout.TextField("Shared key: ", sharedKey);
            productCode = EditorGUILayout.TextField("Product code:", productCode);

            EditorGUILayout.LabelField("\n");

            if (GUILayout.Button(applySettings))
            {
                if (apiKey != null && sharedKey != null && productCode != null)
                {
                    updateOrCreateAPIGameObject();
                    statusData = "Data success upload.";
                    sdkDataStatus = true;
                }
                else
                {
                    statusData = "Incorect input data!";
                    sdkDataStatus = false;
                }
            }

            if (sdkDataStatus)
            {
                dataStyle = new GUIStyle(EditorStyles.label);
                dataStyle.normal.textColor = Color.green;
                
            } else
            {
                dataStyle = new GUIStyle(EditorStyles.label);
                dataStyle.normal.textColor = Color.red;
            }

            EditorGUILayout.LabelField("Status API:", statusData, dataStyle);

            EditorGUILayout.LabelField("\n");

            if (GUILayout.Button(sdkDoc))
            {
                Application.OpenURL("https://docs.licensespring.com/");
            }

            if (GUILayout.Button(visitSite))
            {
                Application.OpenURL("https://licensespring.com/api");
            }
            
            if (true)
            {
                EditorGUILayout.Space();
                EditorGUILayout.Space();
                EditorGUILayout.Space();
                EditorGUILayout.LabelField("\n \n");

                EditorGUILayout.LabelField("Example scenes");

                if (GUILayout.Button(exampleLicense))
                {
                    EditorSceneManager.OpenScene("Assets/License as Service for your Unity Project/Scenes/ExapmleOnlineActivation.unity");
                }

                if (GUILayout.Button(checkLicenseExample))
                {
                    EditorSceneManager.OpenScene("Assets/License as Service for your Unity Project/Scenes/ExampleOfflineActivation.unity");
                }
            }
        }

        [MenuItem("GameObject/Licensespring/API GameObject")]
        static void updateOrCreateAPIGameObject()
        {
            LicenseSpringSDKObject licenseSpring;
            
            if (sdkObject == null)
            {
                sdkObject = new GameObject("LicenseSpringSDK");
                licenseSpring = sdkObject.AddComponent<LicenseSpringSDKObject>();
            }
            else
            {
                licenseSpring = sdkObject.GetComponent<LicenseSpringSDKObject>();
                if (licenseSpring == null)
                {
                    licenseSpring = sdkObject.AddComponent<LicenseSpringSDKObject>();
                }
            }
            
            licenseSpring.ApiKey = apiKey;
            licenseSpring.SharedKey = sharedKey;
            licenseSpring.ProductCode = productCode;

            Selection.activeObject = sdkObject;

            SaveWindowData();
        }
    }

}