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

public class LeaderboardUIScreen : MonoBehaviour
{
    [SerializeField] private GameObject lbItemPrefab;
    [SerializeField] private GameObject lbItemSelfPrefab;
    [SerializeField] private Transform content;
    [SerializeField] private List<LBPedestalItem> _lbPedestalItems;

    public void Init()
    {
        Debug.Log("Leaderboard Initialized");
        PlayFabManager.Instance.playFabLeaderboards.GetLeaderboard(OnLeaderboardFetchSuccess, OnLeaderboardFetchFailure);
    }

    public void OnClose()
    {
        // Cleanup leaderboard UI elements
    }

    private void OnLeaderboardFetchSuccess(List<PlayerLeaderboardEntry> leaderboard)
    {
        foreach (Transform child in content.transform)
        {
            Destroy(child.gameObject);
        }
        PopulateLeaderboard(leaderboard);
        Debug.Log("Leaderboard fetch success");
    }

    private void PopulateLeaderboard(List<PlayerLeaderboardEntry> leaderboard)
    {
        foreach (PlayerLeaderboardEntry lbEntry in leaderboard)
        {
            PopulateLbItem(lbEntry);
            if (lbEntry.Position <= 2)
            {
                PopulatePedestalItem(lbEntry);
            }
        }

        content.GetComponent<RectTransform>().DOAnchorPosX(0f, 1f).SetEase(Ease.OutElastic);
    }

    private void PopulateLbItem(PlayerLeaderboardEntry lbEntry)
    {
        bool isSelf = lbEntry.Profile != null &&
                      PlayFabManager.Instance.playFabUserDataManager?.myProfile != null &&
                      lbEntry.Profile.PlayerId == PlayFabManager.Instance.playFabUserDataManager.myProfile.PlayerId;

        LBEntryItem lbItem = Instantiate(isSelf ? lbItemSelfPrefab : lbItemPrefab, content).GetComponent<LBEntryItem>();
        lbItem.nameText.text = lbEntry.DisplayName ?? lbEntry.PlayFabId;
        lbItem.rankText.text = (lbEntry.Position + 1).ToString();
        lbItem.scoreText.text = lbEntry.StatValue.ToString();

        PlayFabManager.Instance.playFabUserDataManager.GetPlayerAvatarImage(lbEntry.PlayFabId, (sprite) =>
        {
            lbItem.profilePic.sprite = sprite;
        },
        (s) =>
        {
            Debug.Log("Couldn�t get pic");
        });
    }

    private void PopulatePedestalItem(PlayerLeaderboardEntry lbEntry)
    {
        LBPedestalItem pedestalItem = _lbPedestalItems[lbEntry.Position];
        pedestalItem.nameText.text = lbEntry.DisplayName ?? lbEntry.PlayFabId;
        pedestalItem.scoreText.text = lbEntry.StatValue.ToString();

        PlayFabManager.Instance.playFabUserDataManager.GetPlayerAvatarImage(lbEntry.PlayFabId, (sprite) =>
        {
            pedestalItem.profilePic.sprite = sprite;
        },
        (s) =>
        {
            Debug.Log("Couldn�t get pic");
        });
    }

    private void OnLeaderboardFetchFailure(PlayFabError obj)
    {
        Debug.LogError("Couldn't Load Leaderboards: " + obj.GenerateErrorReport());
    }
}