﻿using System.Text;
using JLGames.RocketDriver.Actions.Utils;
using JLGames.RocketDriver.CSharp.Event;
using JLGames.RocketDriver.Games.LocalAccount;
using UnityEngine;
using UnityEngine.UI;

namespace JLGames.RocketDriver.Samples.LocalAccountDemo
{
    public class LocalAccountDemo : MonoBehaviour
    {
        [SerializeField] private InputField m_InputUserName;
        [SerializeField] private InputField m_InputPasswd;
        [SerializeField] private InputField m_InputNickName;

        [SerializeField] private Text m_TextLogging;
        [SerializeField] private Text m_TextSignUpInfo;
        [SerializeField] private Text m_TextSignInInfo;
        [SerializeField] private Text m_TextSignOutInfo;

        private readonly StringBuilder m_Sb = new StringBuilder();

        private void Start()
        {
            RefreshCurrent();
        }

        private void OnEnable()
        {
            var manager = LocalAccountManager.Shared;
            manager.AddEventListener(LocalAccountEvents.EventSignUp, OnSignUp);
            manager.AddEventListener(LocalAccountEvents.EventSignIn, OnSignIn);
            manager.AddEventListener(LocalAccountEvents.EventSignOut, OnSignOut);
        }

        private void OnDisable()
        {
            var manager = LocalAccountManager.Shared;
            manager.RemoveEventListener(LocalAccountEvents.EventSignOut, OnSignOut);
            manager.RemoveEventListener(LocalAccountEvents.EventSignIn, OnSignIn);
            manager.RemoveEventListener(LocalAccountEvents.EventSignUp, OnSignUp);
        }

        private void OnSignUp(EventData evd)
        {
            var account = evd.Data as LocalAccount;
            m_TextSignUpInfo.text = ToInfo(account);
        }

        private void OnSignIn(EventData evd)
        {
            var account = evd.Data as LocalAccount;
            m_TextSignInInfo.text = ToInfo(account);
            RefreshCurrent();
        }

        private void OnSignOut(EventData evd)
        {
            var account = evd.Data as LocalAccount;
            m_TextSignOutInfo.text = ToInfo(account);
            RefreshCurrent();
        }

        public void OnClickLogIn()
        {
            ClearInfo();
            var userName = m_InputUserName.text.Trim();
            var passwd = m_InputPasswd.text.Trim();
            var nickName = m_InputNickName.text.Trim();
            if (string.IsNullOrEmpty(userName))
            {
                DebugUtil.LogWarning("UserName can not be empty!");
                return;
            }

            LocalAccountManager.Shared.SignOnekey(userName, passwd, nickName);
        }

        public void OnClickLogInGuest()
        {
            ClearInfo();
            LocalAccountManager.Shared.SignGuestOnekey();
        }

        public void OnClickLogOut()
        {
            ClearInfo();
            LocalAccountManager.Shared.SignOut();
        }

        private void ClearInfo()
        {
            m_TextSignUpInfo.text = "";
            m_TextSignInInfo.text = "";
            m_TextSignOutInfo.text = "";
        }

        private void RefreshCurrent()
        {
            if (!LocalAccountManager.Shared.ExistLogging)
            {
                m_TextLogging.text = "No Logging Account!";
                return;
            }

            var info = ToInfo(LocalAccountManager.Shared.LoggingAccount);
            m_TextLogging.text = info;
        }

        private string ToInfo(LocalAccount account)
        {
            if (null == account)
            {
                return "Warnning: No Account Found!";
            }

            m_Sb.Clear();
            m_Sb.Append($"UserId:\t{account.UserId}\n");
            m_Sb.Append($"UserName:\t{account.UserName}\n");
            m_Sb.Append($"UserNick:\t{account.UserNick}");
            return m_Sb.ToString();
        }
    }
}