import json
import os

# import yaml
from dotenv import load_dotenv
from utils_groupclassification.agent import submit_tool_outputs
from utils_groupclassification.assistants_utils import (
    create_assistant,
    create_message,
    create_run,
    create_thread,
    wait_for_run_completion,
)
from utils_groupclassification.gspread_utils import write_gspread
from src.myLogger import set_logger
from utils_groupclassification.check_openai import co

logger = set_logger("my_app", level="INFO")

load_dotenv()
model = 'gpt-4o'


def search(query) -> list:
    logger.info("create thread")
    thread = create_thread()
    logger.info("created thread")

    with open("prompts/ph1.txt", "r") as fp:  # search prompt
        assistant_prompt = fp.read()
        logger.info(f"assistant prompt: {assistant_prompt}")
    with open("tools/ph1.json", "r") as f:  # tool prompt
        tools = json.load(f)

    logger.info("create assistant")
    assistant = create_assistant(  # create assistant
        assistant_prompt,
        model=model,
        tools=tools,
    )
    logger.info(f"User:{query}")

    create_message(thread.id, "user", query)
    run = create_run(thread.id, assistant.id)
    run = wait_for_run_completion(thread.id, run.id)

    logger.info(f"status: {run.status}")

    if run.status == "failed":
        logger.error(f"Run_failed: {run.last_error},  Run ID: {run.id}")
        return "Group 5", ['途中でエラー'], [], []
        # sys.exit(1)
    elif run.status == "requires_action":
        logger.info(
            f"Run requires action: {run.required_action.submit_tool_outputs.tool_calls}"
        )
        run = submit_tool_outputs(
            thread.id,
            run.id,
            run.required_action.submit_tool_outputs.tool_calls,
        )

        if run is None:
            return "Group 5", ['途中でエラー'], [], []

        run = wait_for_run_completion(thread.id, run.id)

        logger.info(f"Run status: {run.status}")

        with open("prompts/ph2.txt", "r") as fp:  # search prompt
            assistant_prompt = fp.read()
            logger.info(f"assistant prompt: {assistant_prompt}")
        with open("tools/ph2.json", "r") as f:  # tool prompt
            tools = json.load(f)
        assistant1 = create_assistant(  # create assistant
            assistant_prompt,
            model="gpt-3.5-turbo",
            tools=tools,
        )
        run = create_run(thread.id, assistant1.id)
        logger.info(f"run.id: {run.id}")
        run = wait_for_run_completion(thread.id, run.id)
        logger.info(f"status: {run.status}")

        if run.status == "failed":
            logger.error(f"Run_failed: {run.error},  Run ID: {run.id}")
            return "Group 5", ['途中でエラー'], [], []
            # sys.exit(1)

        elif run.status == "requires_action":
            logger.info(
                f"Run requires action: {run.required_action.submit_tool_outputs.tool_calls}"
            )
            run = submit_tool_outputs(
                thread.id,
                run.id,
                run.required_action.submit_tool_outputs.tool_calls,
            )

            if run is None:
                return "Group 5", ['途中でエラー'], [], []

            run = wait_for_run_completion(thread.id, run.id)

            logger.info(f"Run status: {run.status}")

            group, related_url, unrelated_url, other_url = write_gspread(query)
            if len(related_url) == 0:
                related_url_list = '関連URLなし'
            else:
                related_url_list = ', '.join(related_url)
            unrelated_url_list = ', '.join(unrelated_url)
            other_url_list = ', '.join(other_url)
            return group, related_url_list, unrelated_url_list, other_url_list


def group2_classification(company_name):
    group, related_url_list, unrelated_url_list, other_url_list = search(company_name)
    if group == 'Group 3':
        group = 'Group 2'
    else:
        group = 'Group 1-2'
    return group, related_url_list, unrelated_url_list, other_url_list