using System;
using System.Collections.Generic;
using PlayFab;
using PlayFab.ClientModels;
using UnityEngine;

public class PlayFabLeaderboards : MonoBehaviour
{
    public static string DisplayName;
    public void UpdateLevelsCompleted(int levelsCompleted)
    {
        var request = new UpdatePlayerStatisticsRequest
        {
            Statistics = new List<StatisticUpdate>
            {
                new StatisticUpdate
                {
                    StatisticName = GameConstants.LevelCompletedStatsKey,
                    Value = levelsCompleted
                }
            }
        };
        PlayFabClientAPI.UpdatePlayerStatistics(request, OnStatisticsUpdateSuccess, OnStatisticsUpdateFailure);
    }

    public void UpdateLevelCompletionTime(string tier, int levelNumber, int completionTimeInSeconds)
    {
        string statisticName = $"{tier}_Level_{levelNumber}_Time";
        
        var request = new UpdatePlayerStatisticsRequest
        {
            Statistics = new List<StatisticUpdate>
            {
                new StatisticUpdate
                {
                    StatisticName = statisticName,
                    Value = completionTimeInSeconds
                }
            }
        };

        PlayFabClientAPI.UpdatePlayerStatistics(request, OnStatisticsUpdateSuccess, OnStatisticsUpdateFailure);
    }
    
    
    private void OnStatisticsUpdateSuccess(UpdatePlayerStatisticsResult result)
    {
        Debug.Log("Successfully updated player statistics!");
    }

    private void OnStatisticsUpdateFailure(PlayFabError error)
    {
        Debug.LogError("Failed to update player statistics: " + error.GenerateErrorReport());
    }
    
    public void GetLeaderboardByKey(string key,Action<List<PlayerLeaderboardEntry>> onSuccess, Action<PlayFabError> onFailure)
    {
        var request = new GetLeaderboardRequest
        {
            StatisticName = key,
            StartPosition = 0,  
            MaxResultsCount = 1
        };
    
        PlayFabClientAPI.GetLeaderboard(request, result => onSuccess(result.Leaderboard), onFailure);
    }
    
    public void GetLeaderboard(Action<List<PlayerLeaderboardEntry>> onSuccess, Action<PlayFabError> onFailure)
    {
        var request = new GetLeaderboardRequest
        {
            StatisticName = GameConstants.LevelCompletedStatsKey,
            StartPosition = 0,  
            MaxResultsCount = 10
        };
    
        PlayFabClientAPI.GetLeaderboard(request, result => onSuccess(result.Leaderboard), onFailure);
    }
    public void SetDisplayName(string displayName)
    {
        var request = new UpdateUserTitleDisplayNameRequest
        {
            DisplayName = displayName
        };

        PlayFabClientAPI.UpdateUserTitleDisplayName(request, OnDisplayNameUpdateSuccess, OnDisplayNameUpdateFailure);
        DisplayName = displayName;
    }

    private void OnDisplayNameUpdateSuccess(UpdateUserTitleDisplayNameResult result)
    {
        Debug.Log("Display name set successfully: " + result.DisplayName);
    }

    private void OnDisplayNameUpdateFailure(PlayFabError error)
    {
        Debug.LogError("Failed to set display name: " + error.GenerateErrorReport());
    }
    
}