using System;
using System.Collections.Generic;
using TMPro;
using UnityEngine;
using UnityEngine.InputSystem;
using UnityEngine.UI;
///
/// VR ȯ°æ¿¡¼ ·Îº¿ ÇÁ·Î±×·¥ÀÇ »ó¼¼ Á¤º¸(½ºÅÜ ¸®½ºÆ®, ¼Óµµ µî)¸¦ Ç¥½ÃÇϰí Á¦¾îÇÏ´Â ºä(View) Ŭ·¡½º
/// ÇÁ·Î±×·¥ ½ÇÇà/Á¤Áö, ¸®¼Â, ¼Óµµ Á¶Àý µîÀÇ »ç¿ëÀÚ ÀÔ·ÂÀ» ¹Þ¾Æ ProgramPresenter·Î Àü´Þ
///
public class ProgramInfoView : MonoBehaviour
{
// --- ÇÁ·Î±×·¥ Á¤º¸ ÆÐ³Î ---
///
/// Á¤º¸ ÆÐ³ÎÀÌ È°¼ºÈµÉ ¶§ ºÎÂøµÉ VR ÄÁÆ®·Ñ·¯(¿Þ¼Õ)ÀÇ Transform
///
[SerializeField] private Transform leftControllerTransform;
[SerializeField] private GameObject infoPanel; // ½ÇÁ¦ ÄÑ°í ²ø Á¤º¸ ÆÐ³ÎÀÇ ÃÖ»óÀ§ °ÔÀÓ ¿ÀºêÁ§Æ®
public InputActionReference showInfoPanel; // ÆÐ³ÎÀ» Åä±Û(Äѱâ/²ô±â)ÇÏ´Â ÀÔ·Â ¾×¼Ç
public InputActionReference hideInfoPanel; // ÆÐ³ÎÀ» °Á¦·Î ¼û±â´Â ÀÔ·Â ¾×¼Ç
public InputActionReference[] playProgram; // ÇÁ·Î±×·¥À» Àç»ý/Á¤ÁöÇÏ´Â ÀÔ·Â ¾×¼Ç (¿¹: A ¶Ç´Â B¹öư)
// Åä±Û »óÅ °ü¸®¸¦ À§ÇÑ Ç÷¡±× º¯¼öµé
private bool isPressingX = false;
private bool isPressingAorB = false;
[SerializeField] public TextMeshProUGUI jobName; // ÀÛ¾÷ À̸§
[SerializeField] public TextMeshProUGUI jobSpeed; // Àç»ý ¼Óµµ
[SerializeField] private GameObject orderPrefab; // stepÀÇ UI ÇÁ¸®ÆÕ
[SerializeField] private GameObject endPrefab; // endÀÇ UI ÇÁ¸®ÆÕ
[SerializeField] private Transform contentParent; // ½ºÅÜ UI ¾ÆÀÌÅÛµéÀÌ »ý¼ºµÉ ºÎ¸ð Transform (Scroll ViewÀÇ Content)
// ¼Óµµ °ü·Ã ¹öư
[SerializeField] private Button resetBtn;
[SerializeField] private Button startBtn;
[SerializeField] private Button stopBtn;
[SerializeField] private Button minusBtn;
[SerializeField] private Button plusBtn;
// »ý¼ºµÈ ½ºÅÜ UI ¾ÆÀÌÅÛµéÀ» °ü¸®Çϱâ À§ÇÑ ¸®½ºÆ®
private List instantiatedStepItems = new List();
// --- À̺¥Æ® Á¤ÀÇ (ProgramPresenter·Î ½ÅÈ£ Àü´Þ) ---
public event Action OnResetClicked;
public event Action OnStartClicked;
public event Action OnStopClicked;
public event Action OnMinusClicked;
public event Action OnPlusClicked;
void Start()
{
infoPanel.SetActive(false);
// ÀÔ·Â ¾×¼Ç À̺¥Æ® ¿¬°á (ÆÐ³Î Ç¥½Ã/¼û±è)
if (showInfoPanel != null)
{
showInfoPanel.action.Enable();
showInfoPanel.action.performed += ShowProgramInfoPanel;
}
if (hideInfoPanel != null)
{
hideInfoPanel.action.Enable();
hideInfoPanel.action.performed += HideProgramInfoPanel;
}
// ÀÔ·Â ¾×¼Ç À̺¥Æ® ¿¬°á (A/B ¹öư)
if (playProgram != null)
{
for (int i = 0; i < playProgram.Length; i++)
{
playProgram[i].action.Enable();
playProgram[i].action.performed += PlayProgram;
}
}
resetBtn.onClick.AddListener(() => OnResetClicked?.Invoke());
startBtn.onClick.AddListener(() => OnStartClicked?.Invoke());
stopBtn.onClick.AddListener(() => OnStopClicked?.Invoke());
minusBtn.onClick.AddListener(() => OnMinusClicked?.Invoke(-1));
plusBtn.onClick.AddListener(() => OnPlusClicked?.Invoke(1));
}
private void OnDestroy()
{
if (showInfoPanel != null)
{
showInfoPanel.action.performed -= ShowProgramInfoPanel;
}
if (hideInfoPanel != null)
{
hideInfoPanel.action.performed -= HideProgramInfoPanel;
}
if (playProgram != null)
{
for (int i = 0; i < playProgram.Length; i++)
{
playProgram[i].action.performed -= PlayProgram;
}
}
}
///
/// Presenter·ÎºÎÅÍ µ¥ÀÌÅ͸¦ ¹Þ¾Æ UI ¸®½ºÆ®¸¦ °»½Å
/// ±âÁ¸ ¸ñ·ÏÀ» ¸ðµÎ Áö¿ì°í, »õ·Î¿î ½ºÅÜ µ¥ÀÌÅÍ·Î ´Ù½Ã ä¿ò
///
/// ·Îº¿ ÇÁ·Î±×·¥ Á¤º¸ (¾øÀ¸¸é ¸®ÅÏ)
/// ÆÄ½ÌµÈ °³º° ½ºÅÜ ¸®½ºÆ®
public void UpdateProgramInfo(RobotProgram program, List steps)
{
if (program == null) return;
// ±âÁ¸ ¸®½ºÆ® ÃʱâÈ (UI ¿ÀºêÁ§Æ® »èÁ¦)
foreach (Transform child in contentParent)
{
Destroy(child.gameObject);
}
instantiatedStepItems.Clear();
// »õ ½ºÅÜ ¸ñ·Ï »ý¼º
if (steps == null) return;
foreach (RobotMoveStep step in steps)
{
GameObject newPrefab = Instantiate(orderPrefab, contentParent);
StepInfoItem stepItemUI = newPrefab.GetComponent();
if (stepItemUI != null)
{
stepItemUI.SetData(step);
instantiatedStepItems.Add(stepItemUI);
}
else
{
Debug.LogError("orderPrefab¿¡ StepInfoItem.cs ½ºÅ©¸³Æ®°¡ ¾ø½À´Ï´Ù");
}
if (jobSpeed.text == "0%")
jobSpeed.text = $"{step.Speed}%";
}
// ¸¶Áö¸·¿¡ END Ãß°¡
Instantiate(endPrefab, contentParent);
}
///
/// ÄÁÆ®·Ñ·¯ ÀÔ·Â(X¹öư)À¸·Î Á¤º¸ ÆÐ³ÎÀ» ÄѰųª ²û (Åä±Û ¹æ½Ä)
///
private void ShowProgramInfoPanel(InputAction.CallbackContext obj)
{
isPressingX = !isPressingX;
if (isPressingX)
{
infoPanel.transform.SetParent(leftControllerTransform);
infoPanel.transform.localPosition = new Vector3(0f, 0.2f, 0f);
infoPanel.transform.localRotation = Quaternion.Euler(0, 180, 0);
infoPanel.SetActive(true);
}
else
{
infoPanel.SetActive(false);
}
}
///
/// ÄÁÆ®·Ñ·¯ ÀÔ·ÂÀ¸·Î Á¤º¸ ÆÐ³ÎÀ» ¼û±è
///
private void HideProgramInfoPanel(InputAction.CallbackContext obj)
{
infoPanel.SetActive(false);
}
///
/// ÄÁÆ®·Ñ·¯ ÀÔ·Â(A/B¹öư)À¸·Î ÇÁ·Î±×·¥À» Àç»ýÇϰųª Á¤Áö (Åä±Û ¹æ½Ä)
///
private void PlayProgram(InputAction.CallbackContext obj)
{
isPressingAorB = !isPressingAorB;
if (isPressingAorB)
{
OnStartClicked?.Invoke();
}
else
{
OnStopClicked?.Invoke();
}
}
}