using System;
using System.Collections.Generic;
using System.Linq;
using Adventurer.Runtime;
using Core.Runtime;
using EventSystem.Runtime;
using Player.Runtime;
using Quest.Runtime;
using Quests.Runtime;
using UnityEngine;
using UnityEngine.UI;
namespace TestFacts.Runtime
{
///
/// Automation orientée "vidéo promo" qui ouvre et utilise les différents panels UI
/// pour illustrer un flow complet:
/// 1) Ouvrir le panel de recrutement et acheter un aventurier
/// 2) Ouvrir le panneau du tableau des quêtes et accepter une quête
/// 3) Ouvrir le panneau des quêtes acceptées, afficher la fiche (InfoQuestPanel)
/// 4) Sélectionner un aventurier via l'UI et lancer la quête
/// 5) (Option promo) Compléter immédiatement la quête pour montrer l'écran terminé
///
/// Placez ce composant sur un GameObject de la scène Marketing/Game avec les références UI assignées.
///
public class PromoUIFlow : BaseMonoBehaviour
{
[Header("Références UI")]
[SerializeField] UIManager _uiManager;
[Tooltip("Panel boutique de recrutement (contenant RecruitementPanel)")]
[SerializeField] GameObject _recruitementPanel;
[Tooltip("Panel du tableau des quêtes disponibles (contenant QuestsBoardPanel)")]
[SerializeField] GameObject _questsBoardPanel;
[Tooltip("Panel des quêtes (liste des quêtes acceptées)")]
[SerializeField] GameObject _questsPanel;
[Tooltip("Panel Info d'une quête (contenant InfoQuestPanel)")]
[SerializeField] GameObject _infoQuestPanel;
[Header("Données (optionnelles)")]
[SerializeField] AdventurerFactorySO _adventurerFactory;
[SerializeField] QuestFactoryDatabase _questDatabase;
[Header("Délais (s)")]
[SerializeField] float _delayOpenRecruit = 0.6f;
[SerializeField] float _delayBuy = 0.8f;
[SerializeField] float _delayOpenBoard = 1.0f;
[SerializeField] float _delayAcceptQuest = 0.8f;
[SerializeField] float _delayOpenAcceptedPanel = 0.8f;
[SerializeField] float _delayOpenInfo = 0.6f;
[SerializeField] float _delaySelectAdventurer = 0.6f;
[SerializeField] float _delayLaunch = 0.6f;
[SerializeField] float _delayComplete = 0.8f;
[Header("Options")]
[SerializeField] int _fallbackGuildLevel = 1;
[SerializeField] bool _autoCompleteForPromo = true;
void Start()
{
EnsureBaselineFacts();
Invoke(nameof(Step_OpenRecruitPanel), _delayOpenRecruit);
}
// 1) Ouvrir panel recrutement
void Step_OpenRecruitPanel()
{
try
{
if (_uiManager != null && _recruitementPanel != null)
{
_uiManager.HideAllPanels();
_uiManager.ShowPanel(_recruitementPanel);
}
Info("🎬 Ouverture panel Recrutement", Color.cyan);
}
catch (Exception ex)
{
Debug.LogError($"[PromoUIFlow] OpenRecruit error: {ex}");
}
Invoke(nameof(Step_BuyFirstAdventurer), _delayBuy);
}
// 1b) Acheter le 1er aventurier via la carte UI
void Step_BuyFirstAdventurer()
{
try
{
if (_recruitementPanel != null)
{
var card = _recruitementPanel.GetComponentsInChildren(true)
.FirstOrDefault(c => c.m_buyButton != null);
if (card == null)
{
// Forcer une génération si rien n'est présent (le panel devrait déjà le faire à OnEnable)
var rp = _recruitementPanel.GetComponentInChildren(true);
if (rp != null && _adventurerFactory != null)
{
rp.m_adventurersSO = _adventurerFactory;
rp.GenerateAdventurer(4);
}
card = _recruitementPanel.GetComponentsInChildren(true)
.FirstOrDefault(c => c.m_buyButton != null);
}
if (card != null && card.m_buyButton != null)
{
card.m_buyButton.onClick?.Invoke();
Info($"🧙 Aventurier acheté: {card.Adventurer?.Name}", Color.green);
}
}
}
catch (Exception ex)
{
Debug.LogError($"[PromoUIFlow] Buy error: {ex}");
}
Invoke(nameof(Step_OpenQuestsBoard), _delayOpenBoard);
}
// 2) Ouvrir le tableau des quêtes et accepter la 1ère
void Step_OpenQuestsBoard()
{
try
{
if (_uiManager != null && _questsBoardPanel != null)
{
_uiManager.HideAllPanels();
_uiManager.ShowPanel(_questsBoardPanel);
}
Info("📋 Ouverture tableau des quêtes", Color.cyan);
}
catch (Exception ex)
{
Debug.LogError($"[PromoUIFlow] OpenBoard error: {ex}");
}
Invoke(nameof(Step_AcceptFirstQuestOnBoard), _delayAcceptQuest);
}
void Step_AcceptFirstQuestOnBoard()
{
try
{
QuestManager.Instance.NotifyAvailableQuestsUpdated(EnsurePlayerFact().GuildLevel);
var card = _questsBoardPanel != null
? _questsBoardPanel.GetComponentsInChildren(true).FirstOrDefault()
: null;
if (card == null)
{
// Fallback: générer une quête à partir de la DB si possible
var templ = _questDatabase?.GetAll()?.FirstOrDefault()?.questTemplates?.FirstOrDefault();
if (templ != null)
{
var generated = templ.ToQuestClass(QuestStateEnum.Disponible);
var go = new GameObject("GeneratedQuestCardForPromo");
var qc = go.AddComponent();
qc.Setup(generated);
card = qc;
}
}
if (card != null)
{
card.AcceptQuest();
Info($"✅ Quête acceptée: {card.Quest?.Name}", Color.green);
}
}
catch (Exception ex)
{
Debug.LogError($"[PromoUIFlow] Accept quest error: {ex}");
}
Invoke(nameof(Step_OpenAcceptedQuestsPanel), _delayOpenAcceptedPanel);
}
// 3) Ouvrir la liste des quêtes acceptées
void Step_OpenAcceptedQuestsPanel()
{
try
{
if (_uiManager != null && _questsPanel != null)
{
_uiManager.HideAllPanels();
_uiManager.ShowPanel(_questsPanel);
}
QuestSignals.RaiseRefreshQuests();
Info("📜 Ouverture panel Quêtes (acceptées)", Color.cyan);
}
catch (Exception ex)
{
Debug.LogError($"[PromoUIFlow] OpenAccepted error: {ex}");
}
Invoke(nameof(Step_OpenInfoForFirstQuest), _delayOpenInfo);
}
// 3b) Ouvrir la fiche info d'une quête via la carte d'interaction
void Step_OpenInfoForFirstQuest()
{
try
{
var inter = _questsPanel != null
? _questsPanel.GetComponentsInChildren(true).FirstOrDefault()
: null;
if (inter != null)
{
inter.OnClick(); // ouvre InfoQuestPanel via le signal
}
else
{
// Fallback: prendre la première quête acceptée et forcer l'ouverture
var accepted = GetFact>("accepted_quests");
var quest = accepted?.FirstOrDefault();
if (quest != null)
{
QuestSignals.RaiseInfoQuestPanel(quest);
}
}
Info("ℹ️ Ouverture InfoQuestPanel", Color.cyan);
}
catch (Exception ex)
{
Debug.LogError($"[PromoUIFlow] OpenInfo error: {ex}");
}
Invoke(nameof(Step_SelectAdventurerInInfoPanel), _delaySelectAdventurer);
}
// 4) Sélectionner un aventurier sur l'UI et lancer la quête
void Step_SelectAdventurerInInfoPanel()
{
try
{
if (_infoQuestPanel != null)
{
// Tenter de cliquer sur une carte sélectionnable d'aventurier
var selectable = _infoQuestPanel.GetComponentsInChildren(true)
.FirstOrDefault();
if (selectable == null)
{
// Parfois les cartes sont ailleurs (liste globale), on tente dans toute la scène
selectable = GameObject.FindObjectsOfType(true).FirstOrDefault();
}
if (selectable != null)
{
selectable.OnClick(); // Envoie AdventurerSignals.OnAdventurerSelected
}
}
}
catch (Exception ex)
{
Debug.LogError($"[PromoUIFlow] Select adventurer error: {ex}");
}
Invoke(nameof(Step_LaunchQuestFromInfoPanel), _delayLaunch);
}
void Step_LaunchQuestFromInfoPanel()
{
try
{
if (_infoQuestPanel != null)
{
var info = _infoQuestPanel.GetComponent();
if (info != null)
{
info.LaunchQuest();
Info("🚀 Quête lancée", Color.yellow);
}
}
}
catch (Exception ex)
{
Debug.LogError($"[PromoUIFlow] Launch quest error: {ex}");
}
if (_autoCompleteForPromo)
Invoke(nameof(Step_CompleteQuestNow), _delayComplete);
}
// 5) Option promo: compléter immédiatement la quête pour montrer l'état terminé
void Step_CompleteQuestNow()
{
try
{
var quest = QuestManager.Instance.CurrentQuest;
if (quest == null)
{
Warning("Aucune quête courante à compléter.");
return;
}
// Utiliser l'équipe d'un seul aventurier (le premier dispo)
var team = EnsureMyAdventurersFact();
if (team.Count == 0) return;
var ids = QuestClass.GetIdFromAdventurers(new List { team[0] });
if (quest.State != QuestStateEnum.InProgress)
{
// S'assure que l'état est correct pour compléter
var gameTime = GetFact("game_time");
QuestManager.Instance.StartQuest(quest, new List { team[0] }, gameTime);
}
QuestManager.Instance.CompleteQuest(quest, ids);
QuestManager.Instance.NotifyCompletedQuests();
QuestSignals.RaiseRefreshQuests();
Info($"🏁 Quête complétée (promo): {quest.Name}", Color.green);
}
catch (Exception ex)
{
Debug.LogError($"[PromoUIFlow] Complete quest error: {ex}");
}
}
// --- Utils -----------------------------------------------------------
void EnsureBaselineFacts()
{
var player = EnsurePlayerFact();
player.Money = Mathf.Max(player.Money, 9999);
player.AdventurersMax = Mathf.Max(player.AdventurersMax, 10);
SaveFacts();
}
PlayerClass EnsurePlayerFact()
{
if (!FactExists(GameManager.Instance.Profile, out var player) || player == null)
{
player = new PlayerClass("Promo Guild", _fallbackGuildLevel, 9999, 10);
SetFact(GameManager.Instance.Profile, player, FactPersistence.Persistent);
}
return player;
}
List EnsureMyAdventurersFact()
{
if (!FactExists>("my_adventurers", out var list) || list == null)
{
list = new List();
SetFact("my_adventurers", list, FactPersistence.Persistent);
}
return list;
}
}
}