using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;
using AlterchaseSDK;

#if MODIO_INSTALLED
using ModIO;
#endif

public class ModBrowserExample : MonoBehaviour
{
    [Header("UI References")]
    [SerializeField] private Transform modListContainer;
    [SerializeField] private GameObject modItemPrefab;
    [SerializeField] private Button refreshButton;
    [SerializeField] private InputField searchField;

    private List<ModIOModProfile> availableMods = new List<ModIOModProfile>();

    private void Start()
    {
#if MODIO_INSTALLED
        if (refreshButton != null)
        {
            refreshButton.onClick.AddListener(RefreshModList);
        }

        if (ModIOIntegration.Instance.IsInitialized)
        {
            RefreshModList();
        }
        else
        {
            ModIOIntegration.Instance.OnInitialized += RefreshModList;
        }
#else
        Debug.LogWarning("ModBrowserExample: mod.io SDK not installed. This example requires mod.io integration.");
        if (refreshButton != null)
        {
            refreshButton.interactable = false;
        }
#endif
    }

    private async void RefreshModList()
    {
#if MODIO_INSTALLED
        Debug.Log("Fetching mods from mod.io...");

        ModIOSearchFilter filter = new ModIOSearchFilter();

        if (!string.IsNullOrEmpty(searchField?.text))
        {
            filter.SetSearchPhrase(searchField.text);
        }

        ModIOModProfile[] mods = await ModIOIntegration.Instance.BrowseMods(filter);

        if (mods != null && mods.Length > 0)
        {
            availableMods = new List<ModIOModProfile>(mods);
            DisplayMods();
            Debug.Log($"Found {mods.Length} mods");
        }
        else
        {
            Debug.LogWarning("No mods found or failed to fetch mods.");
        }
#else
        Debug.LogWarning("mod.io SDK not installed.");
        await System.Threading.Tasks.Task.CompletedTask;
#endif
    }

    private void DisplayMods()
    {
        if (modListContainer == null)
        {
            Debug.LogError("Mod list container not assigned!");
            return;
        }

        ClearModList();

        foreach (var mod in availableMods)
        {
            CreateModListItem(mod);
        }
    }

    private void CreateModListItem(ModIOModProfile mod)
    {
        if (modItemPrefab == null)
        {
            Debug.LogError("Mod item prefab not assigned!");
            return;
        }

        GameObject item = Instantiate(modItemPrefab, modListContainer);

        Text nameText = item.transform.Find("ModName")?.GetComponent<Text>();
        if (nameText != null)
        {
            nameText.text = mod.name;
        }

        Text descriptionText = item.transform.Find("Description")?.GetComponent<Text>();
        if (descriptionText != null)
        {
            descriptionText.text = mod.summary;
        }

        Button subscribeButton = item.transform.Find("SubscribeButton")?.GetComponent<Button>();
        if (subscribeButton != null)
        {
            subscribeButton.onClick.AddListener(() => SubscribeToMod(mod.id));
        }

        LoadModThumbnail(mod, item);
    }

    private async void LoadModThumbnail(ModIOModProfile mod, GameObject item)
    {
#if MODIO_INSTALLED
        Texture2D thumbnail = await ModIOIntegration.Instance.DownloadModLogo(mod.id);

        if (thumbnail != null)
        {
            Image thumbnailImage = item.transform.Find("Thumbnail")?.GetComponent<Image>();
            if (thumbnailImage != null)
            {
                Sprite sprite = Sprite.Create(thumbnail, new Rect(0, 0, thumbnail.width, thumbnail.height), Vector2.zero);
                thumbnailImage.sprite = sprite;
            }
        }
#else
        await System.Threading.Tasks.Task.CompletedTask;
#endif
    }

    private async void SubscribeToMod(long modId)
    {
#if MODIO_INSTALLED
        if (!ModIOIntegration.Instance.IsAuthenticated)
        {
            Debug.LogWarning("User must be authenticated to subscribe to mods.");
            return;
        }

        bool success = await ModIOIntegration.Instance.SubscribeToMod(modId);

        if (success)
        {
            Debug.Log($"Successfully subscribed to mod ID: {modId}");
        }
#else
        Debug.LogWarning("mod.io SDK not installed.");
        await System.Threading.Tasks.Task.CompletedTask;
#endif
    }

    private void ClearModList()
    {
        foreach (Transform child in modListContainer)
        {
            Destroy(child.gameObject);
        }
    }

    [ContextMenu("Show Subscribed Mods")]
    private void ShowSubscribedMods()
    {
#if MODIO_INSTALLED
        if (!ModIOIntegration.Instance.IsAuthenticated)
        {
            Debug.LogWarning("User is not authenticated.");
            return;
        }

        ModIOModProfile[] subscribedMods = ModIOIntegration.Instance.GetSubscribedMods();

        Debug.Log($"You are subscribed to {subscribedMods.Length} mods:");

        foreach (var mod in subscribedMods)
        {
            Debug.Log($"- {mod.name} (ID: {mod.id})");
        }
#else
        Debug.LogWarning("mod.io SDK not installed.");
#endif
    }
}
