﻿using ARGOFoundation;
using UnityEditor;
using UnityEngine;
using UnityEngine.Networking;
using System.Threading;

namespace ARGOEditor
{
    public class LoginWindow : EditorWindow
    {
        private EndPointURL endPointUrl;
        private string login;
        private string password;

        private const string DefaultLoginPlaceholder = "Login";
        private const string DefaultPasswordPlaceholder = "Password";
        private const string OkButtonTitle = "OK";

        public void Awake()
        {
            var settings = UserSettings.GetOrCreateSettings();

            login = settings.Login;
            password = settings.Password;
#if ARGO_DEBUG
            endPointUrl = settings.EndpointURL;
#else
            endPointUrl = EndPointURL.Prod;
#endif
        }

        private void OnGUI()
        {
            GUILayout.Label("Sign in with your ARGO Web Manager/Editor credentials", EditorStyles.boldLabel);

            login = TextField(login, DefaultLoginPlaceholder);
            password = TextField(password, DefaultPasswordPlaceholder, true);

#if ARGO_DEBUG
            GUILayout.Label("API Settings", EditorStyles.boldLabel);
            endPointUrl = (EndPointURL)EditorGUILayout.EnumPopup("EndPoint: ", endPointUrl);
#endif

            if (GUILayout.Button("Sign in"))
            {
                var settings = UserSettings.GetOrCreateSettings();
                settings.Login = login;
                settings.Password = password;
                settings.EndpointURL = endPointUrl;
                settings.Save();
                GetNewToken();
            }
            if (GUILayout.Button("Cancel"))
            {
                Close();
            }
        }

        private static string TextField(string text, string placeholder, bool hideUserInput = false)
        {
            var newText = hideUserInput ? EditorGUILayout.PasswordField(text) : EditorGUILayout.TextField(text);
            if (!string.IsNullOrEmpty(text)) return newText;
            var guiColor = GUI.color;
            GUI.color = Color.grey;
            EditorGUI.LabelField(GUILayoutUtility.GetLastRect(), placeholder);
            GUI.color = guiColor;
            return newText;
        }

        private void GetNewToken()
        {
            var endPoint = new EndPoint(endPointUrl == EndPointURL.Dev);
            var endPointURL = endPoint.UrlWithApiVersion;

            var tokenRequest = TokenManager.GetTokenWebRequest(endPointURL, login, password);

            var req = tokenRequest.SendWebRequest();

            while (!req.isDone)
            {
                Thread.Sleep(100);
            }

            switch (tokenRequest.result)
            {
                case UnityWebRequest.Result.Success:
                    EditorUtility.DisplayDialog("Login successful", "Now you can create you scene!", OkButtonTitle);
                    Close();
                    var token = ARGOToken.CreateFromJson(tokenRequest.downloadHandler.text);
                    token.endpointUrl = endPointURL;
                    token.Persist();
                    break;
                default:
                    EditorUtility.DisplayDialog("Error occurred", "Failed to sign in. Check your login and password and try again.", OkButtonTitle);
                    break;
            }
        }
    }
}
