using TMPro;
using UnityEngine;
using UnityEngine.UI;

namespace MajacloudSdk.Samples.Starter
{
    public sealed class ConfigPanel : MonoBehaviour
    {
        [SerializeField] private TMP_Text headerLabel;
        [SerializeField] private Button refreshButton;
        [SerializeField] private Transform content;
        [SerializeField] private ConfigRowView rowPrefab;

        private void Awake()
        {
            if (refreshButton != null) refreshButton.onClick.AddListener(Refresh);
        }

        private void OnEnable()
        {
            if (!Majacloud.IsInitialized) return;
            Majacloud.RemoteConfig.ConfigUpdated += OnUpdated;
            Render();
        }

        private void OnDisable()
        {
            if (Majacloud.IsInitialized && Majacloud.RemoteConfig != null) Majacloud.RemoteConfig.ConfigUpdated -= OnUpdated;
        }

        private void OnUpdated(MajacloudRemoteConfig config) => Render();

        public async void Refresh()
        {
            if (!Majacloud.IsInitialized) return;
            var result = await Majacloud.RemoteConfig.FetchAsync(true);
            if (this == null) return;
            if (!result.Ok) StarterController.Toast(result.Error.Message, true);
            else StarterController.Toast(result.Value.Changed ? "Config updated to v" + result.Value.Version : "Config is up to date (v" + result.Value.Version + ")");
            Render();
        }

        private void Render()
        {
            var config = Majacloud.RemoteConfig;
            if (headerLabel != null)
            {
                headerLabel.text = config.IsLoaded
                    ? "v" + config.Version + " · " + config.Source.ToString().ToLowerInvariant() + " · " + (config.IsSignatureVerified ? "signature verified" : "unsigned (localhost)") + " · " + config.Count + " keys"
                    : "Not loaded yet";
            }
            if (content == null || rowPrefab == null) return;
            for (int i = content.childCount - 1; i >= 0; i--) Destroy(content.GetChild(i).gameObject);
            foreach (var value in config.Values)
            {
                var row = Instantiate(rowPrefab, content);
                row.Bind(value);
            }
        }
    }
}
