import os
import sys
from dotenv import load_dotenv
sys.path.append(os.path.abspath(os.path.join(os.path.dirname(__file__), '..', '..')))
from services.rag.retrieval.retrieval import retreive_job_id_and_documents, retreive_company_info_by_id
from services.rag.retrieval.rerank import rerank
from services.ai_services.structured_outputs.structured_outputs import get_recommend_company_ids,get_recommend_company_ids_haiku
from typing import List, Dict
from services.ai_services.openai.chatgpt import create_rag_answer, create_rag_short_answer
import openai

load_dotenv()

class RecommendReason:
    def __init__(self, job_id: int, recommend_reason: str):
        self.job_id = job_id
        self.recommend_reason = recommend_reason

#retreive結果に対して、リランクを実施
def rag_and_rerank(question):
    response_data = retreive_job_id_and_documents(question)
    json_string = response_data["response"]
    input_documents = [item["input_documents"] for item in json_string]
    rerank(question,input_documents,score_threshold=-10.0)
    
# 変換処理・json形式
def transform_data(companies: List[RecommendReason]) -> Dict:

    recommend_company_info_array = []
                    
    for company_tuple in companies:
        # タプルの2番目の要素（リスト）を取得
        company_list = company_tuple[1]

        # 各 RecommendReason オブジェクトの company_name を順番に出力
        for company in company_list:
            recommend_company_info_array.append({
                "job_id": f"{company.job_id}","input_documents": f"{company.recommend_reason}"
            })
                
    return {
        "status": 200,
        "response": recommend_company_info_array
    }

#Retreiveを実施→ChatGPTで精査→StructuredOutputsでデータ加工
def retreive_and_generation(question):
    response_data = retreive_job_id_and_documents(question)
    
    company_features = response_data["response"]
    response = get_recommend_company_ids(question, company_features)
    job_id_and_input_documents = transform_data(response)

    return job_id_and_input_documents


#input「求人ID」「求人名」「質問」に対して、回答を生成
def create_answer_4o(job_id, question):
    #質問から、該当するinput documentsを取得
    question_with_input_documents = retreive_company_info_by_id(job_id, question, model="text-embedding-3-small")

    client = openai.OpenAI(api_key=os.environ['OPENAI_API_KEY'])
    new_threadID = client.beta.threads.create()
    threadID = new_threadID.id
    
    #inputdocumentsを含む質問から回答を生成
    answer = create_rag_answer(question_with_input_documents, threadID)
    response_data = {
        "status": 200,
        "response": answer
    }
    return response_data

#各求人ページのチャットボット内の回答生成
def create_short_answer_4o(job_id, question):
    #質問から、該当するinput documentsを取得
    question_with_input_documents = retreive_company_info_by_id(job_id, question, model="text-embedding-3-small")

    client = openai.OpenAI(api_key=os.environ['OPENAI_API_KEY'])
    new_threadID = client.beta.threads.create()
    threadID = new_threadID.id
    
    #inputdocumentsを含む質問から回答を生成
    answer = create_rag_short_answer(question_with_input_documents, threadID)
    response_data = {
        "status": 200,
        "response": answer
    }
    return response_data
