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

using System;
using System.Collections.Generic;
using UnityEngine;
using BackEnd;

public class PlayerDataGroup : BaseGroup {
    public override string GetGroupName() {
        return "유저 데이터 관리";
    }

    public override void SetSubFunctionButton() {
        UIManager.Instance.AddSubFunction("전체 데이터 조회", GetTableList);
        
        UIManager.Instance.AddSubFunction("게임 정보 삽입", Insert);
        
        
        UIManager.Instance.AddSubFunction("최근 등록된 데이터 불러오기", GetAllData);

        UIManager.Instance.AddSubFunction("최근 등록된 내 데이터 불러오기", GetMyData);
        UIManager.Instance.AddSubFunction("내 특정 데이터 불러오기", GetMyDataInDate);

        UIManager.Instance.AddSubFunction("최근 등록된 타인의 데이터 불러오기", GetOtherData);
        UIManager.Instance.AddSubFunction("타인의 특정 데이터 불러오기", GetOtherDataInDate);
        
        UIManager.Instance.AddSubFunction("내 최신 데이터 수정하기", UpdateWithInDate);
        UIManager.Instance.AddSubFunction("내 특정 데이터 수정하기", UpdateWithInDate);
        UIManager.Instance.AddSubFunction("타인의 데이터 수정하기", UpdateWithInDate);

        UIManager.Instance.AddSubFunction("내 최신 데이터 연산하기", UpdateMyLatestDataWithCalculation);
        UIManager.Instance.AddSubFunction("내 특정 데이터 연산하기", UpdateMyDataWithCalculation);
        UIManager.Instance.AddSubFunction("타인의 데이터 연산하기", UpdateOtherDataWithCalculation);
        
        UIManager.Instance.AddSubFunction("내 최신 데이터 삭제하기", DeleteMyLatestData);
        UIManager.Instance.AddSubFunction("내 특정 데이터 삭제하기", DeleteMyData);
        UIManager.Instance.AddSubFunction("타인의 데이터 삭제하기", DeleteOtherData);
        
        UIManager.Instance.AddSubFunction("트랜잭션 쓰기", TransactionWrite);
        UIManager.Instance.AddSubFunction("트랜잭션 읽기", TransactionRead);
    }

    private void GetTableList() {
        requestUI.SetExecuteButtonAction( () => {
            var bro = Backend.PlayerData.GetTableList();
            ShowResultData(bro);
        });
    }

    private void Insert() {
        requestUI.AddInputField("테이블 이름");
        requestUI.SetExtraInputAddUI();

        requestUI.SetExecuteButtonAction( () => {
            var tableName = InputParseByString(0, 0);
            
            Param param = new Param();
            AddParamFromExtraInput(1, param);

            
            var bro = Backend.PlayerData.InsertData(tableName, param);
            ShowResultData(bro);
        }); 
    }
    
    
    private string _getV2FirstString = string.Empty;
    private void GetAllData() {
        requestUI.AddInputField("테이블 이름");
        requestUI.AddInputField("불러올 갯수", 10);
        requestUI.AddInputField("다음 페이지 여부", "false");
        requestUI.AddInputField("내림(DESC)/오름(ASC)차순", "DESC");
        
        requestUI.SetExecuteButtonAction( () => {
            
            var tableName = InputParseByString(0, 0);
            var limit = InputParseByInt(1, 0);
            var nextPage = InputParseByBool(2, 0);
            var tableSortOrder = InputParseByEnum<TableSortOrder>(3, 0);

            BackendReturnObject bro;
            if (nextPage) {
                bro = Backend.PlayerData.GetAllData(tableName, limit, string.Empty, tableSortOrder);
            } else {
                bro = Backend.PlayerData.GetAllData(tableName, limit, _getV2FirstString, tableSortOrder);
            }
            
            if (bro.IsSuccess()) {
                if (bro.HasFirstKey()) {
                    _getV2FirstString = bro.FirstKeystring();
                } else {
                    _getV2FirstString = string.Empty;
                }
            }
            
            ShowResultData(bro); 
        });
    }
    
    private void GetMyData() {
        requestUI.AddInputField("테이블 이름");
        requestUI.AddInputField("불러올 갯수", 10);
        requestUI.AddInputField("다음 페이지 여부", "false");
        
        requestUI.SetExecuteButtonAction( () => {
            
            var tableName = InputParseByString(0, 0);
            var limit = InputParseByInt(1, 0);
            var nextPage = InputParseByBool(2, 0);

            BackendReturnObject bro;
            if (nextPage) {
                bro = Backend.PlayerData.GetMyData(tableName, limit, string.Empty);
            } else {
                bro = Backend.PlayerData.GetMyData(tableName, limit, _getV2FirstString);
            }
            
            if (bro.IsSuccess()) {
                if (bro.HasFirstKey()) {
                    _getV2FirstString = bro.FirstKeystring();
                } else {
                    _getV2FirstString = string.Empty;
                }
            }
            
            ShowResultData(bro); 
        });
    }
    private void GetMyDataInDate() {
        requestUI.AddInputField("테이블 이름");
        requestUI.AddInputField("데이터 inDate");
        
        requestUI.SetExecuteButtonAction( () => {

            var tableName = InputParseByString(0, 0);
            var rowInDate = InputParseByString(1, 0);
            var userInDate = InputParseByString(2, 0);

            var bro = Backend.PlayerData.GetMyData(tableName, rowInDate);
            ShowResultData(bro); 
        });
    }
    
    private void GetOtherData() {
        requestUI.AddInputField("테이블 이름");
        requestUI.AddInputField("유저 inDate");
        requestUI.AddInputField("불러올 갯수", 10);
        requestUI.AddInputField("다음 페이지 여부", "false");
        requestUI.AddInputField("내림(DESC)/오름(ASC)차순", "DESC");
        
        requestUI.SetExecuteButtonAction( () => {

            var tableName = InputParseByString(0, 0);
            var ownerInDate = InputParseByString(1, 0);
            var limit = InputParseByInt(2, 0);
            var nextPage = InputParseByBool(3, 0);
            var tableSortOrder = InputParseByEnum<TableSortOrder>(4, 0);

            BackendReturnObject bro;
            if (nextPage) {
                bro = Backend.PlayerData.GetOtherData(tableName, ownerInDate, limit, string.Empty, tableSortOrder);
            } else {
                bro = Backend.PlayerData.GetOtherData(tableName, ownerInDate, limit, _getV2FirstString, tableSortOrder);
            }
            
            if (bro.IsSuccess()) {
                if (bro.HasFirstKey()) {
                    _getV2FirstString = bro.FirstKeystring();
                } else {
                    _getV2FirstString = string.Empty;
                }
            }
            
            ShowResultData(bro); 
        });
    }
    
    private void GetOtherDataInDate() {
        requestUI.AddInputField("테이블 이름");
        requestUI.AddInputField("데이터 inDate");
        requestUI.AddInputField("유저 inDate");

        requestUI.SetExecuteButtonAction( () => {

            var tableName = InputParseByString(0, 0);
            var rowInDate = InputParseByString(1, 0);
            var userInDate = InputParseByString(2, 0);

            var bro = Backend.PlayerData.GetOtherData(tableName, rowInDate, userInDate);
            ShowResultData(bro); 
        });
    }
    
    private void UpdateWithInDate() {
        requestUI.AddInputField("테이블 이름");
        requestUI.AddInputField("데이터 inDate");
        requestUI.AddInputField("유저 inDate");

        requestUI.SetExtraInputAddUI();

        requestUI.SetExecuteButtonAction( () => {
            var tableName = InputParseByString(0, 0);
            var rowInDate = InputParseByString(1, 0);
            var userInDate = InputParseByString(2, 0);

            Param param = new Param();
            AddParamFromExtraInput(3, param);
            
            var bro = Backend.PlayerData.UpdateOtherData(tableName, rowInDate,userInDate, param);
            ShowResultData(bro);
        }); 
    }
    
    private void UpdateMyLatestData() {
        requestUI.AddInputField("테이블 이름");

        requestUI.SetExtraInputAddUI();

        requestUI.SetExecuteButtonAction( () => {
            var tableName = InputParseByString(0, 0);

            Param param = new Param();
            AddParamFromExtraInput(1, param);

            
            var bro = Backend.PlayerData.UpdateMyLatestData(tableName, param);
            ShowResultData(bro);
        }); 
    }
    
    private void UpdateMyData() {
        requestUI.AddInputField("테이블 이름");
        requestUI.AddInputField("데이터 inDate");

        requestUI.SetExtraInputAddUI();

        requestUI.SetExecuteButtonAction( () => {
            var tableName = InputParseByString(0, 0);
            var rowInDate = InputParseByString(1, 0);

            Param param = new Param();
            AddParamFromExtraInput(2, param);

            
            var bro = Backend.PlayerData.UpdateMyData(tableName, rowInDate, param);
            ShowResultData(bro);
        }); 
    }
    
    private void UpdateOtherDataWithCalculation() {
        requestUI.AddInputField("테이블 이름");
        requestUI.AddInputField("데이터 inDate");
        requestUI.AddInputField("유저 inDate");

        requestUI.SetExtraInputAddUI(ExtraInputAddUI.ExtraInputType.CALCULATION);

        requestUI.SetExecuteButtonAction( () => {
            var tableName = InputParseByString(0, 0);

            var rowInDate = InputParseByString(1, 0);
            var userInDate = InputParseByString(2, 0);

            Param param = new Param();
            for (int i = 3; i < requestUI.GetValueInputFieldList().Count; i++) {
                string key = InputParseByString(i, 0);
                GameInfoOperator oper = InputParseByEnum<GameInfoOperator>(i, 1);
                float value = InputParseByFloat(i, 2);
                
                param.AddCalculation(key,oper,value);
            }
            
            var bro = Backend.PlayerData.UpdateOtherDataWithCalculation(tableName, rowInDate, userInDate,param);
            ShowResultData(bro);
        }); 
    }
    
    private void UpdateMyLatestDataWithCalculation() {
        requestUI.AddInputField("테이블 이름");
        requestUI.SetExtraInputAddUI(ExtraInputAddUI.ExtraInputType.CALCULATION);

        requestUI.SetExecuteButtonAction( () => {
            var tableName = InputParseByString(0, 0);
            
            Param param = new Param();

            for (int i = 1; i < requestUI.GetValueInputFieldList().Count; i++) {
                string key = InputParseByString(i, 0);
                GameInfoOperator oper = InputParseByEnum<GameInfoOperator>(i, 1);
                float value = InputParseByFloat(i, 2);
                
                param.AddCalculation(key,oper,value);
            }
            
            var bro = Backend.PlayerData.UpdateMyLatestDataWithCalculation(tableName, param);
            ShowResultData(bro);
        }); 
    }
    
    private void UpdateMyDataWithCalculation() {
        requestUI.AddInputField("테이블 이름");
        requestUI.AddInputField("데이터 inDate");
        requestUI.SetExtraInputAddUI(ExtraInputAddUI.ExtraInputType.CALCULATION);

        requestUI.SetExecuteButtonAction( () => {
            var tableName = InputParseByString(0, 0);
            var rowInDate = InputParseByString(1, 0);

            Param param = new Param();

            for (int i = 2; i < requestUI.GetValueInputFieldList().Count; i++) {
                string key = InputParseByString(i, 0);
                GameInfoOperator oper = InputParseByEnum<GameInfoOperator>(i, 1);
                float value = InputParseByFloat(i, 2);
                
                param.AddCalculation(key,oper,value);
            }
            
            var bro = Backend.PlayerData.UpdateMyDataWithCalculation(tableName,rowInDate, param);
            ShowResultData(bro);
        }); 
    }
    
    private void DeleteOtherData() {
        requestUI.AddInputField("테이블 이름");
        requestUI.AddInputField("데이터 inDate");
        requestUI.AddInputField("유저 inDate");
        
        requestUI.SetExecuteButtonAction( () => {
            var tableName = InputParseByString(0, 0);
            var rowInDate = InputParseByString(1, 0);
            var userInDate = InputParseByString(2, 0);

            
            var bro = Backend.PlayerData.DeleteOtherData(tableName, rowInDate,userInDate);
            ShowResultData(bro);
        }); 
    }
    
    private void DeleteMyData() {
        requestUI.AddInputField("테이블 이름");
        requestUI.AddInputField("데이터 inDate");

        requestUI.SetExecuteButtonAction( () => {
            var tableName = InputParseByString(0, 0);
            var rowInDate = InputParseByString(1, 0);

            var bro = Backend.PlayerData.DeleteMyData(tableName, rowInDate);
            ShowResultData(bro);
        }); 
    }
    
    private void DeleteMyLatestData() {
        requestUI.AddInputField("테이블 이름");

        requestUI.SetExecuteButtonAction( () => {
            var tableName = InputParseByString(0, 0);

            var bro = Backend.PlayerData.DeleteMyLatestData(tableName);
            ShowResultData(bro);
        }); 
    }
    
    private void TransactionWrite() {
        requestUI.SetExtraInputAddUI(ExtraInputAddUI.ExtraInputType.PLAYER_DATA_TRANSACTION_WRITE);
        
        requestUI.SetExecuteButtonAction( () => {

            PlayerDataTransactionWrite playerDataTransactionWrite = new PlayerDataTransactionWrite();

            for (int i = 0; i < requestUI.GetValueInputFieldList().Count; i++) {
                
                switch (requestUI.GetValueInputFieldList()[i].dataType) {
                    case DataType.PLAYER_DATA_TRANSACTION_INSERT: 
                        string tableName = InputParseByString(i, 0);
                        string key = InputParseByString(i, 1);
                        string value = InputParseByString(i, 2);

                        Param insertParam = new Param();
                        insertParam.Add(key,value);
                        playerDataTransactionWrite.AddInsert(tableName, insertParam);
                        
                        break;
                    case DataType.PLAYER_DATA_TRANSACTION_UPDATE:
                        string tableName2 = InputParseByString(i, 0);
                        string key2 = InputParseByString(i, 1);
                        string value2 = InputParseByString(i, 2);

                        Param updateParam = new Param();
                        updateParam.Add(key2,value2);
                        
                        playerDataTransactionWrite.AddUpdateMyLatestData(tableName2, updateParam);
                        break;
                    case DataType.PLAYER_DATA_TRANSACTION_DELETE:
                        string tableName3 = InputParseByString(i, 0);
                        string rowInDate3 = InputParseByString(i, 1);
                        string userInDate3 = InputParseByString(i, 2);
                        playerDataTransactionWrite.AddDeleteOtherData(tableName3, rowInDate3,userInDate3);
                        
                        break;
                    default:
                        throw new Exception($"{i + 1}번째 인자값은 지원하지 않습니다.\n{requestUI.GetValueInputFieldList()[i].dataType}");
                }
            }

            
            var bro = Backend.PlayerData.TransactionWrite(playerDataTransactionWrite);
            ShowResultData(bro);
        }); 
    }
    
        private void TransactionRead() {
            
            requestUI.SetExtraInputAddUI(ExtraInputAddUI.ExtraInputType.PLAYER_DATA_TRANSACTION_READ);

            requestUI.SetExecuteButtonAction( () => {
                PlayerDataTransactionRead playerDataTransactionRead = new PlayerDataTransactionRead();
            
            for (int i = 0; i < requestUI.GetValueInputFieldList().Count; i++) {
                
                switch (requestUI.GetValueInputFieldList()[i].dataType) {
                    case DataType.PLAYER_DATA_TRANSACTION_READ_ALL: 
                    {
                        string tableName = InputParseByString(i, 0);

                        playerDataTransactionRead.AddGetAllLatestData(tableName);
                        break;
                    }
                    case DataType.PLAYER_DATA_TRANSACTION_READ_OTHER: 
                    {
                        string tableName = InputParseByString(i, 0);
                        string userInDate = InputParseByString(i, 1);
                        string rowInDate = InputParseByString(i, 2);

                        if (string.IsNullOrEmpty(rowInDate)) {
                            playerDataTransactionRead.AddGetOtherLatestData(tableName, userInDate);

                        } else {
                            playerDataTransactionRead.AddGetOtherData(tableName, rowInDate, userInDate);

                        }
                        break;

                    }

                    case DataType.PLAYER_DATA_TRANSACTION_READ_MY:
                    {
                        string tableName = InputParseByString(i, 0);
                        string rowInDate = InputParseByString(i, 1);
                        Debug.Log(InputParseByString(i, 0));
                        Debug.Log(InputParseByString(i, 1));
                        
                        if (string.IsNullOrEmpty(rowInDate)) {
                            playerDataTransactionRead.AddGetMyLatestData(tableName);
                        } else {
                            playerDataTransactionRead.AddGetMyData(tableName,rowInDate);

                        }
                        break;
                    }

                    default:
                        throw new Exception($"{i + 1}번째 인자값은 지원하지 않습니다.\n{requestUI.GetValueInputFieldList()[i].dataType}");
                }
            }
            
            var bro = Backend.PlayerData.TransactionRead(playerDataTransactionRead);
            ShowResultData(bro);
        }); 
    }
}