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

using System;
using UnityEngine;
using BackEnd;
using TMPro;
using UnityEngine.UI;

public class ExtraInputAddUI : MonoBehaviour {

    private UI_RequestUI _requestUI;

    private Button[] _buttons;

    public enum ExtraInputType {
        NORMAL,
        CALCULATION,
        TRANSACTION_WRITE,
        TRANSACTION_READ,
        PLAYER_DATA_TRANSACTION_WRITE,
        PLAYER_DATA_TRANSACTION_READ
    }

    private ExtraInputType _buttonType = ExtraInputType.NORMAL;
    
    public void Initialize(UI_RequestUI requestUI) {
        _requestUI = requestUI;
        
        _buttons = gameObject.GetComponentsInChildren<Button>();
        Reset();
        ResetByNormal();
    }

    public void ResetByNormal() {
        _buttons[0].gameObject.SetActive(true);
        _buttons[0].GetComponentInChildren<TMP_Text>().text = "문자 데이터 추가";
        _buttons[0].onClick.AddListener(CreateStringField);

        _buttons[1].gameObject.SetActive(true);
        _buttons[1].GetComponentInChildren<TMP_Text>().text = "List형 데이터 추가";
        _buttons[1].onClick.AddListener(CreateListField);

        _buttons[2].gameObject.SetActive(true);
        _buttons[2].GetComponentInChildren<TMP_Text>().text = "Dictionary형 데이터 추가";
        _buttons[2].onClick.AddListener(CreateDictionaryField);
    }

    private void ResetByCalculation() {
        _buttons[0].gameObject.SetActive(true);
        _buttons[0].GetComponentInChildren<TMP_Text>().text = "연산 추가";
        _buttons[0].onClick.AddListener(() => {
            _requestUI.AddInputField(new string[] { "컬럼 명", "연산(addition, subtraction..)", "데이터 값" });
        });    
    }
    
    private void ResetByTransactionWrite() {
        _buttons[0].gameObject.SetActive(true);
        _buttons[0].GetComponentInChildren<TMP_Text>().text = "Insert 추가";
        _buttons[0].onClick.AddListener(() => {
            _requestUI.AddInputField(new string[] { "테이블 명", "컬럼 명", "데이터 값" }, DataType.TRANSACTION_INSERT);
        });

        _buttons[1].gameObject.SetActive(true);
        _buttons[1].GetComponentInChildren<TMP_Text>().text = "Update 추가";
        _buttons[1].onClick.AddListener(() => {
            _requestUI.AddInputField(new string[] { "테이블 명", "컬럼 명", "데이터 값", "유저 inDate(선택)" }, DataType.TRANSACTION_UPDATE);
        });
        
        _buttons[2].gameObject.SetActive(true);
        _buttons[2].GetComponentInChildren<TMP_Text>().text = "Delete 추가";
        _buttons[2].onClick.AddListener(() => {
            _requestUI.AddInputField(new string[] { "테이블 명", "데이터 inDate", "유저 inDate" }, DataType.TRANSACTION_DELETE);
        });
    }

    private void ResetByTransactionRead() {
        _buttons[0].gameObject.SetActive(true);
        _buttons[0].GetComponentInChildren<TMP_Text>().text = "Get(inDate) 추가";
        _buttons[0].onClick.AddListener(() => {
            _requestUI.AddInputField(new string[] { "테이블 명", "데이터 inDate", "유저 inDate" }, DataType.TRANSACTION_READ_INDATE);
        });
        
        _buttons[1].gameObject.SetActive(true);
        _buttons[1].GetComponentInChildren<TMP_Text>().text = "Get(Query) 추가";
        _buttons[1].onClick.AddListener(() => {
            _requestUI.AddInputField(new string[] { "테이블 명", "Equal 조건 컬럼(선택)", "조건 값" }, DataType.TRANSACTION_READ_QUERY);
        });
    }
    private void ResetByPlayerDataTransactionWrite() {
        _buttons[0].gameObject.SetActive(true);
        _buttons[0].GetComponentInChildren<TMP_Text>().text = "Insert 추가";
        _buttons[0].onClick.AddListener(() => {
            _requestUI.AddInputField(new string[] { "테이블 명", "컬럼 명", "데이터 값" }, DataType.PLAYER_DATA_TRANSACTION_INSERT);
        });

        _buttons[1].gameObject.SetActive(true);
        _buttons[1].GetComponentInChildren<TMP_Text>().text = "Update 추가(최근)";
        _buttons[1].onClick.AddListener(() => {
            _requestUI.AddInputField(new string[] { "테이블 명", "변경할 컬럼 명", "데이터 값" }, DataType.PLAYER_DATA_TRANSACTION_UPDATE);
        });
        
        _buttons[2].gameObject.SetActive(true);
        _buttons[2].GetComponentInChildren<TMP_Text>().text = "Delete 추가";
        _buttons[2].onClick.AddListener(() => {
            _requestUI.AddInputField(new string[] { "테이블 명", "데이터 inDate", "유저 inDate" }, DataType.PLAYER_DATA_TRANSACTION_DELETE);
        });
    }
    private void ResetByPlayerDataTransactionRead() {
        _buttons[0].gameObject.SetActive(true);
        _buttons[0].GetComponentInChildren<TMP_Text>().text = "최신 정보 조회 추가";
        _buttons[0].onClick.AddListener(() => {
            _requestUI.AddInputField("테이블 명", DataType.PLAYER_DATA_TRANSACTION_READ_ALL);
        });
        
        _buttons[1].gameObject.SetActive(true);
        _buttons[1].GetComponentInChildren<TMP_Text>().text = "타인 정보 조회 추가";
        _buttons[1].onClick.AddListener(() => {
            _requestUI.AddInputField(new string[] { "테이블 명", "유저 inDate", "(선택)데이터 inDate" }, DataType.PLAYER_DATA_TRANSACTION_READ_OTHER);
        });
        
        _buttons[2].gameObject.SetActive(true);
        _buttons[2].GetComponentInChildren<TMP_Text>().text = "내 정보 조회 추가";
        _buttons[2].onClick.AddListener(() => {
            _requestUI.AddInputField(new string[] { "테이블 명", "(선택)데이터 inDate"}, DataType.PLAYER_DATA_TRANSACTION_READ_MY);
        });
    }

    private void Reset() {
        for (int i = 0; i < _buttons.Length; i++) {
            _buttons[i].gameObject.SetActive(false);
            _buttons[i].onClick.RemoveAllListeners();
        }
    }
    
    private void CreateStringField() {
        _requestUI.AddInputField(new string[] {"데이터 이름", "데이터 값"});
    }

    private void CreateListField() {
        _requestUI.AddInputField(new string[] {"List 이름", "List 데이터"}, DataType.LIST);
    }

    private void CreateDictionaryField() {
        _requestUI.AddInputField(new string[] {"딕셔너리 이름", "딕셔너리 Key", "딕셔너리 Value"}, DataType.DICTIONARY);
    }

    public void OpenUI() {
        OpenUI(_buttonType);
    }

    public void OpenUI(ExtraInputType buttonType) {
        if (_buttonType != buttonType) {
            Reset();

            switch (buttonType) {
                case ExtraInputType.NORMAL:
                    ResetByNormal();
                    break;
                
                case ExtraInputType.CALCULATION:
                    ResetByCalculation();
                    break;
                case ExtraInputType.TRANSACTION_WRITE:
                    ResetByTransactionWrite();
                    break;
                case ExtraInputType.TRANSACTION_READ:
                    ResetByTransactionRead();
                    break;
                case ExtraInputType.PLAYER_DATA_TRANSACTION_WRITE:
                    ResetByPlayerDataTransactionWrite();
                    break;
                case ExtraInputType.PLAYER_DATA_TRANSACTION_READ:
                    ResetByPlayerDataTransactionRead();
                    break;
                default:
                    throw new ArgumentOutOfRangeException(nameof(buttonType), buttonType, null);
            }
        }


        _buttonType = buttonType;

        gameObject.SetActive(true);
    }

    public void CloseUI() {
        gameObject.SetActive(false);
    }
}