import sys
import os
sys.path.append(os.path.abspath(os.path.join(os.path.dirname(__file__), '..','..')))
import openai
from dotenv import load_dotenv
import time
from services.my_slack.my_slack import send_slack
from utils.token_check import count_tokens

load_dotenv()

#詳細議事録の作成
def summarize_detailed(text,threadID):
    client = openai.OpenAI(api_key=os.environ['OPENAI_API_KEY'])
    
    # ThreadにLINEメッセージを格納
    client.beta.threads.messages.create(
        thread_id=threadID,
        role="user",
        content=f"""
下記の文章の誤字脱字の部分を推測しながら
わかりやすい議事録を作成してください。

要約してほしいtextは下記です。

■文章
{text}"""
    )

    #Assistantの実行(Theread×AssistantIDで実行)
    assistant_id = os.getenv("ASSISTANT_ID_SUMMARY")    
    run = client.beta.threads.runs.create(
        thread_id=threadID,
        assistant_id=assistant_id,
        extra_headers={"OpenAI-Beta": "assistants=v2"}
    )
    
    run_id = ""
    run_id = run.id
    
    #Runステータスがcompletedであれば次に進む
    max_attempts = 8

    for attempt in range(max_attempts):
        run_retrieve = client.beta.threads.runs.retrieve(
            thread_id=threadID,
            run_id=run_id
        )

        if run_retrieve.status == 'completed':
            print("Run is completed.(summary_chatgpt)")
            break
        else:
            print("Run is still in progress...(summary_chatgpt)")
            # 20秒間隔でステータスをチェック
            time.sleep(20)
        
        # 最後の試行でまだ完了していない場合、メッセージを出力
        if attempt == max_attempts - 1:
            print("Maximum attempts reached. Exiting...(summary_chatgpt)")
            return
    
    #message内のデータを閲覧
    messages = client.beta.threads.messages.list(
        thread_id=threadID,
        order = "asc",
        run_id=run_id,   
    )
    # 結合したいメッセージを格納するための空のリストを用意
    joined_messages = []

    for msg in messages:
        # 各メッセージを 'role:content' の形式でフォーマットし、リストに追加
        joined_messages.append(msg.content[0].text.value)

    # リスト内のメッセージを改行で結合し、1つの文字列にする
    res = "\n".join(joined_messages)
    return res
  
#簡易議事録の作成
def summarize_simple(text,threadID):
    client = openai.OpenAI(api_key=os.environ['OPENAI_API_KEY'])
    
    # ThreadにLINEメッセージを格納
    client.beta.threads.messages.create(
        thread_id=threadID,
        role="user",
        content=f"""
下記の文章を一つにまとめてください。
1500字程度に、全体の体裁を整えて下記形式で出力してください。
特に「決定事項」、「決定に至った背景」についてはできるだけ詳しく、

##出力形式
・議題
・参加者
・決定事項
・決定に至った背景
・やるべきこと

■文章
{text}
        """
    )
    
    #Assistant Name =「簡易要約作成_20240810」
    assistant_id = os.getenv("ASSISTANT_ID_SHORT_SUMMARY")
     
    run = client.beta.threads.runs.create(
        thread_id=threadID,
        assistant_id=assistant_id,
        extra_headers={"OpenAI-Beta": "assistants=v2"}
    )
    
    run_id = ""
    run_id = run.id
    
    #Runステータスがcompletedであれば次に進む
    max_attempts = 8

    for attempt in range(max_attempts):
        run_retrieve = client.beta.threads.runs.retrieve(
            thread_id=threadID,
            run_id=run_id
        )

        if run_retrieve.status == 'completed':
            print("Run is completed.(summary_all_chatgpt)")
            break
        else:
            print("Run is still in progress...(summary_all_chatgpt)")
            time.sleep(20)  # 12秒間隔でステータスをチェック
        # 最後の試行でまだ完了していない場合、メッセージを出力
        if attempt == max_attempts - 1:
            print("Maximum attempts reached. Exiting...(summary_all_chatgpt)")
            return
    
    #message内のデータを閲覧
    messages = client.beta.threads.messages.list(
        thread_id=threadID,
        order = "asc",
        run_id=run_id,   
    )

    # 結合したいメッセージを格納するための空のリストを用意
    joined_messages = []

    for msg in messages:
        # 各メッセージを 'role:content' の形式でフォーマットし、リストに追加
        joined_messages.append(msg.content[0].text.value)

    # リスト内のメッセージを改行で結合し、1つの文字列にする
    res = "\n".join(joined_messages)
    return res
  
#就活軸の作成
def create_job_axes(record,threadID):
    client = openai.OpenAI(api_key=os.environ['OPENAI_API_KEY'])
    
    # ThreadにLINEメッセージを格納
    client.beta.threads.messages.create(
        thread_id=threadID,
        role="user",
        content=f"""
議事録から就活軸を3つ以上作成してください。

・就活軸
・就活軸の詳細
・就活軸作成の背景

こちらの3つをアウトプットしてください。

また、学生が大事にしたいと言っている就活軸でも、
企業選びにおいて適切でない場合は、就活軸として設定しないでください。
下記の議事録を読み取って、就活軸を作成してください。

【議事録】
{record}
"""
    )

    assistant_id = ""
    assistant_id = os.getenv("ASSISTANT_ID_JOB_AXE")
    
    run =  ""
    run = client.beta.threads.runs.create(
        thread_id=threadID,
        assistant_id=assistant_id,
        extra_headers={
            "OpenAI-Beta": "assistants=v2",
            "Cache-Control": "no-cache"}
    )
    run_id = ""
    run_id = run.id
    
    #Runステータスがcompletedであれば次に進む
    max_attempts = 8

    for attempt in range(max_attempts):
        run_retrieve = client.beta.threads.runs.retrieve(
            thread_id=threadID,
            run_id=run_id
        )

        if run_retrieve.status == 'completed':
            print("Run is completed.(job_axes_chatgpt)")
            break
        else:
            print("Run is still in progress...(job_axes_chatgpt)")
            time.sleep(20)
        # 最後の試行でまだ完了していない場合、メッセージを出力
        if attempt == max_attempts - 1:
            print("Maximum attempts reached. Exiting...(job_axes_chatgpt)")
            return
    
    #message内のデータを閲覧
    time.sleep(10)
    messages = ""
    messages = client.beta.threads.messages.list(
        thread_id=threadID,
        order = "asc",
        run_id=run_id,   
    )
            
    # 結合したいメッセージを格納するための空のリストを用意
    joined_messages = []

    for msg in messages:
        # 各メッセージを 'role:content' の形式でフォーマットし、リストに追加
        joined_messages.append(msg.content[0].text.value)

    # リスト内のメッセージを改行で結合し、1つの文字列にする
    res = "\n".join(joined_messages)
    return res



def create_rag_answer(question_with_input_documents, threadID):
    
    client = openai.OpenAI(api_key=os.environ['OPENAI_API_KEY'])

    client.beta.threads.messages.create(
        thread_id=threadID,
        role="user",
        content=f"""
あなたはプロの就活アシスタントです。下記の学生の質問に対して、与えられた情報を元に回答してください。
### 必ず、添付しているinput documentsの情報を参照して回答してください。
### 必ず、また、レスポンスの形式は必ずhtml形式で返答してください。

1.「質問」
{question_with_input_documents}
"""
    )
    
    assistant_id = os.getenv("ASSISTANT_ID_RETRIEVAL_4omini")
     
    run = client.beta.threads.runs.create(
        thread_id=threadID,
        assistant_id=assistant_id,
        extra_headers={"OpenAI-Beta": "assistants=v2"}
    )
    
    run_id = ""
    run_id = run.id
    
    #Runステータスがcompletedであれば次に進む
    max_attempts = 8

    for attempt in range(max_attempts):
        run_retrieve = client.beta.threads.runs.retrieve(
            thread_id=threadID,
            run_id=run_id
        )

        if run_retrieve.status == 'completed':
            print("Run is completed.(company_recommend_chatgpt)")
            break
        else:
            print("Run is still in progress...(company_recommend_chatgpt)")
            # 8秒間隔でステータスをチェック
            time.sleep(8)  
            # 最後の試行でまだ完了していない場合、メッセージを出力
        if attempt == max_attempts - 1:
            print("Maximum attempts reached. Exiting...(company_recommend_chatgpt)")
            message = "<@UECMYCL3C>要約中に、エラーが発生しました。"
            send_slack(message)
            return
    
    #message内のデータを閲覧
    messages = client.beta.threads.messages.list(
        thread_id=threadID,
        order = "asc",
        run_id=run_id,   
    )

    # 結合したいメッセージを格納するための空のリストを用意
    joined_messages = []

    for msg in messages:
        # 各メッセージを 'role:content' の形式でフォーマットし、リストに追加
        joined_messages.append(msg.content[0].text.value)

    # リスト内のメッセージを改行で結合し、1つの文字列にする
    answer = "\n".join(joined_messages)
    
    return answer

def create_rag_short_answer(question_with_input_documents, threadID):
    
    client = openai.OpenAI(api_key=os.environ['OPENAI_API_KEY'])

    client.beta.threads.messages.create(
        thread_id=threadID,
        role="user",
        content=f"""
あなたはプロの就活アシスタントです。下記の学生の質問に対して、与えられた情報を結論を端的に回答してください。
### 必ず、添付しているinput documentsの情報を参照して回答してください。

1.「質問」
{question_with_input_documents}
"""
    )
    
    assistant_id = os.getenv("ASSISTANT_ID_CREATE_SHORT_ANSWER")
     
    run = client.beta.threads.runs.create(
        thread_id=threadID,
        assistant_id=assistant_id,
        extra_headers={"OpenAI-Beta": "assistants=v2"}
    )
    
    run_id = ""
    run_id = run.id
    
    #Runステータスがcompletedであれば次に進む
    max_attempts = 8

    for attempt in range(max_attempts):
        run_retrieve = client.beta.threads.runs.retrieve(
            thread_id=threadID,
            run_id=run_id
        )

        if run_retrieve.status == 'completed':
            print("Run is completed.(company_recommend_chatgpt)")
            break
        else:
            print("Run is still in progress...(company_recommend_chatgpt)")
            # 8秒間隔でステータスをチェック
            time.sleep(8)  
            # 最後の試行でまだ完了していない場合、メッセージを出力
        if attempt == max_attempts - 1:
            print("Maximum attempts reached. Exiting...(company_recommend_chatgpt)")
            message = "<@UECMYCL3C>要約中に、エラーが発生しました。"
            send_slack(message)
            return
    
    #message内のデータを閲覧
    messages = client.beta.threads.messages.list(
        thread_id=threadID,
        order = "asc",
        run_id=run_id,   
    )

    # 結合したいメッセージを格納するための空のリストを用意
    joined_messages = []

    for msg in messages:
        # 各メッセージを 'role:content' の形式でフォーマットし、リストに追加
        joined_messages.append(msg.content[0].text.value)

    # リスト内のメッセージを改行で結合し、1つの文字列にする
    answer = "\n".join(joined_messages)
    
    return answer


def company_recommend_with_retrieval_test_4omini(question,company_name,company_info,threadID):
    client = openai.OpenAI(api_key=os.environ['OPENAI_API_KEY'])
    
    # ThreadにLINEメッセージを格納
    client.beta.threads.messages.create(
        thread_id=threadID,
        role="user",
        content=f"""
あなたはプロの就活アシスタントです。下記の学生の質問に対して、与えられた情報を元に回答してください。
### 必ず、添付しているファイルの企業を提案してください。

1.学生からの「質問」
{question}

2.企業名
{company_name}

3.2の企業名に関する詳細情報
{company_info}
"""
    )
    
    #Assistant Name =「企業紹介」
    assistant_id = os.getenv("ASSISTANT_ID_RETRIEVAL_TEST_4omini")
     
    run = client.beta.threads.runs.create(
        thread_id=threadID,
        assistant_id=assistant_id,
        extra_headers={"OpenAI-Beta": "assistants=v2"}
    )
    run_id = ""
    run_id = run.id
    
    #Runステータスがcompletedであれば次に進む
    max_attempts = 8

    for attempt in range(max_attempts):
        run_retrieve = client.beta.threads.runs.retrieve(
            thread_id=threadID,
            run_id=run_id
        )

        if run_retrieve.status == 'completed':
            print("Run is completed.(company_recommend_chatgpt)")
            break
        else:
            print("Run is still in progress...(company_recommend_chatgpt)")
            time.sleep(8)  # 40秒間隔でステータスをチェック
        # 最後の試行でまだ完了していない場合、エラーメッセージを出力
        if attempt == max_attempts - 1:
            print("Maximum attempts reached. Exiting...(company_recommend_chatgpt)")
            message = "<@UECMYCL3C>要約中に、エラーが発生しました。"
            send_slack(message)
            return
    
    #message内のデータを閲覧
    messages = client.beta.threads.messages.list(
        thread_id=threadID,
        order = "asc",
        run_id=run_id,   
    )

    # 結合したいメッセージを格納するための空のリストを用意
    joined_messages = []

    for msg in messages:
        # 各メッセージを 'role:content' の形式でフォーマットし、リストに追加
        joined_messages.append(msg.content[0].text.value)

    # リスト内のメッセージを改行で結合し、1つの文字列にする
    res = "\n".join(joined_messages)
        
    return res
