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

using System;
using System.Collections;
using System.Collections.Generic;
using System.Threading.Tasks;
using TMPro;
using UnityEngine;
using UnityEngine.UI;

// 우측에 뒤끝 기능 호출하기 위한 paramater 리스트 출력과 테스트 버튼이 있는 UI
public class UI_RequestUI : MonoBehaviour {
    
    [Header("UI")] 
    [SerializeField] private Button     executeButton; // 함수 호출 버튼
    [SerializeField] private GameObject valueInputParent; // 입력 오브젝트 부모객체
    [SerializeField] private ExtraInputAddUI extraInputAddUI; // 입력 오브젝트 부모객체

    
    [Header("Prefab")]
    [SerializeField] private GameObject valueInputField; // 입력 오브젝트

    // 입력 객체 리스트
    private List<ValueInputField>       _valueInputFieldList = new List<ValueInputField>();
    private Action                      _executeAction; // 함수 호출 버튼 클릭시 발생하는 Action

    public List<ValueInputField> GetValueInputFieldList() {
        return _valueInputFieldList;
    }
    
    public void Initialize() {
        // 함수 호출 버튼 할당
        executeButton.onClick.AddListener(LoadingUI.Instance.OpenUI);
        executeButton.onClick.AddListener(ActionExecute);
        
        extraInputAddUI.Initialize(this);
    }

    public void PressEnterKey() {
        executeButton.onClick.Invoke();
    }
    
    // 함수 호출 버튼 Action 변경 함수
    public void SetExecuteButtonAction(Action action) {
        _executeAction = action;
    }

    private async void ActionExecute() {
        await Task.Run( () => {
            try {
                _executeAction.Invoke();
            } catch (Exception e) {
                AlertUI.Instance.OpenUI("예외가 발생했습니다.\n",e);
            }
        });
    }

    // 입력 객체 전부 삭제 함수(AddInputField를 통해 생성)
    public void Reset() {
        for (int i = 0; i < _valueInputFieldList.Count; i++) {
            Destroy(_valueInputFieldList[i].gameObject);
        }
        
        _valueInputFieldList.Clear();
        if (extraInputAddUI.gameObject.activeSelf) {
            extraInputAddUI.OpenUI(); // 리셋용
        }
        extraInputAddUI.CloseUI();    

    }

    public void SetExtraInputAddUI() {
        extraInputAddUI.OpenUI();
    }
    
    public void SetExtraInputAddUI(ExtraInputAddUI.ExtraInputType buttonType) {
        extraInputAddUI.OpenUI(buttonType);
    }

    // 입력 객체를 하나씩 생성하는 함수(파라매터가 여러개인 입력 오브젝트)
    public void AddInputField(string inputName, string placeHolderName = null) {
        var item = Instantiate(valueInputField, valueInputParent.transform, true);
        item.transform.localScale = new Vector3(1, 1, 1);
        var valueItem = item.GetComponent<ValueInputField>();

        if (placeHolderName == null) {
            placeHolderName = string.Empty;
        }
        
        valueItem.AddInputField(inputName, placeHolderName);
        _valueInputFieldList.Add(valueItem);
    }
    
    public void AddInputField(string inputName, int placeHolderName) {
        AddInputField(inputName, placeHolderName.ToString());
    }
    
    public void AddSelectButton() {
        var item = Instantiate(valueInputField, valueInputParent.transform, true);
        item.transform.localScale = new Vector3(1, 1, 1);
        
    }
    
        
    // 입력 객체를 하나씩 생성하는 함수(파라매터가 여러개인 입력 오브젝트)
    public void AddInputField(string[] inputNames) {
        AddInputField(inputNames, DataType.NORMAL);
    }
    
    // 입력 객체를 하나씩 생성하는 함수(파라매터가 여러개인 입력 오브젝트)
    public void AddInputField(string[] inputNames, DataType dataType) {
        var item = Instantiate(valueInputField, valueInputParent.transform, true);
        item.transform.localScale = new Vector3(1, 1, 1);
        var valueItem = item.GetComponent<ValueInputField>();
        valueItem.AddInputField(inputNames, dataType);
        
        _valueInputFieldList.Add(valueItem);
    }
    public void AddInputField(string inputName, DataType dataType) {
        var item = Instantiate(valueInputField, valueInputParent.transform, true);
        item.transform.localScale = new Vector3(1, 1, 1);
        var valueItem = item.GetComponent<ValueInputField>();
        valueItem.AddInputField(inputName, dataType);
        
        _valueInputFieldList.Add(valueItem);
    }
}