import os
import openai
from openai import OpenAI
import time
import openai
import anthropic
from pydantic import BaseModel, Field
from typing import Dict, List
import os
from dotenv import load_dotenv

load_dotenv()
client = openai.OpenAI(api_key=os.environ['OPENAI_API_KEY'])

def generate_related_topics(user_topic, num_topics=5):
    prompt = f"""
ユーザーが「{user_topic}」に関心を持っています。これに関連した別の興味深いトピックや、続けて調べたくなるような問いかけを{num_topics}個、列挙してください。
各トピックはユーザーが次に検索したくなるような質問文、または関連キーワードの形式で出力してください。
"""

    response = openai.ChatCompletion.create(
        model="gpt-3.5-turbo",  # 適宜モデルを選択
        messages=[{"role": "user", "content": prompt}],
        max_tokens=200,
        temperature=0.7
    )

    text = response.choices[0].message.content.strip()
    topics = [line.strip() for line in text.split("\n") if line.strip()]
    return topics


#就活軸の作成
def get_topics(threadID, user_topic, num_topics = 3):
    client = openai.OpenAI(api_key=os.environ['OPENAI_API_KEY'])
    
    # ThreadにLINEメッセージを格納
    client.beta.threads.messages.create(
        thread_id=threadID,
        role="user",
        content=f"""
ユーザーが「{user_topic}」に関心を持っています。これに関連した別の興味深いトピックや、続けて調べたくなるような問いかけを{num_topics}個、列挙してください。
各トピックはユーザーが次に検索したくなるような質問文、または関連キーワードの形式で出力してください。
"""
    )

    assistant_id = os.getenv("ASSISTANT_ID_CREATE_QUESTION")
    print(assistant_id)
    
    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ステータスが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.")
            break
        else:
            print("Run is in progress.")
            time.sleep(8)
        # 最後の試行でまだ完了していない場合、メッセージを出力
        if attempt == max_attempts - 1:
            print("Maximum attempts reached. Exiting..")
            return
   
    #message内のデータを閲覧
    time.sleep(4)
    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 get_typical_topics(user_question, num_topics=5):
    
    class TypicalQuestions(BaseModel):
        typical_question: str = Field(description="関連トピックに関する短い質問やトピック（10~20文字程度）")

    class TypicalQuestionsArray(BaseModel):
        typical_questions: List[TypicalQuestions]
    
    # 学生が就活時に関心を持ちそうな関連テーマを指定
    prompt = f"""
あなたは就活アドバイザーとして、学生が「{user_question}」について関心を持っているとき、
その裏にあるインサイトを深掘りできる問いかけを提案します。

【出力要件】
- 合計で{num_topics}個の要素を出力する。
- 各要素は 10~20文字程度の短い日本語フレーズで、最後は必ず「〜な企業を教えて」として終わる質問文とする。
- {user_question}に関して、学生が本当に知りたい、より深いインサイトを引き出すような問いかけにすること。

【考え方の例】
学生の質問例：「年収の高い企業を教えて」
裏にあるインサイト：『将来のキャリアアップや経済的安定性に関心がある』

より深い問いかけ例：  
「30代で昇給が著しい企業を教えて」
「女性管理職が多い企業を教えて」
「海外駐在機会の豊富な企業を教えて」
…といった形で、単に年収でなく、その背景となるキャリアアップ、働きやすさ、成長性などの角度から深掘りする。

【注意点】
- 必ず「…な企業を教えて」というフレーズで終わる。
- 質問の長さは20文字未満程度で。
- 必ず学生の視点で、なぜそれを知りたいのか（裏インサイト）を踏まえた質問を作成。
"""

    completion = client.beta.chat.completions.parse(
        model="gpt-4o",
        messages=[{"role": "user", "content": prompt}],
        response_format=TypicalQuestionsArray,
    )

    response = completion.choices[0].message.parsed
    assert isinstance(response, TypicalQuestionsArray)
    
    return response

  

# 例
# client = OpenAI(api_key="sk-proj-anEGzmaO0Y7NUCqbp5JuT3BlbkFJFHM6zRlsJM6Natbbnvro")
# thread = client.beta.threads.create()
# threadID = thread.id
user_question = "エンジニアとして働ける企業を教えて。"
related = get_typical_topics(user_question, num_topics = 5)
print(related)