using System;
using System.Collections.Generic;
using TMPro;
using UnityEngine;
using UnityEngine.UI;
///
/// ·Îº¿ ÇÁ·Î±×·¥(Job ÆÄÀÏ)ÀÇ »ý¼º, ¸ñ·Ï Á¶È¸, ¼±ÅÃ, ºÒ·¯¿À±â ±â´ÉÀ» ´ã´çÇÏ´Â UI ºä(View) Ŭ·¡½º
/// °¡»ó ŰÆÐµå¸¦ ÅëÇÑ ÆÄÀϸí ÀÔ·Â, ½ºÅ©·Ñ ºä¿¡ ÆÄÀÏ ¸ñ·Ï Ç¥½Ã µîÀÇ UI ·ÎÁ÷À» ó¸®Çϸç,
/// »ç¿ëÀÚÀÇ Áß¿ä ÀÔ·Â(»ý¼º, ·Îµå µî)À» À̺¥Æ®·Î Presenter¿¡°Ô Àü´Þ
///
///
public class ProgramView : MonoBehaviour
{
// --- ÇÁ·Î±×·¥ ¸ñ·Ï ÆÐ³Î ---
[Header("Panels")]
[SerializeField] private GameObject programSelectPanel; // ÇÁ·Î±×·¥ °ü¸® Àüü ÃÖ»óÀ§ ÆÐ³Î
[SerializeField] private GameObject programNewPanel; // '»õ ÇÁ·Î±×·¥ ¸¸µé±â' ÀԷ ȸé
[SerializeField] private GameObject programListPanel; // 'ºÒ·¯¿À±â' ¸ñ·Ï ȸé
[Header("List View Components")]
[SerializeField] private Transform programButtonContent; // ½ºÅ©·Ñ ºäÀÇ Content (¹öưµéÀÌ »ý¼ºµÉ À§Ä¡)
[SerializeField] private GameObject programButtonPrefab; // ¸ñ·Ï¿¡ Ãß°¡µÉ °³º° ¹öư ÇÁ¸®ÆÕ
[Header("Input UI")]
[SerializeField] private TextMeshProUGUI programIdText; // ÀÔ·ÂµÈ ÇÁ·Î±×·¥ ID°¡ Ç¥½ÃµÉ ÅØ½ºÆ®
[SerializeField] private Button[] numberPadButtons; // °¡»ó ŰÆÐµå ¼ýÀÚ ¹öư (0~9)
[SerializeField] private Button backspaceButton; // Áö¿ì±â ¹öư
[Header("Action Buttons")]
[SerializeField] private Button createProgramButton; // »ý¼º È®ÀÎ ¹öư
[SerializeField] private Button loadProgramButton; // ¸ñ·Ï ºÒ·¯¿À±â ȸéÀ¸·Î Àüȯ ¹öư
[SerializeField] private Button openProgramButton; // ¼±ÅÃÇÑ ÇÁ·Î±×·¥ ¿±â ¹öư
[SerializeField] private Button closeProgramListButton; // ¸ñ·Ï ´Ý±â(µÚ·Î °¡±â) ¹öư
// --- Presenter¿¡°Ô º¸³¾ À̺¥Æ® (User Events) ---
/// »õ ÇÁ·Î±×·¥ »ý¼º ¿äû (ÀÎÀÚ: ÀÔ·ÂµÈ ID)
public event Action OnCreateProgramClicked;
/// ÀúÀåµÈ ÇÁ·Î±×·¥ ¸ñ·Ï µ¥ÀÌÅÍ ¿äû
public event Action OnLoadProgramListRequested;
/// ¸ñ·Ï¿¡¼ ƯÁ¤ ÇÁ·Î±×·¥À» ¼±ÅÃÇÔ (ÀÎÀÚ: ¼±ÅÃµÈ ID)
public event Action OnProgramSelectedToLoad;
/// ¼±ÅÃµÈ ÇÁ·Î±×·¥À» ½ÇÁ¦·Î ¿±â ¿äû
public event Action OnOpenProgramClicked;
void Start()
{
loadProgramButton.onClick.AddListener(() => OnLoadProgramListRequested?.Invoke());
openProgramButton.onClick.AddListener(() => OnOpenProgramClicked?.Invoke());
for (int i = 0; i < numberPadButtons.Length; i++)
{
string number = numberPadButtons[i].GetComponentInChildren().text;
numberPadButtons[i].onClick.AddListener(() => AppendToInput(number));
}
backspaceButton.onClick.AddListener(HandleBackspace);
createProgramButton.onClick.AddListener(HandleCreateClick);
closeProgramListButton.onClick.AddListener(HideProgramList);
programSelectPanel.SetActive(true);
programNewPanel.SetActive(true);
programListPanel.SetActive(false);
SetprogramIdTextEmpty();
}
///
/// ÀÔ·Â ÅØ½ºÆ® Çʵ带 ÃʱâÈ
///
public void SetprogramIdTextEmpty()
{
programIdText.text = string.Empty;
}
///
/// °¡»ó ŰÆÐµå ÀԷ ó¸®: ¼ýÀÚ¸¦ ÅØ½ºÆ® µÚ¿¡ ºÙÀÓ
/// (ÃÖ´ë 4ÀÚ¸®±îÁö¸¸ ÀÔ·Â °¡´ÉÇϵµ·Ï Á¦ÇÑ)
///
private void AppendToInput(string number)
{
if (programIdText.text.Length < 4)
{
programIdText.text += number;
}
}
///
/// °¡»ó ŰÆÐµå Áö¿ì±â ó¸®: ¸¶Áö¸· ±ÛÀÚ¸¦ Áö¿ò
///
private void HandleBackspace()
{
if (programIdText.text.Length > 0)
{
programIdText.text = programIdText.text.Substring(0, programIdText.text.Length - 1);
}
}
///
/// '»ý¼º' ¹öư Ŭ¸¯ ½Ã Presenter¿¡°Ô ÀÔ·ÂµÈ ID¿Í ÇÔ²² À̺¥Æ®¸¦ º¸³¿
///
private void HandleCreateClick()
{
string inputId = programIdText.text;
OnCreateProgramClicked?.Invoke(inputId);
}
///
/// ¿À·ù ¸Þ½ÃÁö³ª ½Ã½ºÅÛ ¸Þ½ÃÁö¸¦ ·Î±×·Î Ç¥½Ã
///
public void ShowMessage(string message)
{
Debug.LogWarning(message);
}
///
/// ÇÁ·Î±×·¥ ·Îµå ¼º°ø ½Ã ·Î±×¸¦ Ãâ·Â
///
public void DisplayProgram(string programId)
{
if (programId == null)
{
Debug.Log("No Program Loaded");
return;
}
Debug.Log($"¿¬°áµÈ ÇÁ·Î±×·¥: {programId}");
}
///
/// Presenter·ÎºÎÅÍ ¹ÞÀº ÇÁ·Î±×·¥ ID ¸ñ·ÏÀ» ½ºÅ©·Ñ ºä¿¡ ¹öư ÇüÅ·Πǥ½Ã
///
/// Ç¥½ÃÇÒ ÇÁ·Î±×·¥ À̸§ ¸®½ºÆ®
public void ShowProgramList(List programIds)
{
foreach (Transform child in programButtonContent)
{
Destroy(child.gameObject);
}
programIds.Sort();
foreach (string id in programIds)
{
GameObject buttonGO = Instantiate(programButtonPrefab, programButtonContent);
TextMeshProUGUI buttonText = buttonGO.GetComponentInChildren();
if (buttonText != null)
{
buttonText.text = id;
}
Button button = buttonGO.GetComponent