using UnityEngine;
using PlayFab;
using PlayFab.ClientModels;
using System.Text;
using UnityEngine.SceneManagement;

public class Login : MonoBehaviour
{
    //サインインする必要あるかの判定結果
    private bool newAccount;
    //ID
    private string customID;
    //ID作成時のKey
    private static readonly string ID_CHARACTERS = "0123456789abcdefghijklmnopqrstuvwxyz";


    //ログイン処理
    public void LoginPlayFab()
    {
        //IDを作ったか確認
        customID = LoadCustomID();
        
        //ログイン処理
        var request = new LoginWithCustomIDRequest
        {
            CustomId = customID,
            CreateAccount = newAccount
        };
        PlayFabClientAPI.LoginWithCustomID(request, OnLoginSuccess, OnLoginFailure);
    }

    //カスタムIDの取得
    private string LoadCustomID()
    {
        //ローカルの保存データ取得
        string id = PlayerPrefs.GetString("customID");

        //nullだとTrue
        newAccount = string.IsNullOrEmpty(id);

        //trueの場合はIDを作る
        if(newAccount == true)
        {
            return GenerateCustomID();
        }

        //読み出したデータを使う
        return id;
    }

    //16桁のID作成
    private string GenerateCustomID()
    {
        //IDの長さ
        int idLength = 16;

        //文字を追加したいから、StringBuilder
        StringBuilder stringBuilder = new StringBuilder(idLength);

        //追加処理
        var random = new System.Random();
        for (int i = 0; i < idLength; i++)
        {
            stringBuilder.Append(ID_CHARACTERS[random.Next(ID_CHARACTERS.Length)]);
        }

        //IDを返す
        return stringBuilder.ToString();
    }

    //ログイン成功時のコールバック関数
    private void OnLoginSuccess(LoginResult result)
    {
        //ID重複判定
        if (newAccount && !result.NewlyCreated)
        {
            //もう一度ログイン処理
            LoginPlayFab();
            return;
        }

        //新規アカウント作成時
        if (result.NewlyCreated)
        {
            //IDを保存してサイレントサインインする
            PlayerPrefs.SetString("customID", customID);
            GetComponent<SignIn>().SilentSignInPlayfab();
        }

        //既存アカウントでのログイン時
        if(!newAccount)
        {
            SceneManager.LoadScene("Game");
        }
    }

    //ログイン失敗時のコールバック関数
    private void OnLoginFailure(PlayFabError error)
    {
        //ログイン失敗時にやりたいことあれば記載
        error.GenerateErrorReport();
    }
}