﻿using UnityEngine;
using UnityEditor;
using UnityEngine.Events;
using System.Collections;
using Unity.EditorCoroutines.Editor;
using RememorySDK.API;

namespace RememorySDK
{
    public partial class RememorySDKControlPanel : EditorWindow
    {
        static bool isInitialized = false;
        static bool signingIn = false;
        static string loginErrorMessage { get; set; } = null;
        static string email { get; set; } = null;
        static string password { get; set; } = null;
        static string userName { get; set; } = null;
        public LoginCompleteEvent onLoginCompleted = new LoginCompleteEvent();
        [System.Serializable] public class LoginCompleteEvent : UnityEvent<UserInfo> { }

        public static void InitAccount()
        {

        }

        void ShowAccountTab()
        {
            LoggedinCheck();

            if (signingIn)
            {
                UserInfo();
            }
            else
            {
                ShowLogin();
            }

        }

        void ShowLogin()
        {
            LayoutUtil.WindowLayout("Account Setting", () =>
            {
                email = EditorGUILayout.TextField("Email", email, LayoutUtil.TextFieldLayout);
                password = EditorGUILayout.PasswordField("Password", password, LayoutUtil.TextFieldLayout);

                LayoutUtil.Space();

                LayoutUtil.Centered(() =>
                {
                    if (GUILayout.Button("Login", LayoutUtil.MiniButtonLayout))
                    {
                        loginErrorMessage = null;
                        Login(email, password);
                    }

                    if (GUILayout.Button("Sign up", LayoutUtil.MiniButtonLayout))
                    {
                        loginErrorMessage = null;
                        Application.OpenURL(EditorConstants.REMEMORY_SIGNUP_PAGE);
                    }
                });

                if (!string.IsNullOrEmpty(loginErrorMessage))
                {
                    EditorGUILayout.LabelField(loginErrorMessage, LayoutUtil.errorStyle);
                }
            });
        }

        void LoggedinCheck()
        {
            if (isInitialized)
            {
                return;
            }

            EditorCoroutineUtility.StartCoroutine(APIManager.GetProfile((userInfo) =>
            {
                signingIn = true;
                userName = userInfo.accountName;

            }, (error) =>
            {
                signingIn = false;
                userName = null;

            }), this);

            isInitialized = true;
        }

        private void UserInfo()
        {
            // string licenceType = "Free";

            // int exportMaxCount = 5;
            // int exportedCount = 0;

            LayoutUtil.WindowLayout("Account Setting", () =>
            {
                EditorGUILayout.LabelField("User : " + userName, new GUIStyle(EditorStyles.boldLabel));

                // EditorGUILayout.LabelField("Licence : " + licenceType, new GUIStyle(EditorStyles.boldLabel));

                // LayoutUtil.HorizontalLayout(AlignType.Left, ()=> 
                // {
                //     EditorGUILayout.LabelField("Export : " + exportedCount + "/" + exportMaxCount, new GUIStyle(EditorStyles.boldLabel));

                //     if (GUILayout.Button("Update Licence", LayoutUtil.MiniButtonLayout))
                //     {
                //         Application.OpenURL(EditorConstants.REMEMORY_SDK_PAGE);
                //     }
                // });

                LayoutUtil.Space();

                LayoutUtil.Centered(() =>
                {
                    if (GUILayout.Button("Logout", LayoutUtil.ButtonLayout))
                    {
                        signingIn = false;
                        userName = null;
                        APIManager.SignOut();
                    }
                });
            });
        }

        public void Login(string email, string password)
        {
            EditorCoroutineUtility.StartCoroutine(APIManager.SignInUser(new SignInAccountRequest
            {
                email = email,
                password = password
            }, (userInfo) =>
            {
                userName = userInfo.accountName;
                signingIn = true;
            }, (ErrorResponse res) =>
            {
                // error response
                loginErrorMessage = $"Error [{res.code}] {res.message}";
            }
            ), this);
        }
    }
}