import ComposableArchitecture
import Foundation

/// Handles streaming text content from assistant messages.
///
/// This handler processes incremental chunks of text as they arrive from the backend,
/// appending them to existing messages or creating new assistant messages as needed.
public struct MessageContentHandler: OrpheusEventHandler {
    @Dependency(\.date) private var date

    public func handle(
        event: OrpheusRealtimeEvent,
        session: OrpheusSession
    ) -> EventHandlerResult {
        guard case .messageContent(let messageId, let content, _) = event else {
            return .noOp
        }
        var messagesList = session.messages
        let messageIndex = messagesList.firstIndex { $0.id == messageId } // slow? <- session messages should be identifiedarray
        
        if let index = messageIndex {
            // Message already exists - append content (matches Android)
            let existingMessage = messagesList[index]
            print("📝 MessageContent: Appending to existing message \(messageId), existing content length: \(existingMessage.content.count), new content: '\(content)'")
            messagesList[index] = existingMessage.copy(
                content: existingMessage.content + content
            )
        } else {
            // Message doesn't exist - create new one
            // Note: This should be rare if MessageToolCallHandler already created the message
            print("📝 MessageContent: Creating new message \(messageId) with content: '\(content)'")
            let assistantMessage = OrpheusMessage(
                id: messageId,
                role: .assistant,
                content: content,
                timestamp: date.now.timeIntervalSince1970,
                contentType: .chat,
                accumulatingToolCall: nil,
                generatedClips: [],
                isStreaming: true
            )
            messagesList.append(assistantMessage)
        }
        
        return .messagesUpdated(messagesList)
    }
}
