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

using System;
using UnityEngine;
using BackEnd;

public class RankGroup : BaseGroup {
    public override string GetGroupName() {
        return "랭킹 관리";
    }

    public override void SetSubFunctionButton() {
        UIManager.Instance.AddSubFunction("모든 유저 랭킹 설정값 정보 조회", GetRankTableListByUser);
        
        UIManager.Instance.AddSubFunction("유저 랭킹 갱신",                UpdateUserScore);
        UIManager.Instance.AddSubFunction("유저 랭킹 리스트 조회",           GetRankListByUser);
        UIManager.Instance.AddSubFunction("내 랭킹 조회",                  GetMyRank);
        UIManager.Instance.AddSubFunction("특정 유저 랭킹 조회",            GetUserRank);
        UIManager.Instance.AddSubFunction("특정 점수를 가진 유저의 랭킹 조회", GetRankListByScoreByUser);
        UIManager.Instance.AddSubFunction("유저 랭킹 보상 정보 조회",         GetRankRewardListByUser);

        UIManager.Instance.AddSubFunction("모든 길드 랭킹 설정값 정보 조회",  GetRankTableListByGuild);
        UIManager.Instance.AddSubFunction("메타 정보로 랭킹 갱신",         UpdateGuildMetaData);
        UIManager.Instance.AddSubFunction("굿즈 기부로 랭킹 갱신",          ContributeGuildGoods);
        UIManager.Instance.AddSubFunction("굿즈 사용으로 랭킹 갱신",        UseGuildGoods);
        UIManager.Instance.AddSubFunction("길드 랭킹 리스트 조회",         GetRankListByGuild);
        UIManager.Instance.AddSubFunction("내 길드 랭킹 조회",             GetMyGuildRank);
        UIManager.Instance.AddSubFunction("특정 길드의 랭킹 조회",          GetGuildRank);
        UIManager.Instance.AddSubFunction("특정 점수를 가진 길드의 랭킹 조회", GetRankListByScoreByGuild);
        UIManager.Instance.AddSubFunction("길드 랭킹 보상 정보 조회",        GetRankRewardListByGuild);
        
        UIManager.Instance.AddSubFunction("랭킹 과거 순위 조회", GetPastRankList);

    }
    
    private void GetRankTableListByUser() {
        
        requestUI.SetExecuteButtonAction( () => {
            var bro = Backend.URank.User.GetRankTableList();
            ShowResultData(bro);
        });
    }
    private void UpdateUserScore() {
        requestUI.AddInputField("rankUUID");
        requestUI.AddInputField("테이블 이름");
        requestUI.AddInputField(new [] {"점수 컬럼명", "점수 값"});
        requestUI.AddInputField(new [] {"추가항목 컬럼명(선택)", "추가 항목 값"});
        
        requestUI.SetExecuteButtonAction( () => {

            var rankUUID = InputParseByString(0, 0);
            var tableName = InputParseByString(1, 0);
            var scoreName = InputParseByString(2, 0);
            var scoreValue = InputParseByFloat(2, 1);
            
            var extraColumn = InputParseByString(3, 0);
            var extraData = InputParseByString(3, 1);

            Param param = new Param();
            param.Add(scoreName, scoreValue);

            if (string.IsNullOrEmpty(extraColumn) == false && string.IsNullOrEmpty(extraData) == false) {
                param.Add(extraColumn, extraData);
            }
            
            string rowInDate= string.Empty;

            var bro = Backend.GameData.Get(tableName, new Where());
            if (bro.IsSuccess()) {
                if (bro.FlattenRows().Count > 0) {
                    rowInDate = bro.FlattenRows()[0]["inDate"].ToString();
                } else {
                    bro = Backend.GameData.Insert(tableName);

                    if (bro.IsSuccess()) {
                        rowInDate = bro.GetInDate();
                    } else {
                        UIManager.Instance.OpenResultUI("게임정보를 삽입하는 중 에러가 발생했습니다.\n" + bro);
                        return;
                    }
                }
                
            } else {
                UIManager.Instance.OpenResultUI("게임정보를 불러오는 중 에러가 발생했습니다.\n" + bro);
                return;
            }
            
            bro = Backend.URank.User.UpdateUserScore(rankUUID, tableName, rowInDate, param);
            ShowResultData(bro);
        });
    }
    private void GetRankListByUser() {
        requestUI.AddInputField("rankUUID");
        requestUI.AddInputField("불러올 갯수", 10);
        requestUI.AddInputField("시작 지점", 0);

        requestUI.SetExecuteButtonAction( () => {

            var rankUUID = InputParseByString(0, 0);
            var limit = InputParseByInt(1, 0);
            var offset = InputParseByInt(2, 0);
            
            var bro = Backend.URank.User.GetRankList(rankUUID, limit, offset);
            ShowResultData(bro);

        });

    }
    private void GetMyRank() {
        requestUI.AddInputField("rankUUID");
        requestUI.AddInputField("점수 폭", 0);

        requestUI.SetExecuteButtonAction( () => {
            
            var rankUUID = InputParseByString(0, 0);
            var gap = InputParseByInt(1, 0);

            var bro = Backend.URank.User.GetMyRank(rankUUID, gap);
            ShowResultData(bro);

        });
    }
    private void GetUserRank() {
        requestUI.AddInputField("rankUUID");
        requestUI.AddInputField("유저 inDate");

        requestUI.AddInputField("점수 폭", 0);

        requestUI.SetExecuteButtonAction( () => {
            
            var rankUUID = InputParseByString(0, 0);
            var userInDate = InputParseByString(1, 0);
            var gap = InputParseByInt(2, 0);

            var bro = Backend.URank.User.GetUserRank(rankUUID, userInDate, gap);
            ShowResultData(bro);

        });
    }
    private void GetRankListByScoreByUser() {
        requestUI.AddInputField("rankUUID");
        requestUI.AddInputField("점수", 0);

        requestUI.SetExecuteButtonAction( () => {
            
            var rankUUID = InputParseByString(0, 0);
            var score = InputParseByInt(1, 0);

            var bro = Backend.URank.User.GetRankListByScore(rankUUID, score);
            ShowResultData(bro);

        });
    }
    private void GetRankRewardListByUser() {
        requestUI.AddInputField("rankUUID");
        
        requestUI.SetExecuteButtonAction( () => {
            
            var rankUUID = InputParseByString(0, 0);
            var bro = Backend.URank.User.GetRankRewardList(rankUUID);
            ShowResultData(bro);

        });

    }
    private void GetRankTableListByGuild() {
        requestUI.SetExecuteButtonAction( () => {
            var bro = Backend.URank.Guild.GetRankTableList();
            ShowResultData(bro);

        });
    }
    private void UpdateGuildMetaData() {
        requestUI.AddInputField("rankUUID");
        requestUI.AddInputField(new string[] {"meta 이름", "값(숫자)"});
        
        requestUI.SetExecuteButtonAction( () => {
            
            var rankUUID = InputParseByString(0, 0);
            var metaKey = InputParseByString(1, 0);
            var score = InputParseByInt(1, 1);

            var bro = Backend.URank.Guild.UpdateGuildMetaData(rankUUID, metaKey, score);
            ShowResultData(bro);

        });
    }
    private void ContributeGuildGoods() {
        requestUI.AddInputField("rankUUID");
        requestUI.AddInputField("goodsType", "goods1");
        requestUI.AddInputField("재화량",0);
        
        requestUI.SetExecuteButtonAction( () => {
            
            var rankUUID = InputParseByString(0, 0);
            var goodsType = InputParseByEnum<BackEnd.goodsType>(1, 0);
            var amount = InputParseByInt(2, 0);
            
            var bro = Backend.URank.Guild.ContributeGuildGoods(rankUUID, (goodsType)goodsType, amount);
            ShowResultData(bro);
        });
    }
    private void UseGuildGoods() {
        requestUI.AddInputField("rankUUID");
        requestUI.AddInputField("goodsType", "goods1");
        requestUI.AddInputField("재화량",0);
        
        requestUI.SetExecuteButtonAction( () => {
            
            var rankUUID = InputParseByString(0, 0);
            var goodsType = InputParseByEnum<BackEnd.goodsType>(1, 0);
            var amount = InputParseByInt(2, 0);
            
            var bro = Backend.URank.Guild.UseGuildGoods(rankUUID, (goodsType)goodsType, amount);
            ShowResultData(bro);
        });
    }
    private void GetRankListByGuild() {
        requestUI.AddInputField("rankUUID");
        requestUI.AddInputField("불러올 갯수", 10);
        requestUI.AddInputField("시작 지점", 0);

        requestUI.SetExecuteButtonAction( () => {
            
            var rankUUID = InputParseByString(0, 0);
            var limit = InputParseByInt(1, 0);
            var offset = InputParseByInt(2, 0);

            var bro = Backend.URank.Guild.GetRankList(rankUUID, limit, offset);
            ShowResultData(bro);

        });
    }
    private void GetMyGuildRank() {
        requestUI.AddInputField("rankUUID");
        requestUI.AddInputField("점수 폭", 0);

        requestUI.SetExecuteButtonAction( () => {
            
            var rankUUID = InputParseByString(0, 0);
            var gap = InputParseByInt(1, 0);
            
            var bro = Backend.URank.Guild.GetMyGuildRank(rankUUID, gap);
            ShowResultData(bro);

        });
    }
    private void GetGuildRank() {
        requestUI.AddInputField("rankUUID");
        requestUI.AddInputField("유저 inDate");

        requestUI.AddInputField("점수 폭", 0);

        requestUI.SetExecuteButtonAction( () => {
            
            var rankUUID = InputParseByString(0, 0);
            var userInDate = InputParseByString(1, 0);
            var gap = InputParseByInt(2, 0);

            var bro = Backend.URank.Guild.GetGuildRank(rankUUID, userInDate, gap);
            ShowResultData(bro);
        });
    }
    private void GetRankListByScoreByGuild() {
        requestUI.AddInputField("rankUUID");
        requestUI.AddInputField("점수", 0);

        requestUI.SetExecuteButtonAction( () => {
            
            var rankUUID = InputParseByString(0, 0);
            var score = InputParseByInt(1, 0);

            var bro = Backend.URank.Guild.GetRankListByScore(rankUUID, score);
            ShowResultData(bro);

        });
    }
    private void GetRankRewardListByGuild() {
        requestUI.AddInputField("rankUUID");
        
        requestUI.SetExecuteButtonAction( () => {
            var rankUUID = InputParseByString(0, 0);
            
            var bro = Backend.URank.Guild.GetRankRewardList(rankUUID);
            ShowResultData(bro);

        });
    }
    
    private void GetPastRankList() {
        requestUI.AddInputField("rankUUID");
        requestUI.AddInputField("limit");
        requestUI.AddInputField("offset");

        requestUI.SetExecuteButtonAction( () => {
            var rankUUID = InputParseByString(0, 0);
            var limit = InputParseByInt(1, 0);
            var offset = InputParseByInt(2, 0);

            var bro = Backend.URank.Guild.GetPastRankList(rankUUID,limit,offset);
            ShowResultData(bro);
        });
    }
}