using System.Windows;
using System.Windows.Controls;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Animation;
using AxCopilot.Models;
using AxCopilot.Services;

namespace AxCopilot.Views;

public partial class ChatWindow
{
    // ─── 메시지 등장 애니메이션 ──────────────────────────────────────────

    private static void ApplyMessageEntryAnimation(FrameworkElement element)
    {
        element.Opacity = 0;
        element.RenderTransform = new TranslateTransform(0, 16);
        element.BeginAnimation(UIElement.OpacityProperty,
            new DoubleAnimation(0, 1, TimeSpan.FromMilliseconds(350))
            { EasingFunction = new CubicEase { EasingMode = EasingMode.EaseOut } });
        ((TranslateTransform)element.RenderTransform).BeginAnimation(
            TranslateTransform.YProperty,
            new DoubleAnimation(16, 0, TimeSpan.FromMilliseconds(400))
            { EasingFunction = new CubicEase { EasingMode = EasingMode.EaseOut } });
    }

    // ─── 메시지 편집 ──────────────────────────────────────────────────────

    private bool _isEditing; // 편집 모드 중복 방지

    private void EnterEditMode(StackPanel wrapper, string originalText)
    {
        if (_isStreaming || _isEditing) return;
        _isEditing = true;

        // wrapper 위치(인덱스) 기억
        var idx = MessagePanel.Children.IndexOf(wrapper);
        if (idx < 0) { _isEditing = false; return; }

        // 편집 UI 생성
        var editPanel = new StackPanel
        {
            HorizontalAlignment = HorizontalAlignment.Right,
            MaxWidth = 540,
            Margin = wrapper.Margin,
        };

        var editBox = new TextBox
        {
            Text = originalText,
            FontSize = 13.5,
            Foreground = ThemeResourceHelper.Primary(this),
            Background = ThemeResourceHelper.ItemBg(this),
            CaretBrush = ThemeResourceHelper.Accent(this),
            BorderBrush = ThemeResourceHelper.Accent(this),
            BorderThickness = new Thickness(1.5),
            Padding = new Thickness(14, 10, 14, 10),
            TextWrapping = TextWrapping.Wrap,
            AcceptsReturn = false,
            MaxHeight = 200,
            VerticalScrollBarVisibility = ScrollBarVisibility.Auto,
        };
        // 둥근 모서리
        var editBorder = new Border
        {
            CornerRadius = new CornerRadius(14),
            Child = editBox,
            ClipToBounds = true,
        };
        editPanel.Children.Add(editBorder);

        // 버튼 바
        var btnBar = new StackPanel
        {
            Orientation = Orientation.Horizontal,
            HorizontalAlignment = HorizontalAlignment.Right,
            Margin = new Thickness(0, 6, 0, 0),
        };

        var accentBrush = ThemeResourceHelper.Accent(this);
        var secondaryBrush = ThemeResourceHelper.Secondary(this);

        // 취소 버튼
        var cancelBtn = new Button
        {
            Content = new TextBlock { Text = "취소", FontSize = 12, Foreground = secondaryBrush },
            Background = Brushes.Transparent,
            BorderThickness = new Thickness(0),
            Cursor = Cursors.Hand,
            Padding = new Thickness(12, 5, 12, 5),
            Margin = new Thickness(0, 0, 6, 0),
        };
        cancelBtn.Click += (_, _) =>
        {
            _isEditing = false;
            if (idx >= 0 && idx < MessagePanel.Children.Count)
                MessagePanel.Children[idx] = wrapper; // 원래 버블 복원
        };
        btnBar.Children.Add(cancelBtn);

        // 전송 버튼
        var sendBtn = new Button
        {
            Cursor = Cursors.Hand,
            Padding = new Thickness(0),
        };
        sendBtn.Template = (ControlTemplate)System.Windows.Markup.XamlReader.Parse(
            "<ControlTemplate xmlns='http://schemas.microsoft.com/winfx/2006/xaml/presentation' TargetType='Button'>" +
            "<Border Background='" + (accentBrush is SolidColorBrush sb ? sb.Color.ToString() : "#4B5EFC") + "' CornerRadius='8' Padding='12,5,12,5'>" +
            "<TextBlock Text='전송' FontSize='12' Foreground='White' HorizontalAlignment='Center'/>" +
            "</Border></ControlTemplate>");
        sendBtn.Click += (_, _) =>
        {
            var newText = editBox.Text.Trim();
            if (!string.IsNullOrEmpty(newText))
                _ = SubmitEditAsync(idx, newText);
        };
        btnBar.Children.Add(sendBtn);

        editPanel.Children.Add(btnBar);

        // 기존 wrapper → editPanel 교체
        MessagePanel.Children[idx] = editPanel;

        // Enter 키로도 전송
        editBox.KeyDown += (_, ke) =>
        {
            if (ke.Key == Key.Enter && Keyboard.Modifiers == ModifierKeys.None)
            {
                ke.Handled = true;
                var newText = editBox.Text.Trim();
                if (!string.IsNullOrEmpty(newText))
                    _ = SubmitEditAsync(idx, newText);
            }
            if (ke.Key == Key.Escape)
            {
                ke.Handled = true;
                _isEditing = false;
                if (idx >= 0 && idx < MessagePanel.Children.Count)
                    MessagePanel.Children[idx] = wrapper;
            }
        };

        editBox.Focus();
        editBox.SelectAll();
    }

    private async Task SubmitEditAsync(int bubbleIndex, string newText)
    {
        _isEditing = false;
        if (_isStreaming) return;

        ChatConversation conv;
        lock (_convLock)
        {
            if (_currentConversation == null) return;
            conv = _currentConversation;
        }

        // bubbleIndex에 해당하는 user 메시지 찾기
        int userMsgIdx = -1;
        int uiIdx = 0;
        lock (_convLock)
        {
            for (int i = 0; i < conv.Messages.Count; i++)
            {
                if (conv.Messages[i].Role == "system") continue;
                if (uiIdx == bubbleIndex)
                {
                    userMsgIdx = i;
                    break;
                }
                uiIdx++;
            }
        }

        if (userMsgIdx < 0) return;

        // 데이터 모델에서 편집된 메시지 이후 모두 제거
        lock (_convLock)
        {
            conv.Messages[userMsgIdx].Content = newText;
            while (conv.Messages.Count > userMsgIdx + 1)
                conv.Messages.RemoveAt(conv.Messages.Count - 1);
        }

        // UI에서 편집된 버블 이후 모두 제거
        while (MessagePanel.Children.Count > bubbleIndex + 1)
            MessagePanel.Children.RemoveAt(MessagePanel.Children.Count - 1);

        // 편집된 메시지를 새 버블로 교체
        MessagePanel.Children.RemoveAt(bubbleIndex);
        AddMessageBubble("user", newText, animate: false);

        // AI 재응답
        await SendRegenerateAsync(conv);
        try { _storage.Save(conv); } catch (Exception ex) { Services.LogService.Debug($"대화 저장 실패: {ex.Message}"); }
        RefreshConversationList();
    }
}
