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

using System;
using System.Collections.Generic;
using System.Net;
using BackEnd;
using BackEnd.GlobalSupport;

public class MultiCharacterGroup  : BaseGroup {
    
    public override string GetGroupName() {
        return "멀티 캐릭터 관리";
    }
    
    //[uuid] [inDate]
    List<Tuple<string,string>> characterList = new List<Tuple<string,string>>();
    
    public override void SetSubFunctionButton() {
        
        // 커스텀 계정
        UIManager.Instance.AddSubFunction("계정 생성", CreateAccount);
        UIManager.Instance.AddSubFunction("계정 로그인", LoginAccount);
        UIManager.Instance.AddSubFunction("계정 자동 로그인", AutoLogin);
        UIManager.Instance.AddSubFunction("로그아웃", LogoutAccount);
        UIManager.Instance.AddSubFunction("계정 탈퇴", WithdrawAccount);
        UIManager.Instance.AddSubFunction("이메일 등록", UpdateCustomEmail);
        UIManager.Instance.AddSubFunction("아이디 찾기", FindAccountId);
        UIManager.Instance.AddSubFunction("비밀번호 초기화", ResetPassword);
        UIManager.Instance.AddSubFunction("비밀번호 일치 여부 확인", ConfirmCustomPassword);
        UIManager.Instance.AddSubFunction("비밀번호 변경", UpdatePassword);
        UIManager.Instance.AddSubFunction("캐릭터 불러오기", GetCharacterList);
        UIManager.Instance.AddSubFunction("테이블 + 캐릭터 불러오기", GetCharacterListWithTable);
        UIManager.Instance.AddSubFunction("캐릭터 생성하기", CreateCharacter);
        UIManager.Instance.AddSubFunction("캐릭터 생성 + 로그인", CreateCharacterAndLogin);

        UIManager.Instance.AddSubFunction("캐릭터 선택하기", SelectCharacter);
        UIManager.Instance.AddSubFunction("불러오기 후 캐릭터 선택하기", SelectCharacterByOrder);
        UIManager.Instance.AddSubFunction("캐릭터 삭제하기", DeleteCharacter);
        UIManager.Instance.AddSubFunction("불러오기 후 캐릭터 삭제하기", DeleteCharacterByOrder);


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

            if (bro.IsSuccess()) {
                string str = $"유저 계정 inDate : {Backend.MultiCharacter.Account.InDate}";
                UIManager.Instance.OpenResultUI("회원가입에 성공하였습니다.\n" + str);
            } else {
                UIManager.Instance.OpenResultUI("에러가 발생하였습니다\n" + bro.ToString());
            }
        });
    }
    
    private void LoginAccount() {
        requestUI.AddInputField("아이디");
        requestUI.AddInputField("비밀번호");
        
        requestUI.SetExecuteButtonAction( () => {
            var id = InputParseByString(0, 0);
            var pw = InputParseByString( 1, 0);

            var bro = Backend.MultiCharacter.Account.LoginAccount(id, pw);

            if (bro.IsSuccess()) {
                string str = $"유저 계정 inDate : {Backend.MultiCharacter.Account.InDate}";

                UIManager.Instance.OpenResultUI("로그인에 성공하였습니다.\n" + str);
            } else {
                UIManager.Instance.OpenResultUI("에러가 발생하였습니다\n" + bro.ToString());
            }
        });
    }
    
    private void AutoLogin() {
        requestUI.SetExecuteButtonAction( () => {
            var bro = Backend.MultiCharacter.Account.AutoLoginAccount();
            ShowResultData(bro);
        });
    }
    
    private void LogoutAccount() {
        
        requestUI.SetExecuteButtonAction( () => {
            var bro = Backend.MultiCharacter.Account.LogoutAccount();
            ShowResultData(bro);
        });
    }

    private void WithdrawAccount() {
        requestUI.AddInputField("탈퇴 유예 시간");
        
        requestUI.SetExecuteButtonAction( () => {
            int expirationHours = InputParseByInt(0, 0);

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

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

            var bro = Backend.MultiCharacter.Account.FindAccountId(email);
            ShowResultData(bro);
        });
    }
    
    private void ResetPassword() {
        requestUI.AddInputField("아이디");
        requestUI.AddInputField("이메일");

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

            var bro = Backend.MultiCharacter.Account.ResetPassword(id,email);
            ShowResultData(bro);
        });
    }
    
    private void ConfirmCustomPassword() {
        requestUI.AddInputField("비밀번호");
        
        requestUI.SetExecuteButtonAction( () => {
            var pw = InputParseByString(0, 0);

            var bro = Backend.MultiCharacter.Account.ConfirmCustomPassword(pw);
            ShowResultData(bro);
        });
    }
    
    private void UpdatePassword() {
        requestUI.AddInputField("현재 비밀번호");
        requestUI.AddInputField("변경할 비밀번호");

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

            var bro = Backend.MultiCharacter.Account.UpdatePassword(pastPw, pw);
            ShowResultData(bro);
        });
    }

    private void GetCharacterList() {
        requestUI.SetExecuteButtonAction( () => {
            var bro = Backend.MultiCharacter.Character.GetCharacterList();
            if (bro.IsSuccess()) {
                characterList.Clear();
                var rows = bro.GetReturnValuetoJSON()["characters"];
                foreach (LitJson.JsonData row in rows) {
                    var characterUuid = row["uuid"].ToString();
                    var characterInDate = row["inDate"].ToString();
                    characterList.Add(new Tuple<string, string>(characterUuid, characterInDate));
                }
            }
            ShowResultData(bro);
        });
    }

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

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

            var bro = Backend.MultiCharacter.Character.GetCharacterList(tableName);
            
            if (bro.IsSuccess()) {
                characterList.Clear();
                var rows = bro.GetReturnValuetoJSON()["characters"];
                foreach (LitJson.JsonData row in rows) {
                    var characterUuid = row["uuid"].ToString();
                    var characterInDate = row["inDate"].ToString();
                    characterList.Add(new Tuple<string, string>(characterUuid, characterInDate));
                }
            }
            
            ShowResultData(bro);
        });
    }

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

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

            var bro = Backend.MultiCharacter.Character.CreateCharacter(nickname);
            ShowResultData(bro);
        });
    }
    
    private void CreateCharacterAndLogin() {
        requestUI.AddInputField("닉네임");

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

            var bro = Backend.MultiCharacter.Character.CreateCharacter(nickname);
            if (bro.IsSuccess()) {
                var characterUuid = bro.GetReturnValuetoJSON()["uuid"].ToString();
                var characterInDate = bro.GetReturnValuetoJSON()["gamerInDate"].ToString();
                
                var bro2 = Backend.MultiCharacter.Character.SelectCharacter(characterUuid, characterInDate);
                ShowResultData(bro2);
                LoginUI.UpdateUserData();

            } else {
                ShowResultData(bro);

            }
            
        });
    }
    
    private void SelectCharacter() {
        requestUI.AddInputField("캐릭터 UUID");
        requestUI.AddInputField("캐릭터 InDate");

        requestUI.SetExecuteButtonAction( () => {
            var characterUuid = InputParseByString(0, 0);
            var characterInDate = InputParseByString(1, 0);

            var bro = Backend.MultiCharacter.Character.SelectCharacter(characterUuid,characterInDate);
            LoginUI.UpdateUserData();

            ShowResultData(bro);
        });
    }
    private void SelectCharacterByOrder() {
        requestUI.AddInputField("리스트 번호(1부터)");

        requestUI.SetExecuteButtonAction( () => {
            var index = InputParseByInt(0, 0) - 1;

            var bro = Backend.MultiCharacter.Character.SelectCharacter(characterList[index].Item1,characterList[index].Item2);
            LoginUI.UpdateUserData();

            ShowResultData(bro);
        });
    }
    
    private void DeleteCharacter() {
        requestUI.AddInputField("캐릭터 UUID");
        requestUI.AddInputField("캐릭터 InDate");

        requestUI.SetExecuteButtonAction( () => {
            var characterUuid = InputParseByString(0, 0);
            var characterInDate = InputParseByString(1, 0);

            var bro = Backend.MultiCharacter.Character.DeleteCharacter(characterUuid,characterInDate);
            ShowResultData(bro);
        });
    }
    private void DeleteCharacterByOrder() {
        requestUI.AddInputField("리스트 번호(1부터)");

        requestUI.SetExecuteButtonAction( () => {
            var index = InputParseByInt(0, 0) - 1;

            var bro = Backend.MultiCharacter.Character.DeleteCharacter(characterList[index].Item1,characterList[index].Item2);
            ShowResultData(bro);
        });
    }
}