// ==============================================
// GameHUD.cs - Spiel-UI Anzeige
// ==============================================
// Zeigt Score, Leben, Distanz und andere
// Spielinformationen an.

using UnityEngine;
using TMPro;
using UnityEngine.UI;

namespace BreakpilotDrive
{
    public class GameHUD : MonoBehaviour
    {
        [Header("Score")]
        [SerializeField] private TextMeshProUGUI scoreText;
        [SerializeField] private TextMeshProUGUI highScoreText;

        [Header("Leben")]
        [SerializeField] private TextMeshProUGUI livesText;
        [SerializeField] private Image[] heartImages;

        [Header("Distanz")]
        [SerializeField] private TextMeshProUGUI distanceText;

        [Header("Quiz-Statistik")]
        [SerializeField] private TextMeshProUGUI quizStatsText;

        [Header("Animationen")]
        [SerializeField] private Animator scoreAnimator;

        private int displayedScore = 0;
        private int targetScore = 0;

        void Start()
        {
            // Events abonnieren
            if (GameManager.Instance != null)
            {
                GameManager.Instance.OnScoreChanged += UpdateScore;
                GameManager.Instance.OnLivesChanged += UpdateLives;
                GameManager.Instance.OnDistanceChanged += UpdateDistance;
            }

            // Initial-Werte setzen
            UpdateScore(0);
            UpdateLives(3);
            UpdateDistance(0);
        }

        void OnDestroy()
        {
            // Events abbestellen
            if (GameManager.Instance != null)
            {
                GameManager.Instance.OnScoreChanged -= UpdateScore;
                GameManager.Instance.OnLivesChanged -= UpdateLives;
                GameManager.Instance.OnDistanceChanged -= UpdateDistance;
            }
        }

        void Update()
        {
            // Score-Animation (zaehlt hoch)
            if (displayedScore != targetScore)
            {
                displayedScore = (int)Mathf.MoveTowards(displayedScore, targetScore, Time.deltaTime * 1000);
                if (scoreText != null)
                {
                    scoreText.text = displayedScore.ToString("N0");
                }
            }

            // Quiz-Statistik aktualisieren
            UpdateQuizStats();
        }

        // ==============================================
        // Score
        // ==============================================
        private void UpdateScore(int newScore)
        {
            targetScore = newScore;

            // Animation ausloesen bei Punkte-Gewinn
            if (newScore > displayedScore && scoreAnimator != null)
            {
                scoreAnimator.SetTrigger("ScoreUp");
            }
        }

        // ==============================================
        // Leben
        // ==============================================
        private void UpdateLives(int lives)
        {
            if (livesText != null)
            {
                livesText.text = $"x{lives}";
            }

            // Herz-Icons aktualisieren
            if (heartImages != null)
            {
                for (int i = 0; i < heartImages.Length; i++)
                {
                    heartImages[i].enabled = i < lives;
                }
            }
        }

        // ==============================================
        // Distanz
        // ==============================================
        private void UpdateDistance(float distance)
        {
            if (distanceText != null)
            {
                distanceText.text = $"{distance:F0}m";
            }
        }

        // ==============================================
        // Quiz-Statistik
        // ==============================================
        private void UpdateQuizStats()
        {
            if (quizStatsText == null || QuizManager.Instance == null) return;

            int answered = QuizManager.Instance.GetQuestionsAnswered();
            int correct = QuizManager.Instance.GetQuestionsCorrect();

            if (answered > 0)
            {
                float accuracy = QuizManager.Instance.GetAccuracy() * 100;
                quizStatsText.text = $"Quiz: {correct}/{answered} ({accuracy:F0}%)";
            }
            else
            {
                quizStatsText.text = "Quiz: 0/0";
            }
        }
    }
}
