﻿using Com.Nhn.Gameanvil.Sample.Template.Chat.Protocol;
using GameAnvil;
using GameAnvil.Defines;
using GameAnvil.User;
using UnityEngine;
using UnityEngine.UI;

namespace GameAnvilSampleForTemplate {
    public class Lobby : MonoBehaviour {
        [SerializeField]
        Text textTitle = null;

        [SerializeField]
        Button buttonLogout = null;
        [SerializeField]
        Button buttonRefresh = null;
        [SerializeField]
        ButtonContainer buttonContainer = null;

        [SerializeField]
        InputField input_joinRoomId = null;

        [SerializeField]
        ServiceLogin serviceLogin = null;

        [SerializeField]
        ChatRoom chatRoom = null;

        [SerializeField]
        ButtonContainer buttonContainerRoomList = null;

        [SerializeField]
        RectTransform nickNameUI = null;

        [SerializeField]
        InputField input_NickName = null;
        UserAgent playUserAgent;

        private void Start() {
            buttonLogout.onClick.AddListener(() => { OnClickLogout(); });
            buttonRefresh.onClick.AddListener(() => { RefreshChannelList(); });
            buttonContainer.addButton("Create Room").button.onClick.AddListener(() => { onClcikCreateRoom(); });
            buttonContainer.addButton("Join Room").button.onClick.AddListener(() => { onClickJoinRoom(); });
            buttonContainer.addButton("NickName").button.onClick.AddListener(() => { onClickNickName(); });
        }

        private void Update() {
        }

        public void OnEnter(UserAgent userAgent) {
            if(null != userAgent) {
                playUserAgent = userAgent;
            }
            textTitle.text = userAgent.GetAccountId();
            buttonLogout.interactable = true;
            this.gameObject.SetActive(true);
            RefreshChannelList();
        }

        void RefreshChannelList() {
            buttonRefresh.interactable = false;
            buttonContainerRoomList.Clear();
            // Room List 넣을 곳.
            //ConnectHandler.getInstance().GetSessionAgent().GetChannelList(Common.serviceName, (SessionAgent sessionAgent, ResultCodeChannelList result, List<string> channelIdList) => {
            //    foreach (var element in channelIdList) {
            //        buttonContainerRoomList.addButton(element).button.onClick.AddListener(() => { enterRoom(element); });
            //    }
            //    buttonRefresh.interactable = true;
            //});
        }

        void OnExit() {
            this.gameObject.SetActive(false);
        }

        void OnClickLogout() {
            Debug.Log("OnClickLogout");

            if (null != playUserAgent) {
                buttonLogout.interactable = false;
                // 로그아웃 요청.
                playUserAgent.Logout((UserAgent userAgent, ResultCodeLogout result, bool force, Payload payload) => {
                    // 성공시 다음 단계.
                    if (result == ResultCodeLogout.LOGOUT_SUCCESS) {
                        OnExit();
                        serviceLogin.OnEnter();
                    }
                    buttonLogout.interactable = true;
                });
            }
        }

        void onClcikCreateRoom() {
            playUserAgent.CreateRoom("ChatRoom", (UserAgent userAgent, ResultCodeCreateRoom result, int roomId, string roomName, Payload payload) => {
                if (ResultCodeCreateRoom.CREATE_ROOM_SUCCESS == result) {
                    Debug.Log(result);
                    Debug.Log(roomId);
                    OnExit();
                    chatRoom.OnEnter(userAgent, roomId);
                }
            });
        }

        void onClickJoinRoom() {
            if (!string.IsNullOrEmpty(input_joinRoomId.text)) {
                enterRoom(int.Parse(input_joinRoomId.text));
            }
        }

        private void enterRoom(int roomId) {
            Debug.Log(roomId);

            playUserAgent.JoinRoom(Common.userType,
                roomId,
                null,
                (UserAgent userAgent, ResultCodeJoinRoom result, int enterRoomId, string roomName, Payload payload) => {
                    if (ResultCodeJoinRoom.JOIN_ROOM_SUCCESS == result) {
                        OnExit();
                        chatRoom.OnEnter(userAgent, enterRoomId);
                    }
                });
        }

        void onClickNickName() {
            nickNameUI.gameObject.SetActive(true);
        }

        public void OnRegisterNickName() {
            RegisterNickNameReq req = new RegisterNickNameReq();
            req.NickName = input_NickName.text;
            playUserAgent.Request<RegisterNickNameRes>(req, (userAgent, registerNickNameRes) => {
                Debug.Log(registerNickNameRes.IsSuccess);
                textTitle.text = req.NickName;
                nickNameUI.gameObject.SetActive(false);
            });
        }

    }
}