using System;
using System.Collections;
using System.Collections.Generic;
using System.Text;
using UnityEngine;
using UnityEngine.UI;
using UnityEngine.SceneManagement;
using TMPro;
using Newtonsoft.Json;
using CommanderAILab.Models;
using CommanderAILab.Services;
namespace CommanderAILab.UI
{
///
/// Simulator scene — configure and run multi-player simulations,
/// poll status, display results per deck.
/// Also provides a Play Live button that routes to the Battleground scene.
///
public class SimulationController : MonoBehaviour
{
// ── Navigation ───────────────────────────────────────────────────────
[Header("Navigation")]
[SerializeField] private Button backButton;
[SerializeField] private Button startSimButton;
/// Routes to the Battleground scene for a live 4-player game.
[SerializeField] private Button playLiveButton;
// ── Config Panel ──────────────────────────────────────────────────────
[Header("Config")]
[SerializeField] private TMP_Dropdown deckDropdown0;
[SerializeField] private TMP_Dropdown deckDropdown1;
[SerializeField] private TMP_Dropdown deckDropdown2;
[SerializeField] private TMP_Dropdown deckDropdown3;
[SerializeField] private TMP_InputField numGamesInput;
[SerializeField] private Slider numPlayersSlider;
[SerializeField] private TMP_Text numPlayersLabel;
[SerializeField] private TMP_InputField threadsInput;
[SerializeField] private TMP_Dropdown aiProfileDropdown;
// ── Status Panel ──────────────────────────────────────────────────────
[Header("Status")]
[SerializeField] private TMP_Text statusText;
[SerializeField] private Slider progressBar;
[SerializeField] private TMP_Text progressText;
[SerializeField] private TMP_Text elapsedText;
[SerializeField] private TMP_Text simsPerSecText;
// ── Results Panel ─────────────────────────────────────────────────────
[Header("Results")]
[SerializeField] private Transform resultsParent;
[SerializeField] private GameObject resultRowPrefab;
[SerializeField] private TMP_Text winnerText;
[SerializeField] private Button historyButton;
// ── Error ─────────────────────────────────────────────────────────────
[Header("Error")]
[SerializeField] private GameObject errorPanel;
[SerializeField] private TMP_Text errorText;
[SerializeField] private Button retryButton;
// ── State ─────────────────────────────────────────────────────────────
private ApiClient _api;
private List _decks = new();
private List _profiles = new();
private string _currentBatchId;
private bool _isPolling;
private readonly List _resultRowObjects = new();
// ── Lifecycle ─────────────────────────────────────────────────────────
private void Start()
{
_api = FindObjectOfType();
backButton.onClick.AddListener(() => SceneManager.LoadScene("MainMenu"));
startSimButton.onClick.AddListener(OnStartSim);
retryButton.onClick.AddListener(OnStartSim);
// Play Live: save current deck selections and load Battleground scene
playLiveButton?.onClick.AddListener(OnPlayLive);
numPlayersSlider.minValue = 2;
numPlayersSlider.maxValue = 4;
numPlayersSlider.wholeNumbers = true;
numPlayersSlider.value = 2;
numPlayersSlider.onValueChanged.AddListener(OnNumPlayersChanged);
OnNumPlayersChanged(numPlayersSlider.value);
errorPanel.SetActive(false);
string simDeck = PlayerPrefs.GetString("SimDeck", "");
if (!string.IsNullOrEmpty(simDeck))
{
PlayerPrefs.DeleteKey("SimDeck");
PlayerPrefs.SetString("_SimDeckPending", simDeck);
}
LoadDecks();
LoadAiProfiles();
}
// ── Play Live ─────────────────────────────────────────────────────────
private void OnPlayLive()
{
// Persist current deck selections so LobbySetupModal can pre-populate
var seats = new List