# -*- coding: utf-8 -*-
"""
@author: yq
@time: 2024/12/18
@desc: 策略流节点解析
"""
import json
import re
import time

import pandas as pd
from PIL import Image
from openpyxl import load_workbook

from commom import f_get_save_path, call_llm, f_file_upload, GeneralException
from enums import ResultCodesEnum
from prompt import f_get_prompt_parse_node, f_get_prompt_parse_flow


def _f_parse_flow(ws):
    image = ws._images[0]
    img = Image.open(image.ref).convert("RGB")
    save_path = f_get_save_path("流程图.png")
    img.save(save_path)
    time.sleep(1)
    file_id = f_file_upload(save_path)
    prompt = f_get_prompt_parse_flow()
    prompt = [
        {
            "type": "text",
            "text": prompt
        },
        {
            "type": "image",
            "file_id": file_id
        }
    ]
    prompt = json.dumps(prompt, ensure_ascii=False)
    print(prompt)
    llm_answer = call_llm(prompt, "object_string")
    print(llm_answer)
    save_path = f_get_save_path("flow.py")
    with open(save_path, mode="w", encoding="utf8") as f:
        f.write(llm_answer)


def _f_parse_node(df: pd.DataFrame, sheet_name):
    rules = ""
    for idx, row in df.iterrows():
        var_name = row["变量"]
        var_name = var_name.replace("\n", " ")
        rule_content = row["逻辑"]
        rule_out = row["输出"]
        rules = f"{rules}规则{idx + 1}: 变量:{var_name} 逻辑:{rule_content} 输出:{rule_out}\n"

    prompt = f_get_prompt_parse_node(sheet_name, rules)
    print(prompt)
    llm_answer = call_llm(prompt)
    llm_answer = re.findall(r"```python\n(.*)\n```", llm_answer, flags=re.DOTALL)[0]
    func_name = re.findall(r"def (.*)\(data", llm_answer)[0]
    save_path = f_get_save_path(f"{func_name}.py", "node")
    print(llm_answer)
    with open(save_path, mode="w", encoding="utf8") as f:
        f.write(llm_answer)


def f_parse_strategy(file_path):
    wb = load_workbook(file_path)
    excel = pd.ExcelFile(file_path)
    sheet_names = excel.sheet_names
    if "流程图" not in sheet_names:
        GeneralException(ResultCodesEnum.NOT_FOUND, message=f"sheet【流程图】不存在")
    for sheet_name in sheet_names:
        if sheet_name == "流程图":
            _f_parse_flow(wb["流程图"])
            continue
        df = excel.parse(sheet_name=sheet_name)
        _f_parse_node(df, sheet_name)
    wb.close()
    excel.close()


if __name__ == "__main__":
    f_parse_strategy("./cache/策略节点配置demo.xlsx")