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

using System;
using UnityEngine;
using BackEnd;

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

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

        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);
    }

    private void UpdateUserScore() {
        requestUI.AddInputField("groupUUID");
        requestUI.AddInputField("테이블 이름");
        requestUI.AddInputField(new [] {"점수 컬럼명", "점수 값"});
        requestUI.AddInputField(new [] {"추가항목 컬럼명(선택)", "추가 항목 값"});
        
        requestUI.SetExecuteButtonAction( () => {

            var groupUUID = 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.Leaderboard.User.UpdateMyDataAndRefreshLeaderboard(groupUUID, tableName, rowInDate, param);
            ShowResultData(bro);
        });
    }
    private void GetRankListByUser() {
        requestUI.AddInputField("groupUUID");
        requestUI.AddInputField("불러올 갯수", 10);
        requestUI.AddInputField("시작 지점", 0);

        requestUI.SetExecuteButtonAction( () => {

            var groupUUID = InputParseByString(0, 0);
            var limit = InputParseByInt(1, 0);
            var offset = InputParseByInt(2, 0);
            
            var bro = Backend.Leaderboard.User.GetLeaderboard(groupUUID, limit, offset);
            ShowResultData(bro);

        });

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

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

            var bro = Backend.Leaderboard.User.GetMyLeaderboard(groupUUID, gap);
            ShowResultData(bro);

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

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

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

            var bro = Backend.Leaderboard.User.GetOtherUserLeaderboardPlace(groupUUID, userInDate, gap);
            ShowResultData(bro);

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

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

            var bro = Backend.Leaderboard.User.GetLeaderboardByScore(groupUUID, score);
            ShowResultData(bro);

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

            var bro = Backend.Leaderboard.Guild.UpdateGuildInfoAndRefreshLeaderboard(groupUUID, metaKey, score);
            ShowResultData(bro);

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

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

            var bro = Backend.Leaderboard.Guild.GetLeaderboard(groupUUID, limit, offset);
            ShowResultData(bro);

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

        requestUI.SetExecuteButtonAction( () => {
            
            var groupUUID = InputParseByString(0, 0);
            var gap = InputParseByInt(1, 0);
            
            var bro = Backend.Leaderboard.Guild.GetMyLeaderboard(groupUUID, gap);
            ShowResultData(bro);

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

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

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

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

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

            var bro = Backend.Leaderboard.Guild.GetLeaderboardByScore(groupUUID, score);
            ShowResultData(bro);

        });
    }
}