using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;
using GameAnvil.User;
using GameAnvil.Defines;
using GameAnvil.User;
using System;
using UnityEngine.SceneManagement;

namespace GameAnvil
{
    public class QuickConnectUIManager : MonoBehaviour
    {
        [Header("Quick Connect Object Refernces")]
        public InputField ipInputField;
        public InputField portInputField;
        [Space]
        public InputField accountIdInputField;
        public InputField deviceIdInputField;
        public InputField passwordInputField;
        [Space]
        public InputField userTypeInputField;
        public InputField channelIdInputField;
        public InputField serviceNameInputField;
        [Space]
        public Text quickConnectResultText;
        [Space]
        public Button quickConnectButton;
        public Button quickDisconnectButton;

        [Header("Create Room & Join Room Object References")]
        public Button createRoomButton;
        public InputField joinRoomIdInputField;
        public Button joinRoomButton;
        public Button leaveRoomButton;
        public Text createOrJoinRoomResultText;
        public Text RoomIdText;

        [Header("Match Making Object References")]
        public Dropdown roomTypeDropdown;
        public Button roomMatchMakingButton;
        public Button twoUserMatchMaking;
        public Button cancleMatchMaking;
        public Text matchMakingResultText;

        [Header("Select Test Scene Object References")]
        public Button loadSpawnAnvilButton;
        public Button loadGravityAnvilButton;
        public Button loadHammeringButton;
        public Button loadKeyboardToMoveButton;

        public string loadedSceneName;

        public enum UIState
        {
            NOT_QUICK_CONNECTED,
            QUICK_CONNECT_FAIL,
            QUICK_CONNECTING,
            QUICK_CONNECT_COMPLETE,
            NOT_JOINED_ROOM,
            JOIN_ROOM_FAIL,
            IN_MATCH_MAKING,
            CREATE_OR_JOIN_ROOM,
            JOIN_ROOM_COMPLETE,
            SCENESELECT_COMPLETE
        }
        public UIState state;

        void Start()
        {
            if (GameAnvilConnector.getInstance().getUserAgent() != null && GameAnvilConnector.getInstance().getUserAgent().IsJoinedRoom())
            {
                loadedSceneName = SyncController.GetCustomProperty<string>("loadedSceneName");
            }

            ipInputField.text = GameAnvilConnector.getInstance().ip;
            portInputField.text = GameAnvilConnector.getInstance().port.ToString();
            accountIdInputField.text = GameAnvilConnector.getInstance().accountId;
            deviceIdInputField.text = GameAnvilConnector.getInstance().deviceId;
            passwordInputField.text = GameAnvilConnector.getInstance().password;
            userTypeInputField.text = GameAnvilConnector.getInstance().userType;
            channelIdInputField.text = GameAnvilConnector.getInstance().channelId;
            serviceNameInputField.text = GameAnvilConnector.getInstance().serviceName;

            ipInputField.onValueChanged.AddListener(delegate { ipChanged(); });
            portInputField.onValueChanged.AddListener(delegate { portChanged(); });
            accountIdInputField.onValueChanged.AddListener(delegate { accountIdChanged(); });
            deviceIdInputField.onValueChanged.AddListener(delegate { deviceIdChanged(); });
            passwordInputField.onValueChanged.AddListener(delegate { passwordChanged(); });
            userTypeInputField.onValueChanged.AddListener(delegate { userTypeChanged(); });
            channelIdInputField.onValueChanged.AddListener(delegate { channelIdChanged(); });
            serviceNameInputField.onValueChanged.AddListener(delegate { serviceNameChanged(); });
        }

        void Update()
        {
            quickConnectResultText.text = GameAnvilConnector.getInstance().GetQuickConnectState().ToString();

            if (GameAnvilConnector.getInstance().getUserAgent() != null && GameAnvilConnector.getInstance().getUserAgent().IsJoinedRoom())
            {
                loadedSceneName = SyncController.GetCustomProperty<string>("loadedSceneName");
            }

            if (GameAnvilConnector.getInstance().getUserAgent()!= null && GameAnvilConnector.getInstance().getUserAgent().IsJoinedRoom() && loadedSceneName != null && loadedSceneName.Length != 0)
            {
                state = UIState.SCENESELECT_COMPLETE;
            }
            else if (GameAnvilConnector.getInstance().getUserAgent() != null && GameAnvilConnector.getInstance().getUserAgent().IsJoinedRoom())
            {
                state = UIState.JOIN_ROOM_COMPLETE;
            }
            else if (GameAnvilConnector.getInstance().getUserAgent() != null && GameAnvilConnector.getInstance().getUserAgent().IsMatchInProgress())
            {
                state = UIState.IN_MATCH_MAKING;
            }
            else if (GameAnvilConnector.getInstance().GetQuickConnectState() == GameAnvilConnector.QuickConnectState.READY)
            {
                state = UIState.NOT_JOINED_ROOM;
            }
            else if (GameAnvilConnector.getInstance().GetQuickConnectState() == GameAnvilConnector.QuickConnectState.NOT_CONNECTED)
            {
                state = UIState.NOT_QUICK_CONNECTED;
            }
            else if (GameAnvilConnector.getInstance().GetQuickConnectState() < GameAnvilConnector.QuickConnectState.READY)
            {
                state = UIState.QUICK_CONNECTING;
            }

            if (GameAnvilConnector.getInstance().getUserAgent() != null)
            {
                createOrJoinRoomResultText.text = GameAnvilConnector.getInstance().getUserAgent().IsJoinedRoom() ? "IS_JOINED_ROOM" : "IS_NOT_JOINED_ROOM";
                matchMakingResultText.text = GameAnvilConnector.getInstance().getUserAgent().IsMatchInProgress() || GameAnvilConnector.getInstance().getUserAgent().IsUserMatchInProgress() ? "MATCH_MAKING_START" : "NOT_IN_MATCH_MAKING";
            }

            ipInputField.interactable = state < UIState.QUICK_CONNECTING;
            portInputField.interactable = state < UIState.QUICK_CONNECTING;
            accountIdInputField.interactable = state < UIState.QUICK_CONNECTING;
            deviceIdInputField.interactable = state < UIState.QUICK_CONNECTING;
            passwordInputField.interactable = state < UIState.QUICK_CONNECTING;
            userTypeInputField.interactable = state < UIState.QUICK_CONNECTING;
            channelIdInputField.interactable = state < UIState.QUICK_CONNECTING;
            serviceNameInputField.interactable = state < UIState.QUICK_CONNECTING;
            quickConnectButton.interactable = state < UIState.QUICK_CONNECTING;
            quickDisconnectButton.interactable = state >= UIState.QUICK_CONNECT_COMPLETE;

            createRoomButton.interactable = state >= UIState.QUICK_CONNECT_COMPLETE && state < UIState.IN_MATCH_MAKING;
            joinRoomIdInputField.interactable = state >= UIState.QUICK_CONNECT_COMPLETE && state < UIState.IN_MATCH_MAKING;
            joinRoomButton.interactable = state >= UIState.QUICK_CONNECT_COMPLETE && state < UIState.IN_MATCH_MAKING; 
            leaveRoomButton.interactable = state >= UIState.JOIN_ROOM_COMPLETE;
            roomTypeDropdown.interactable = state >= UIState.QUICK_CONNECT_COMPLETE && state < UIState.IN_MATCH_MAKING;
            twoUserMatchMaking.interactable = state >= UIState.QUICK_CONNECT_COMPLETE && state < UIState.IN_MATCH_MAKING;
            roomMatchMakingButton.interactable = state >= UIState.QUICK_CONNECT_COMPLETE && state < UIState.IN_MATCH_MAKING;
            cancleMatchMaking.interactable = state == UIState.IN_MATCH_MAKING;

            loadSpawnAnvilButton.interactable = state == UIState.JOIN_ROOM_COMPLETE || "SpawnAnvil".Equals(loadedSceneName);
            loadGravityAnvilButton.interactable = state == UIState.JOIN_ROOM_COMPLETE || "GravityAnvil".Equals(loadedSceneName);
            loadHammeringButton.interactable = state == UIState.JOIN_ROOM_COMPLETE || "Hammering".Equals(loadedSceneName);
            loadKeyboardToMoveButton.interactable = state == UIState.JOIN_ROOM_COMPLETE || "KeyboardToMove".Equals(loadedSceneName);
        }

        void ipChanged()
        {
            GameAnvilConnector.getInstance().ip = ipInputField.text;
        }

        void portChanged()
        {
            if (!int.TryParse(portInputField.text, out GameAnvilConnector.getInstance().port))
            {
                GameAnvilConnector.getInstance().port = 0;
            }
        }

        void accountIdChanged()
        {
            GameAnvilConnector.getInstance().accountId = accountIdInputField.text;
        }

        void deviceIdChanged()
        {
            GameAnvilConnector.getInstance().deviceId = deviceIdInputField.text;
        }

        void passwordChanged()
        {
            GameAnvilConnector.getInstance().password = passwordInputField.text;
        }

        void userTypeChanged()
        {
            GameAnvilConnector.getInstance().userType = userTypeInputField.text;
        }

        void channelIdChanged()
        {
            GameAnvilConnector.getInstance().channelId = channelIdInputField.text;
        }

        void serviceNameChanged()
        {
            GameAnvilConnector.getInstance().serviceName = serviceNameInputField.text;
        }

        public void QuickConnect()
        {
            //GameAnvilConnector.getInstance().QuickConnect(DelOnQuickConnect);
            state = UIState.QUICK_CONNECTING;
        }

        public void QuickDisconnect()
        {
            //GameAnvilConnector.getInstance().QuickDisconnect();
            state = UIState.NOT_QUICK_CONNECTED;
        }

        public void CreateRoom()
        {
            //GameAnvilConnector.getInstance().getUserAgent().CreateRoom(roomTypeDropdown.options[roomTypeDropdown.value].text, DelOnCreateRoom);
        }

        public void JoinRoom()
        {
            //int roomId = 0;
            //int.TryParse(joinRoomIdInputField.text, out roomId);
            //GameAnvilConnector.getInstance().getUserAgent().JoinRoom(roomTypeDropdown.options[roomTypeDropdown.value].text, roomId);
        }

        public void LeaveRoom()
        {
            GameAnvilConnector.getInstance().getUserAgent().LeaveRoom(DelOnLeaveRoom);
        }

        public void UserMatchMaking()
        {
            GameAnvilConnector.getInstance().getUserAgent().MatchUserStart(roomTypeDropdown.options[roomTypeDropdown.value].text, "", OnMatchUserStart);
        }

        public void RoomMatchMaking()
        {
            GameAnvilConnector.getInstance().getUserAgent().MatchRoom(roomTypeDropdown.options[roomTypeDropdown.value].text, "", "", true, true, null,null, OnMatchRoom);
        }

        public void CancelMatchMaking()
        {
            GameAnvilConnector.getInstance().getUserAgent().MatchUserCancel(roomTypeDropdown.options[roomTypeDropdown.value].text, DelOnMatchCancel);
        }

        void DelOnQuickConnect(GameAnvilConnector.ResultCodeQuickConnect resultCode, UserAgent userAgent, GameAnvilConnector.QuickConnectResult quickConnectResult)
        {
            //if (quickConnectResult.resultCodeQuickConnect.Equals(GameAnvilConnector.ResultCodeQuickConnect.QUICK_CONNECT_SUCCESS))
            //{
            //    state = UIState.QUICK_CONNECT_COMPLETE;
            //} else
            //{
            //    state = UIState.QUICK_CONNECT_FAIL;
            //}
        }

        public void DelOnCreateRoom(UserAgent userAgent, ResultCodeCreateRoom result, int roomId, string roomName, Payload payload) {
            //Debug.Log(result);
            //if (result.Equals(GameAnvil.Defines.ResultCodeCreateRoom.CREATE_ROOM_SUCCESS))
            //{
            //    state = UIState.JOIN_ROOM_COMPLETE;
            //    RoomIdText.text = roomId.ToString();
            //} else
            //{
            //    state = UIState.JOIN_ROOM_FAIL;
            //}
        }

        private void OnMatchUserStart(UserAgent userAgent, ResultCodeMatchUserStart result, Payload payload)
        {
            Debug.Log(result);
            GameAnvilConnector.getInstance().getUserAgent().onMatchUserDoneListeners -= DelOnMatchUserDone;
            GameAnvilConnector.getInstance().getUserAgent().onMatchUserDoneListeners += DelOnMatchUserDone;
        }

        private void OnMatchRoom(UserAgent userAgent, ResultCodeMatchRoom result, int resultCode, int roomId, string roomName, bool created, Payload payload)
        {
            Debug.Log(result);
            if (result.Equals(GameAnvil.Defines.ResultCodeMatchRoom.MATCH_ROOM_SUCCESS))
            {
                SyncController.SetCustomProperty<string>("roomId", roomId.ToString());
            }
        }

        void DelOnLeaveRoom(UserAgent userAgent, ResultCodeLeaveRoom result, bool force, int roomId, Payload payload)
        {
            Debug.Log(result);
        }

        private void DelOnMatchCancel(UserAgent userAgent, ResultCodeMatchUserCancel result)
        {
            Debug.Log(result);
        }

        void DelOnMatchUserDone(UserAgent userAgent, ResultCodeMatchUserDone result, bool created, int roomId, Payload payload)
        {
            if (result.Equals(GameAnvil.Defines.ResultCodeMatchUserDone.MATCH_USER_DONE_SUCCESS))
            {
                SyncController.SetCustomProperty<string>("roomId", roomId.ToString());
            }
        }

        public void LoadScene(String sceneName) {
            loadedSceneName = sceneName;
            SyncController.SetCustomProperty<string>("loadedSceneName", sceneName);
            SceneManager.LoadScene(sceneName);
        }

        public void SetloadedSceneButton(String key, bool isChanged)
        {
            if (key.Equals("loadedSceneName")){
                loadedSceneName = SyncController.GetCustomProperty<string>(key);
            }
        }
    }
}

