using Jovian.PopupSystem;
using Jovian.PopupSystem.UI;
using UnityEngine;

/// <summary>
/// Example: Showing popups from code without PopupTrigger components.
///
/// Use this approach for confirmation dialogs, tutorial tips, or any popup
/// that is triggered by game logic rather than hover events.
/// Also demonstrates PopupElementType variants and the generic Add() method.
/// </summary>
public class CodeOnlyPopupExample : MonoBehaviour {
    [SerializeField] PopupSettings popupSettings;
    [SerializeField] PopupReference popupReferencePrefab;
    [SerializeField] Transform canvasRoot;
    [SerializeField] RectTransform targetElement;

    // Custom element type defined in game code
    static readonly PopupElementType BadgeElement = new("badge");

    IPopupSystem popupSystem;

    void Start() {
        popupSystem = new PopupSystem(popupSettings, popupReferencePrefab, canvasRoot);
        popupSystem.RegisterCategory(PopupCategory.General, priority: 1);
    }

    void Update() {
        popupSystem?.Tick(Time.deltaTime);

        // Show anchored to an element
        if(Input.GetKeyDown(KeyCode.Alpha1)) {
            popupSystem.Show(PopupCategory.General, builder => {
                builder
                    .AddText("Anchored Popup", PopupElementType.Header)
                    .AddText("This popup is anchored to a UI element.", PopupElementType.Text);
            }, targetElement, AnchorSide.Right);
        }

        // Show at a fixed screen position
        if(Input.GetKeyDown(KeyCode.Alpha2)) {
            popupSystem.ShowAtPosition(PopupCategory.General, builder => {
                builder
                    .AddText("Fixed Position", PopupElementType.Header)
                    .AddText("This popup appears at the center of the screen.", PopupElementType.Text);
            }, new Vector2(Screen.width * 0.5f, Screen.height * 0.5f));
        }

        // Show following the mouse
        if(Input.GetKeyDown(KeyCode.Alpha3)) {
            popupSystem.Show(PopupCategory.General, builder => {
                builder
                    .AddText("Follow Mouse", PopupElementType.Header)
                    .AddText("This popup follows the cursor.", PopupElementType.Text);
            });
        }

        // Demonstrate variant elements
        // Requires "header_gold" and "separator_thick" entries in PopupSettings.elementPrefabs
        if(Input.GetKeyDown(KeyCode.Alpha4)) {
            popupSystem.Show(PopupCategory.General, builder => {
                builder
                    .AddText("Legendary Item", PopupElementType.Header.Variant("gold"))
                    .AddSeparator(PopupElementType.Separator.Variant("thick"))
                    .AddNameValue("Damage", "150", PopupElementType.LabelValueText)
                    .AddText("A weapon forged in dragon fire.", "FF6600", PopupElementType.Text);
            }, targetElement, AnchorSide.Below);
        }

        // Demonstrate generic Add() for fully custom elements
        // Requires a "badge" entry in PopupSettings.elementPrefabs
        if(Input.GetKeyDown(KeyCode.Alpha5)) {
            popupSystem.Show(PopupCategory.General, builder => {
                builder.AddText("Custom Element", PopupElementType.Header);
                var badge = builder.Add(BadgeElement);
                if(badge != null) {
                    // Access any components on the custom prefab
                    // badge.GetComponent<MyBadgeComponent>().SetData(...);
                }
            }, targetElement);
        }

        if(Input.GetKeyDown(KeyCode.Escape)) {
            popupSystem.HideAll();
        }
    }

    void OnDestroy() {
        popupSystem?.Dispose();
    }
}
