// Copyright 2013-2022 AFI,Inc. All rights reserved

using System;
using TMPro;
using UnityEngine;

// UI를 총괄하는 매니저 클래스
public class UIManager : MonoBehaviour {
    
    [Header("외부 UI, 초기화 호출용")]
    [SerializeField] private AlertUI alertUI;
    [SerializeField] private ConfigUI configUI;
    [SerializeField] private LoginUI loginUI;
    [SerializeField] private LoadingUI loadingUI;

    [Header("내부 UI")]
    [SerializeField] private UI_MainFunction mainFunctionUI;
    [SerializeField] private UI_SubFunction subFunctionUI;
    [SerializeField] private UI_RequestUI requestUI;
    [SerializeField] private UI_ResultUI resultUI;

    [Header("함수 이름 노출용")]
    [SerializeField] private TMP_Text mainFunctionText;
    [SerializeField] private TMP_Text subFunctionText;

    // 결과창을 MainThread에서 보여주기 위한 변수
    private bool _isResultActive = false;
    private Action _resultAction = null;

    public string MainFunctionName { get; private set; }

    public string SubFunctionName { get; private set; }

    
    public static UIManager Instance {
        get;
        private set;
    }
    
    // 모든 외부함수 초기화
    private void Awake() {
        if (Instance == null) {
            Instance = this;
        }

        alertUI.Initialize();
        configUI.Initialize();
        loginUI.Initialize();
        loadingUI.Initialize();
    }

    // Start is called before the first frame update
    void Start() {
        requestUI.Initialize();
        resultUI.Initialize();
        mainFunctionUI.Initialize(requestUI);
        
        ResetSubFunction();
        ResetRequestUI();
    }

    void Update() {
        // OpenResultUI 호출 시 활성화된다.
        // 메인쓰레드에서는 UI에 접근을 못하므로 코드 depth가 깊어지는 것을 방지하기 위해
        // Update에서 호출하도록 구현하였다.
        if (_isResultActive) {
            _isResultActive = false;

            try {
                _resultAction.Invoke();

            } catch (Exception e) {
                OpenResultUI("호출 실패 : \n" + e.ToString());
            }
            
            // 우측 하단에 실행 버튼을 누르면 OpenUI가 된다.
            LoadingUI.Instance.CloseUI();
        }

        if (Input.GetKeyDown(KeyCode.KeypadEnter)) {
            requestUI.PressEnterKey();
        }
    }

    // 비동기일 경우도 대비하여 UI 동작을 메인 쓰레드로 이동시켜 실행하는 함수.
    public void OpenResultUI(string result) {
        _isResultActive = true;
        _resultAction = () => resultUI.OpenResultUI(result);
    }

    public void OpenResultUIAndCustomAction(string result, Action action) {
        _isResultActive = true;
        _resultAction = () => {
            resultUI.OpenResultUI(result);
            action.Invoke();
        };
    }
    
    // 설정 UI 활성화 함수
    public void OpenConfig() {
        configUI.OpenUI();
    }

    // 서브 기능 리스트 초기화 함수
    public void ResetSubFunction() {
        subFunctionUI.Reset();   
    }

    // 요청 UI 초기화 함수
    public void ResetRequestUI() {
        requestUI.Reset();
        resultUI.Reset();
        resultUI.gameObject.SetActive(false);
    }

    // 보조 기능 추가 함수
    public void AddSubFunction(string buttonName, Action action) {
        subFunctionUI.AddSubFunction(buttonName,action);
    }

    public void SetMainFunctionName(string functionName) {
        MainFunctionName = functionName;
        mainFunctionText.text = functionName;
    }
    
    public void SetSubFunctionName(string functionName) {
        SubFunctionName = functionName;
        subFunctionText.text = functionName;
    }
}