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

using System;
using BackEnd;
using BackEnd.GlobalSupport;

public class BMemberGroup : BaseGroup {
    
    public override string GetGroupName() {
        return "게임 유저 관리";
    }
    
    public override void SetSubFunctionButton() {
        
        // 커스텀 계정
        UIManager.Instance.AddSubFunction("커스텀 회원가입", CustomSignUp);
        UIManager.Instance.AddSubFunction("커스텀 로그인", CustomLogin);
        UIManager.Instance.AddSubFunction("이메일 정보 등록", UpdateCustomEmail);
        UIManager.Instance.AddSubFunction("아이디 찾기", FindCustomID);
        UIManager.Instance.AddSubFunction("패스워드 일치 여부 확인", ConfirmCustomPassword);
        UIManager.Instance.AddSubFunction("패스워드 초기화", ResetPassword);
        UIManager.Instance.AddSubFunction("패스워드 변경", UpdatePassword);

        
        // 게스트 계정
        UIManager.Instance.AddSubFunction("게스트 로그인", GuestLogin);
        UIManager.Instance.AddSubFunction("로컬에 저장된 게스트 ID 조회", GetGuestID);
        UIManager.Instance.AddSubFunction("로컬에 저장된 게스트 정보 삭제", DeleteGuestInfo);

        // 페데레이션 미제공
        
        // 유저 인증 토큰
        UIManager.Instance.AddSubFunction("토큰 로그인", LoginWithTheBackendToken);
        UIManager.Instance.AddSubFunction("토큰 갱신", RefreshTheBackendToken);
        UIManager.Instance.AddSubFunction("액세스 토큰 여부", IsAccessTokenAlive);

        // 자신의 유저 정보 조회
        UIManager.Instance.AddSubFunction("서버에서 유저 정보 조회", GetUserInfo);

        // 닉네임
        UIManager.Instance.AddSubFunction("닉네임 수정", UpdateNickname);
        UIManager.Instance.AddSubFunction("닉네임 중복 확인", CheckNicknameDuplication);

        // 국가 관리
        UIManager.Instance.AddSubFunction("국가코드 등록", UpdateCountryCode);
        UIManager.Instance.AddSubFunction("국가코드 조회", GetMyCountryCode);
        UIManager.Instance.AddSubFunction("다른 유저의 국가코드 조회", GetCountryCodeByIndate);
        
        UIManager.Instance.AddSubFunction("로그아웃", Logout);
        UIManager.Instance.AddSubFunction("회원 탈퇴", SignOut);

    }
    
    private void CustomSignUp() {
        requestUI.AddInputField("아이디");
        requestUI.AddInputField("비밀번호");
        
        requestUI.SetExecuteButtonAction( () => {
            var id = InputParseByString(0, 0);
            var pw = InputParseByString( 1, 0);
            
            var bro = Backend.BMember.CustomSignUp(id, pw);

            if (bro.IsSuccess()) {
                string str = $"userInDate : {Backend.UserInDate}\n" +
                             $"nickName : {Backend.UserNickName}\n" +
                             $"UID : {Backend.UID}";
                UIManager.Instance.OpenResultUI("회원가입에 성공하였습니다.\n" + str);
            } else {
                UIManager.Instance.OpenResultUI("에러가 발생하였습니다\n" + bro.ToString());
            }
            
            LoginUI.UpdateUserData();
        });
    }
    
    private void CustomLogin() {
        requestUI.AddInputField("아이디");
        requestUI.AddInputField("비밀번호");
        
        requestUI.SetExecuteButtonAction( () => {
            var id = InputParseByString(0, 0);
            var pw = InputParseByString( 1, 0);

            var bro = Backend.BMember.CustomLogin(id, pw);

            if (bro.IsSuccess()) {
                string str = $"userInDate : {Backend.UserInDate}\n" +
                             $"nickName : {Backend.UserNickName}\n" +
                             $"UID : {Backend.UID}";
                UIManager.Instance.OpenResultUI("로그인에 성공하였습니다.\n" + str);
            } else {
                UIManager.Instance.OpenResultUI("에러가 발생하였습니다\n" + bro.ToString());
            }
            LoginUI.UpdateUserData();

        });
    }
    
    private void UpdateCustomEmail() {
        requestUI.AddInputField("이메일");
        
        requestUI.SetExecuteButtonAction( () => {
            var email = InputParseByString(0, 0);
            
            var bro = Backend.BMember.UpdateCustomEmail(email);
            ShowResultData(bro);
        });
    }
    
    private void FindCustomID() {
        requestUI.AddInputField("이메일");
        
        requestUI.SetExecuteButtonAction( () => {
            var email = InputParseByString(0, 0);

            var bro = Backend.BMember.FindCustomID(email);
            ShowResultData(bro);
        });
    }

    private void ConfirmCustomPassword() {
        requestUI.AddInputField("비밀번호");
        
        requestUI.SetExecuteButtonAction( () => {
            var customGamerPassword = InputParseByString(0, 0);

            var bro = Backend.BMember.ConfirmCustomPassword(customGamerPassword);
            ShowResultData(bro);
        });
    }

    private void ResetPassword() {
        requestUI.AddInputField("아이디");
        requestUI.AddInputField("이메일");

        requestUI.SetExecuteButtonAction( () => {
            
            var id = InputParseByString(0, 0);
            var emailAddress = InputParseByString(1, 0);

            var bro = Backend.BMember.ResetPassword(id, emailAddress);
            ShowResultData(bro);
        });
    }

    private void UpdatePassword() {
        requestUI.AddInputField("이전 비밀번호");
        requestUI.AddInputField("새로운 비밀번호");

        requestUI.SetExecuteButtonAction( () => {
            var oldPassword = InputParseByString(0, 0);
            var newPassword = InputParseByString(1, 0);

            var bro = Backend.BMember.UpdatePassword(oldPassword, newPassword);
            ShowResultData(bro);
        });
    }

    private void GuestLogin() {
        requestUI.SetExecuteButtonAction( () => {
            var bro = Backend.BMember.GuestLogin();
            ShowResultData(bro);
            LoginUI.UpdateUserData();
        });
    }
    
    private void GetGuestID() {
        requestUI.SetExecuteButtonAction( () => {
            var bro = Backend.BMember.GetGuestID();
            UIManager.Instance.OpenResultUI("로컬에 저장된 아이디 : " + bro.ToString());
        });
    }
    
    private void DeleteGuestInfo() {
        requestUI.SetExecuteButtonAction( () => {
            Backend.BMember.DeleteGuestInfo();
            UIManager.Instance.OpenResultUI("삭제하였습니다.");
        });
    }
    
    
    private void LoginWithTheBackendToken() {
        requestUI.SetExecuteButtonAction( () => {
            var bro = Backend.BMember.LoginWithTheBackendToken();
            ShowResultData(bro);
            LoginUI.UpdateUserData();
        });    
    }
    
    private void RefreshTheBackendToken() {
        requestUI.SetExecuteButtonAction( () => {
            var bro = Backend.BMember.RefreshTheBackendToken();
            ShowResultData(bro);
        });
    }

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

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

    private void UpdateNickname() {
        requestUI.AddInputField("닉네임");

        requestUI.SetExecuteButtonAction( () => {
            var nickname = InputParseByString(0, 0);
            
            var bro = Backend.BMember.UpdateNickname(nickname);
            ShowResultData(bro);
        });
    }

    private void CheckNicknameDuplication() {
        requestUI.AddInputField("닉네임");

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

            var bro = Backend.BMember.CheckNicknameDuplication(nickname);
            ShowResultData(bro);
        }); 
    }

    private void UpdateCountryCode() {
        requestUI.AddInputField("CountryCode", "SouthKorea");
        
        requestUI.SetExecuteButtonAction( () => {

            var countryCode = InputParseByEnum<CountryCode>(0, 0);

            var bro = Backend.BMember.UpdateCountryCode(countryCode);
            ShowResultData(bro);
        });     
    }

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

    private void GetCountryCodeByIndate() {
        requestUI.AddInputField("유저 inDate");

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

            var bro = Backend.BMember.GetCountryCodeByIndate(userInDate);
            ShowResultData(bro);
        });     
    }

    private void Logout() {
        requestUI.SetExecuteButtonAction( () => {
            var bro = Backend.BMember.Logout();
            ShowResultData(bro);
        });
    }
    private void SignOut() {
        requestUI.AddInputField("유예시간(시간)");
        
        requestUI.SetExecuteButtonAction( () => {

            var graceHours = InputParseByInt(0, 0);

            var bro = Backend.BMember.WithdrawAccount(graceHours);
            ShowResultData(bro);
        });
    }
}