using System.Windows;

namespace AxCopilot.Views;

public partial class ChatWindow
{
    // ─── 스트리밍 커서 깜빡임 + AI 아이콘 펄스 ────────────────────────────

    private void StopAiIconPulse()
    {
        if (_aiIconPulseStopped || _activeAiIcon == null) return;
        _activeAiIcon.BeginAnimation(UIElement.OpacityProperty, null);
        _activeAiIcon.Opacity = 1.0;
        _activeAiIcon = null;
        _aiIconPulseStopped = true;
    }

    private void CursorTimer_Tick(object? sender, EventArgs e)
    {
        _cursorVisible = !_cursorVisible;
        // 커서 상태만 토글 — 실제 텍스트 갱신은 _typingTimer가 담당
        if (_activeStreamText != null && _displayedLength > 0)
        {
            var displayed = _cachedStreamContent.Length > 0
                ? _cachedStreamContent[..Math.Min(_displayedLength, _cachedStreamContent.Length)]
                : "";
            _activeStreamText.Text = displayed + (_cursorVisible ? "\u258c" : " ");
        }
    }

    private void ElapsedTimer_Tick(object? sender, EventArgs e)
    {
        var elapsed = DateTime.UtcNow - _streamStartTime;
        var sec = (int)elapsed.TotalSeconds;
        if (_elapsedLabel != null)
            _elapsedLabel.Text = $"{sec}s";

        // 하단 상태바 시간 갱신
        if (StatusElapsed != null)
            StatusElapsed.Text = $"{sec}초";
    }

    private void TypingTimer_Tick(object? sender, EventArgs e)
    {
        if (_activeStreamText == null || string.IsNullOrEmpty(_cachedStreamContent)) return;

        var targetLen = _cachedStreamContent.Length;
        if (_displayedLength >= targetLen) return;

        // 버퍼에 쌓인 미표시 글자 수에 따라 속도 적응
        var pending = targetLen - _displayedLength;
        int step;
        if (pending > 200)      step = Math.Min(pending / 5, 40); // 대량 버퍼: 빠르게 따라잡기
        else if (pending > 50)  step = Math.Min(pending / 4, 15); // 중간 버퍼: 적당히 가속
        else                    step = Math.Min(3, pending);       // 소량: 자연스러운 1~3자

        _displayedLength += step;

        var displayed = _cachedStreamContent[.._displayedLength];
        _activeStreamText.Text = displayed + (_cursorVisible ? "\u258c" : " ");

        // 스트리밍 중에는 즉시 스크롤 (부드러운 애니메이션은 지연 유발)
        if (!_userScrolled)
            MessageScroll.ScrollToVerticalOffset(MessageScroll.ScrollableHeight);
    }
}
