﻿using GameAnvil.Defines;
using UnityEngine;

namespace GameAnvilSampleForTemplate
{
    public class ConnectHandler : MonoBehaviour
    {
        static GameAnvil.Connector connector = null;
        public static GameAnvil.Connector getInstance()
        {
            return connector;
        }

        [SerializeField]
        GameAnvil.Connector.Config config = null;
        private void Awake()
        {
            DontDestroyOnLoad(this.gameObject);
            Application.runInBackground = false;
            connector = new GameAnvil.Connector(config);
            connector.config.packetTimeout = 10;
            connector.Logger = (LogLevel logLevel, string log) => {
                Debug.Log(string.Format("[{0}]{1}", logLevel, log));
            };
            connector.LvNetLogger = (NetLogLevel logLevel, string log) => {
                Debug.Log(string.Format("[{0}]{1}", logLevel, log));
            };
            GameAnvil.ProtocolManager.getInstance().RegisterProtocol(0, Com.Nhn.Gameanvil.Sample.Template.Chat.Protocol.ChatReflection.Descriptor);
        }

        private void OnApplicationPause(bool pause)
        {
            if (pause)
            {
                Debug.Log(string.Format("OnApplicationPause - from background"));
                // 백그라운드로 내려가기 전 마지막으로 Connector.update()를 호출하여 queue에 쌓인 메시지를 서버로 전송한다. 
                connector.Update();
            } else
            {
                // 백그라운에서 올라오면 제일 먼저 Connector.update()를 호출하여 Connector의 상태를 갱신한다. 
                connector.Update();
                Debug.Log(string.Format("OnApplicationPause - from background"));
                if (!connector.IsConnected())
                {
                    if (Connect.instance != null)
                    {
                        Connect.instance.Reset();
                        Connect.instance.OnClickConnect();
                    }
                }
            }
        }

        private void Update()
        {
            connector.Update();
        }

        private void OnDisable()
        {
            if (connector.IsConnected())
            {
                connector.CloseSocket();
            }
        }
    }
}