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

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

public partial class GuildGroup : BaseGroup {
    public override string GetGroupName() {
        return "길드 기능";
    }

    public override void SetSubFunctionButton() {
        UIManager.Instance.AddSubFunction("길드 생성", CreateGuildV3);
        UIManager.Instance.AddSubFunction("길드 가입 요청", ApplyGuildV3);
        UIManager.Instance.AddSubFunction("길드 탈퇴", WithdrawGuildV3);
        
        UIManager.Instance.AddSubFunction("모든 길드 리스트 조회", GetGuildListV3);
        UIManager.Instance.AddSubFunction("내 길드 정보 조회", GetMyGuildInfoV3);
        UIManager.Instance.AddSubFunction("길드의 inDate 조회하기", GetGuildIndateByGuildNameV3);
        UIManager.Instance.AddSubFunction("특정 길드 정보 조회", GetGuildInfoV3);
        UIManager.Instance.AddSubFunction("특정 길드 회원 정보 조회", GetGuildMemberListV3);
        
        UIManager.Instance.AddSubFunction("메타 데이터 변경", ModifyGuildV3);
        UIManager.Instance.AddSubFunction("메타 데이터 변경(4~5시 갱신 불가)", ModifyGuildV3);

        UIManager.Instance.AddSubFunction("굿즈 기부", ContributeGoodsV3);
        UIManager.Instance.AddSubFunction("굿즈 기부(4~5시 갱신 불가)", ContributeGoodsV4);

        UIManager.Instance.AddSubFunction("내 길드 굿즈 정보 조회", GetMyGuildGoodsV3);
        UIManager.Instance.AddSubFunction("다른 길드 굿즈 정보 조회", GetGuildGoodsByIndateV3);
        
        UIManager.Instance.AddSubFunction("길드 마스터 권한 위임", NominateMasterV3);
        UIManager.Instance.AddSubFunction("부 길드 마스터 지정", NominateViceMasterV3);
        UIManager.Instance.AddSubFunction("부 길드 마스터 해제", ReleaseViceMasterV3);
        UIManager.Instance.AddSubFunction("굿즈 사용", UseGoodsV3);
        UIManager.Instance.AddSubFunction("굿즈 사용(4~5시 갱신 불가)", UseGoodsV4);

        UIManager.Instance.AddSubFunction("길드 즉시 가입 설정", SetRegistrationValueV3);
        UIManager.Instance.AddSubFunction("길드 국가 코드 수정", UpdateCountryCodeV3);

        UIManager.Instance.AddSubFunction("길드 가입 요청 유저 리스트 조회", GetApplicantsV3);
        UIManager.Instance.AddSubFunction("길드 가입 승인", ApproveApplicantV3);
        UIManager.Instance.AddSubFunction("길드 가입 거절", RejectApplicantV3);
        UIManager.Instance.AddSubFunction("길드 회원 추방", ExpelMemberV3);
        
    }

    private void CreateGuildV3() {
        requestUI.AddInputField("길드 이름");
        requestUI.AddInputField("재화 종류 수", 10);
        requestUI.AddInputField("국가정보(선택)", "SouthKorea");
        requestUI.AddInputField(new string[] {"메타정보(컬럼명)(선택)", "메타정보(컬럼값)(선택)"});

        requestUI.SetExecuteButtonAction( () => {
            
            var guildName = InputParseByString(0, 0);
            var goodsCount = InputParseByInt(1, 0);
            var countryCode = InputParseByEnum<CountryCode>(2, 0);

            Param param = new Param();
            
            if (string.IsNullOrEmpty(requestUI.GetValueInputFieldList()[3].GetInputFields(0)) ||
                string.IsNullOrEmpty(requestUI.GetValueInputFieldList()[3].GetInputFields(1))) {
                // Param 이 하나라도 있을 경우
            } else {
                param.Add(requestUI.GetValueInputFieldList()[3].GetInputFields(0), requestUI.GetValueInputFieldList()[3].GetInputFields(1));
            }
            
            var bro = Backend.Guild.CreateGuildV3(guildName, goodsCount, param, (CountryCode)countryCode);
            ShowResultData(bro);
        }); 
    }

    private void ApplyGuildV3() {
        requestUI.AddInputField("길드 inDate");
        
        requestUI.SetExecuteButtonAction( () => {
            var guildInDate = InputParseByString(0, 0);

            var bro = Backend.Guild.ApplyGuildV3(guildInDate);
            ShowResultData(bro);
        }); 
    }
    
    private void WithdrawGuildV3() {
        requestUI.SetExecuteButtonAction( () => {

            var bro = Backend.Guild.WithdrawGuildV3();
            ShowResultData(bro);
        }); 
    }

    private string _guildListFirstString = string.Empty;
    
    private void GetGuildListV3() {
        requestUI.AddInputField("불러올 갯수", 10);
        requestUI.AddInputField("페이지 넘기기(bool)", "true");

        
        requestUI.SetExecuteButtonAction( () => {
            
            var limit = InputParseByInt(0, 0);
            var nextPage = InputParseByBool(1, 0);
            
            BackendReturnObject bro;
            
            if (nextPage && !string.IsNullOrEmpty(_guildListFirstString)) {
                bro = Backend.Guild.GetGuildListV3(limit, _guildListFirstString);
            } else {
                bro = Backend.Guild.GetGuildListV3(limit);
            }

            if (bro.IsSuccess() && bro.HasFirstKey()) {
                _guildListFirstString = bro.FirstKeystring();
            } else {
                _guildListFirstString = string.Empty;
            }
            
            ShowResultData(bro);
        }); 
    }
    

    private void GetMyGuildInfoV3() {
        requestUI.SetExecuteButtonAction( () => {
            var bro = Backend.Guild.GetMyGuildInfoV3();
            ShowResultData(bro);
        }); 
    }
    
    private void GetGuildIndateByGuildNameV3() {
        requestUI.AddInputField("길드 이름");

        
        requestUI.SetExecuteButtonAction( () => {
            var guildName = InputParseByString(0, 0);
            
            var bro = Backend.Guild.GetGuildIndateByGuildNameV3(guildName);
            ShowResultData(bro);
        }); 
    }
    
    private void GetGuildInfoV3() {
        requestUI.AddInputField("길드 inDate");

        
        requestUI.SetExecuteButtonAction( () => {
            var guildInDate = InputParseByString(0, 0);
            
            var bro = Backend.Guild.GetGuildInfoV3(guildInDate);
            ShowResultData(bro);
        }); 
    }
    
    private string _guildMemberListFirstString = string.Empty;
    
    private void GetGuildMemberListV3() {
        requestUI.AddInputField("길드 inDate");
        requestUI.AddInputField("불러올 갯수", 10);
        requestUI.AddInputField("페이지 넘기기(bool)", "true");

        
        requestUI.SetExecuteButtonAction( () => {

            var guildInDate = InputParseByString(0, 0);
            var limit = InputParseByInt(1, 0);
            var nextPage = InputParseByBool(2, 0);

            BackendReturnObject bro;
            
            if (nextPage && !string.IsNullOrEmpty(_guildMemberListFirstString)) {
                bro = Backend.Guild.GetGuildMemberListV3(guildInDate, limit, _guildMemberListFirstString);
            } else {
                bro = Backend.Guild.GetGuildMemberListV3(guildInDate, limit);
            }

            if (bro.IsSuccess() && bro.HasFirstKey()) {
                _guildMemberListFirstString = bro.FirstKeystring();
            } else {
                _guildMemberListFirstString = string.Empty;
            }
            
            ShowResultData(bro);
        }); 
    }

    private void ModifyGuildV3() {
        requestUI.SetExtraInputAddUI();

        requestUI.SetExecuteButtonAction( () => {
            Param param = new Param();
            AddParamFromExtraInput(0, param);


            var bro = Backend.Guild.ModifyGuildV3(param);
            ShowResultData(bro);
        });
    }
    
    // [5.9.4] 메타 데이터 변경 함수(4~5시 사이에는 428 에러 발생)
    private void ModifyGuildV4() {
        requestUI.SetExtraInputAddUI();

        requestUI.SetExecuteButtonAction( () => {
            Param param = new Param();
            AddParamFromExtraInput(0, param);


            var bro = Backend.Guild.ModifyGuildV4(param);
            ShowResultData(bro);
        });
    }

    private void ContributeGoodsV3() {
        requestUI.AddInputField("goodsType", "goods1");
        requestUI.AddInputField("재화량", 0);


        requestUI.SetExecuteButtonAction( () => {
            
            var goods = InputParseByEnum<goodsType>(0, 0);
            var amount = InputParseByInt(1, 0);

            var bro = Backend.Guild.ContributeGoodsV3((goodsType)goods, amount);
            
            ShowResultData(bro);
        }); 
    }
    
    // [5.9.4] 굿즈 기부 함수(4~5시 사이에는 428 에러 발생)
    private void ContributeGoodsV4() {
        requestUI.AddInputField("goodsType", "goods1");
        requestUI.AddInputField("재화량", 0);


        requestUI.SetExecuteButtonAction( () => {
            
            var goods = InputParseByEnum<goodsType>(0, 0);
            var amount = InputParseByInt(1, 0);

            var bro = Backend.Guild.ContributeGoodsV4((goodsType)goods, amount);
            
            ShowResultData(bro);
        }); 
    }

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

    private void GetGuildGoodsByIndateV3() {
        requestUI.AddInputField("길드 inDate");

        requestUI.SetExecuteButtonAction( () => {
            var guildInDate = InputParseByString(0, 0);
            
            var bro = Backend.Guild.GetGuildGoodsByIndateV3(guildInDate);
            ShowResultData(bro);
        }); 
    }
}