import json
import logging
import time

import requests
from dashscope import Generation
from requests import RequestException
from retry import retry

from app.core.config import QWEN_API_KEY
from app.service.chat_robot.script.service.CallQWen import get_language
from app.service.prompt_generation.util import minio_util

logger = logging.getLogger(__name__)


# os.environ["http_proxy"] = "http://127.0.0.1:7890"
# os.environ["https_proxy"] = "http://127.0.0.1:7890"


# llm = ChatOpenAI(model_name=OPENAI_MODEL,
#                  openai_api_key=OPENAI_API_KEY,
#                  temperature=0)

# prefix_for_llama = (
#     """
#     Translate everything within the brackets [] into English.
#     Never translate or modify any English input.
#     The input must be fully translated into coherent English sentences.
#     Please only output the translated result.\n
#     """
# )


def translate_to_en(text):
    # template = (
    #     """You are a translation expert, proficient in various languages.
    #     And can translate various languages into English.
    #     Please translate to grammatically correct English regardless of the input language.
    #     If the input is already in English, or consists of letters or numbers such as "cat", "abc", or "1",
    #     output the input text exactly as it is without any modifications or additions.
    #     If there are grammatical errors, correct them and then output the sentence."""
    # )
    #
    # prefix = (
    #     """
    #     Translate everything within the brackets [] into English.
    #     Never translate or modify any English input.
    #     The input must be fully translated into coherent English sentences.
    #     Never present the translation results in the format
    #     "The translation of \"Material suave\" into English would be \"Smooth material.\"". Instead, directly output "Smooth material".
    #     """
    # )
    messages = [
        # {
        # Translate the entire text and ensure the output is a complete and coherent sentence in English.
        #     "content": template,  # 系统message
        #     "role": "system"
        # },
        {
            # "content": input('请输入：'),  # 用户message
            "content": text,  # 用户message
            "role": "user"
        }
    ]
    first_response = get_response(messages)
    assistant_output = first_response.output.choices[0].message
    print("input : {}, translate result : {}".format(text, assistant_output.content))
    return assistant_output.content

    # llama3专用
    # data = get_translation_from_llama3(text)
    # translation = data
    # # print("Response from llama3 : " + translation)
    # return translation


@retry(exceptions=RequestException, tries=3, delay=1)
def get_response(messages):
    response = Generation.call(
        model='qwen-turbo',
        api_key=QWEN_API_KEY,
        messages=messages,
        # seed=random.randint(1, 10000),  # 设置随机数种子seed，如果没有设置，则随机数种子默认为1234
        result_format='message',  # 将输出设置为message形式
        enable_search='True'
    )
    return response


def get_translation_from_llama3(text):
    start_time = time.time()
    url = "http://10.1.1.240:11434/api/generate"
    # url = "http://10.1.1.240:1143/api/generate"

    # prompt = f"System: {prefix_for_llama}\nUser:[{text}]"

    # 先获取用户输入文本的语言
    language = get_language(text)

    if 'English' in language:
        return text

    # 创建请求的负载 translator是自定义的翻译模型
    payload = {
        "model": "translator",
        "prompt": f"[{text}]",
        "stream": False
    }
    # 将负载转换为 JSON 格式
    headers = {'Content-Type': 'application/json'}
    response = requests.post(url, data=json.dumps(payload), headers=headers)
    # 处理响应
    if response.status_code == 200:
        # print("Response from server:")
        # print(response.json())
        resp = json.loads(response.content).get("response")
        logger.info(f"translation server runtime is {time.time() - start_time} , response is {resp}")
        print("input : {}, translate result : {}".format(text, resp))
        return resp
    else:
        logger.info(f"translation server runtime is {time.time() - start_time} , response is {response.content}")
        print(f"Request failed with status code {response.status_code}")
        print(response.text)


# 在llama3中创建一个翻译模型
# def create_model_with_llama(text):
#     url = "http://localhost:11434/api/create"
#     # url = "http://10.1.1.240:1143/api/generate"
#
#     # prompt = f"System: {prefix_for_llama}\nUser:[{text}]"
#
#     # 创建翻译器的配置文件
#     payload = {
#         "model": "translator",
#         "modelfile": "FROM llama3\nSYSTEM Translate everything within the brackets [] into English."
#                      "Never translate or modify any English input."
#                      "The input must be fully translated into coherent English sentences."
#     }
#
#     # 将负载转换为 JSON 格式
#     headers = {'Content-Type': 'application/json'}
#     response = requests.post(url, data=json.dumps(payload), headers=headers)


def get_prompt_from_image(image_path, text):
    start_time = time.time()
    # url = "http://localhost:11434/api/generate"
    url = "http://10.1.1.243:11434/api/generate"

    image_base64 = minio_util.minio_url_to_base64(image_path.img)
    # image_base64 = minio_url_to_base64(image_path)

    # 创建请求的负载 translator是自定义的翻译模型
    payload = {
        "model": "llama3.2-vision",
        "images": [image_base64],
        "prompt": f"{text}",
        "stream": False
    }
    # 将负载转换为 JSON 格式
    headers = {'Content-Type': 'application/json'}
    response = requests.post(url, data=json.dumps(payload), headers=headers)
    # 处理响应
    if response.status_code == 200:
        # print("Response from server:")
        # print(response.json())
        resp = json.loads(response.content).get("response")
        logger.info(f"sketch re-generate server runtime is {time.time() - start_time} \n, response is {resp}")
        # print("input : {}, sketch re-generate result : {}".format(text, resp))
        return resp
    else:
        logger.info(f"sketch re-generate server runtime is {time.time() - start_time} , response is {response.content}")
        print(f"Request failed with status code {response.status_code}")
        print(response.text)


def main():
    """Main function"""
    text = get_translation_from_llama3("[火焰]")
    print(text)


if __name__ == "__main__":
    main()
