import unittest
import os
import shutil

from dotenv import load_dotenv
# pydantic support load_dotenv,   so load_dotenv will be deprecated in the future.

from qlib.finco.task import SummarizeTask
from qlib.finco.workflow import WorkflowContextManager
from qlib.finco.llm import APIBackend
from qlib.finco.workflow import WorkflowManager

load_dotenv(verbose=True, override=True)


class TestSummarize(unittest.TestCase):

    def test_chat(self):
        messages = [
            {
                "role": "system",
                "content": "Your are a professional financial assistant.",
            },
            {
                "role": "user",
                "content": "How to write a perfect quant strategy.",
            },
        ]
        response = APIBackend().try_create_chat_completion(messages=messages)
        print(response)

    def test_execution(self):
        task = SummarizeTask()
        context = WorkflowContextManager()
        context.set_context("workspace", "../../examples/benchmarks/Linear")
        context.set_context("user_prompt", "My main focus is on the performance of the strategy's return."
                                           "Please summarize the information and give me some advice.")
        task.assign_context_manager(context)
        resp = task.execute()
        print(resp)

    def test_generate_batch_result(self):
        wm = WorkflowManager()

        prompt = wm.default_user_prompt
        # prompt = ""

        workdir = os.path.dirname(wm.get_context().get_context("workspace"))
        summaries_path = os.path.join(workdir, "summaries")

        if not os.path.exists(summaries_path):
            os.makedirs(summaries_path)

        for i in range(10):
            wm.run(prompt)
            if os.path.exists(f"{workdir}/finCoReport.md"):
                shutil.move(f"{workdir}/finCoReport.md", f"{workdir}/summaries/finCoReport{i}.md")

    def test_parse2txt(self):
        task = SummarizeTask()
        resp = task.get_info_from_file("")
        print(resp)


if __name__ == "__main__":
    unittest.main()
