/*
 * Copyright (c) Huawei Technologies Co., Ltd. 2023-2024. All rights reserved.
 */
package magic.agent_executor.plan_react

import magic.jsonable.*
import magic.dsl.jsonable
import magic.utils.{Color, Colorful}

import encoding.json.*
import std.collection.{HashMap, ArrayList}

/**
 * A question will be decomposed as subtasks to solve.
 */
@jsonable
protected class Subtask {
    let name: String
    let goal: String
    let criticism: String
    let milestones: Array<String>
    // let tools: Array<String>
    var result: Option<String> = None

    init(name!: String, goal!: String) {
        this.name = name
        this.goal = goal
        this.criticism = ""
        this.milestones = []
        // this.tools = []
        this.result = None
    }

    prop simpleDescription: String {
        get() {
            let strBuilder = StringBuilder()
            strBuilder.append("Task-Name: ${name}\n")
            strBuilder.append("Task-Goal: ${goal}")
            return strBuilder.toString()
        }
    }

    prop complexDescription: String {
        get() {
            let strBuilder = StringBuilder()
            strBuilder.append("Task-Name: ${name}\n")
            strBuilder.append("Task-Goal: ${goal}\n")
            strBuilder.append("Task-Milestones: ${milestones}")
            return strBuilder.toString()
        }
    }

    func toMarkdown(): String {
        let strBuilder = StringBuilder()
        strBuilder.append("## 📝 Task ${name}\n\n")
        strBuilder.append("**🎯 Goal**: ${goal}\n")
        strBuilder.append("**📌 Criticism**: ${criticism}\n")
        strBuilder.append("**🚩 Milestones**:\n")
        for (m in milestones) {
            strBuilder.append("- ${m}\n")
        }
        if (let Some(r) <- result) {
            strBuilder.append("**🏆 Result**: ${r}\n")
        }
        return strBuilder.toString()
    }
}