using System.Globalization;
using TMPro;
using UnityEngine;

namespace MajacloudSdk.Samples.Starter
{
    /// <summary>Drop-in badge showing the signed-in player and their coins. Works in any scene.</summary>
    public sealed class PlayerBadge : MonoBehaviour
    {
        [SerializeField] private TMP_Text nameLabel;
        [SerializeField] private TMP_Text authLabel;
        [SerializeField] private TMP_Text coinsLabel;
        [SerializeField] private TMP_Text initialLabel;

        private void OnEnable()
        {
            if (!Majacloud.IsInitialized) return;
            Majacloud.Auth.PlayerChanged += Apply;
            Majacloud.Auth.SignedOut += OnSignedOut;
            Apply(Majacloud.Auth.CurrentPlayer);
        }

        private void OnDisable()
        {
            if (!Majacloud.IsInitialized || Majacloud.Auth == null) return;
            Majacloud.Auth.PlayerChanged -= Apply;
            Majacloud.Auth.SignedOut -= OnSignedOut;
        }

        private void Apply(MajacloudPlayer player)
        {
            if (player == null)
            {
                OnSignedOut();
                return;
            }
            if (nameLabel != null) nameLabel.text = player.DisplayName;
            if (authLabel != null) authLabel.text = player.IsGuest ? "guest" : "linked · " + player.RawAuthType;
            if (initialLabel != null) initialLabel.text = string.IsNullOrEmpty(player.DisplayName) ? "?" : player.DisplayName.Substring(0, 1).ToUpperInvariant();
            RefreshCoins();
        }

        private void OnSignedOut()
        {
            if (nameLabel != null) nameLabel.text = "Not signed in";
            if (authLabel != null) authLabel.text = "—";
            if (initialLabel != null) initialLabel.text = "?";
            SetCoins(0);
        }

        public async void RefreshCoins()
        {
            if (!Majacloud.IsInitialized || !Majacloud.Auth.IsSignedIn) return;
            var wallet = await Majacloud.Rewards.GetWalletAsync();
            if (this == null) return;
            if (wallet.Ok) SetCoins(wallet.Value.Coins);
        }

        public void SetCoins(double coins)
        {
            if (coinsLabel != null) coinsLabel.text = coins.ToString("0.##", CultureInfo.InvariantCulture) + " coins";
        }
    }
}
