/*
 * Copyright (c) Huawei Technologies Co., Ltd. 2024-2025. All rights reserved.
 */
package magic.core.message

import std.collection.ArrayList

/**
 * A collection of chat messages
 */
public class Dialog <: ToString & Iterable<ChatMessage> {
    private let messages: ArrayList<ChatMessage>

    public init() {
        this.messages = ArrayList<ChatMessage>()
    }

    public init(messages: ArrayList<ChatMessage>) {
        this.messages = messages.clone()
    }

    public init(messages: Array<ChatMessage>) {
        this.messages = ArrayList<ChatMessage>(messages)
    }

    public func clone(): Dialog {
        return Dialog(messages.clone())
    }

    public func addMessage(msg: ChatMessage): Unit {
        messages.append(msg)
    }

    public func addMessage(messages: Array<ChatMessage>): Unit {
        this.messages.appendAll(messages)
    }

    public func clear(): Unit {
        messages.clear()
    }

    public func removeLast(): ChatMessage {
        if (messages.isEmpty()) {
            throw Exception("Remove the last message from an empty history")
        }
        return messages.remove(messages.size-1)
    }

    public func iterator(): Iterator<ChatMessage> {
        return messages.iterator()
    }

    public operator func[](index: Int64): ChatMessage {
        return messages[index]
    }

    public prop size: Int64 {
        get() { messages.size }
    }

    public func isEmpty(): Bool {
        messages.isEmpty()
    }

    public func toString(): String {
        let strBuilder = StringBuilder()
        for (msg in messages) {
            strBuilder.append(msg.toString())
        }
        return strBuilder.toString()
    }
}