using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.Serialization;
using UnityEngine.UI;

public class UIManager : MonoBehaviour
{
    public RectTransform window;
    [Space]
    public UIState connectState;
    public UIState authenticationState;
    public UIState loginState;
    public UIState joinedRoomState;
    [Space]
    public UIState managerLoginState;
    public UIState managerJoinedRoomState;
    [Space]
    public InputField ipInputField;
    public InputField portInputField;
    public InputField connectExceptionInputField;
    public Button connectButton;
    public Button disconnectButton;
    [Space]
    public InputField echoReqMessageInputField;
    public InputField echoConnectionResultInputField;
    public InputField echoUserResultInputField;
    public Button echoButton;
    public Button echoClearButton;
    [Space]
    public InputField accountIdInputField;
    public InputField passwordInputField;
    public InputField deviceIdInputField;
    public Text isAuthenticatedText;
    public InputField authenticationResultInputField;
    public InputField authenticationExceptionInputField;
    public Button authenticationButton;
    [Space]
    public InputField serviceNameInputField;
    public InputField subIdInputField;
    public InputField createUserExceptionInputField;
    public Button createUserButton;
    [Space]
    public InputField userTypeInputField;
    public InputField channelIdInputField;
    public InputField loginResultInputField;
    public InputField loginExceptionInputField;
    public Button loginButton;
    public Button logoutButton;
    [Space]
    public InputField roomTypeInputField;
    public InputField roomIdInputField;
    public InputField roomResultInputField;
    public InputField roomIdResultInputField;
    public InputField roomExceptionInputField;
    public Button createRoomButton;
    public Button joinRoomButton;
    public Button leaveRoomButton;
    [Space]
    public InputField matchMakingResultInputField;
    public Button userMatchMakingButton;
    public Button roomMatchMakingButton;
    public Button cancelMatchMakingButton;
    [Space]
    public InputField managerIpInputField;
    public InputField managerPortInputField;
    public InputField managerAccountIdInputField;
    public InputField managerDeviceIdInputField;
    public InputField managerPasswordInputField;
    public InputField managerUserTypeInputField;
    public InputField managerChannelIdInputField;
    public InputField managerServiceNameInputField;
    public InputField managerResultCodeInputField;
    public InputField managerExceptionInputField;
    public Button managerLoginButton;
    public Button managerLogoutButton;
    [Space]
    public InputField managerRoomTypeInputField;
    public InputField managerRoomIdInputField;
    public InputField managerRoomResultInputField;
    public InputField managerRoomIdResultInputField;
    public InputField managerRoomExceptionInputField;
    public Button managerCreateRoomButton;
    public Button managerJoinRoomButton;
    public Button managerLeaveRoomButton;
    [Space]
    public InputField managerMatchMakingResultInputField;
    public Button managerUserMatchMakingButton;
    public Button managerRoomMatchMakingButton;
    public Button managerCancelMatchMakingButton;
    [Space]
    public Button exitButton;
    [Space]
    public ScrollRect consoleScrollRect;
    public InputField consoleInputField;
    
    void Start()
    {
        connectExceptionInputField.onValueChanged.AddListener(value => Redraw(connectExceptionInputField.transform));
        authenticationResultInputField.onValueChanged.AddListener(value=> Redraw(authenticationResultInputField.transform));
        authenticationExceptionInputField.onValueChanged.AddListener( value => Redraw(authenticationExceptionInputField.transform));
        createUserExceptionInputField.onValueChanged.AddListener(value => Redraw(createUserExceptionInputField.transform));
        loginResultInputField.onValueChanged.AddListener(value => Redraw(loginResultInputField.transform));
        loginExceptionInputField.onValueChanged.AddListener(value => Redraw(loginExceptionInputField.transform));
        roomResultInputField.onValueChanged.AddListener(value=>Redraw(roomResultInputField.transform));
        roomIdResultInputField.onValueChanged.AddListener(value => Redraw(roomIdResultInputField.transform));
        roomExceptionInputField.onValueChanged.AddListener(value => Redraw(roomExceptionInputField.transform));
        matchMakingResultInputField.onValueChanged.AddListener(value => Redraw(matchMakingResultInputField.transform));
        managerResultCodeInputField.onValueChanged.AddListener(value => Redraw(managerResultCodeInputField.transform));
        managerRoomResultInputField.onValueChanged.AddListener(value => Redraw(managerRoomResultInputField.transform));
        managerRoomIdResultInputField.onValueChanged.AddListener(value => Redraw(managerRoomIdResultInputField.transform));
        managerRoomExceptionInputField.onValueChanged.AddListener(value => Redraw(managerRoomExceptionInputField.transform));
        managerMatchMakingResultInputField.onValueChanged.AddListener(value => Redraw(managerMatchMakingResultInputField.transform));
        echoConnectionResultInputField.onValueChanged.AddListener(value => Redraw(echoConnectionResultInputField.transform));
        echoUserResultInputField.onValueChanged.AddListener( value => Redraw(echoUserResultInputField.transform));
        consoleInputField.onValueChanged.AddListener(value => Redraw(consoleInputField.transform));
        consoleInputField.onValueChanged.AddListener(value => consoleScrollRect.normalizedPosition = new Vector2(0, 0));
        
        exitButton.onClick.AddListener(Application.Quit);
    }
    
    public void Redraw(Transform transform)
    {
        var parent = transform;
        while (parent != null)
        {
            LayoutRebuilder.ForceRebuildLayoutImmediate(parent as RectTransform);
            parent = parent.parent;
        }
    }
}
