from qa_amend import QAService, match_query, store_data
from fastapi import FastAPI, HTTPException
from pydantic import BaseModel
import json
import os
import logging
import time
import requests

app = FastAPI()
kb_name = 'my_kb_test'
device = None
qa_service = QAService(kb_name, device)

logging.basicConfig(filename=r'E:\Project\BGE\virtual_patient_qa\app.log', level=logging.INFO)

class QuestionRequest(BaseModel):
    question: str

class QuestionResponse(BaseModel):
    code: int
    msg: str
    data: list

class QuestionItem(BaseModel):
    questionCode: str
    questionList: list[str]

@app.post("/updateDatabase")
async def save_to_json(question_items: list[QuestionItem]):
    try:
        json_data = json.dumps([item.dict() for item in question_items], ensure_ascii=False, indent=2)

        with open("output.json", "w", encoding="utf-8") as file:
            file.write(json_data)
            file.close()  # 确保文件被关闭

        if store_data("output.json"):
            os.remove("output.json")  # 删除文件
            return {"status": "success", "message": "数据更新成功"}
        else:
            return {"status": "failure", "message": "数据未更新"}

    except Exception as e:
        raise HTTPException(status_code=500, detail=f"Internal Server Error: {str(e)}")

@app.post("/matchQuestion")
def match_question(request: QuestionRequest):
    try:
        query = request.question
        top_k = 3
        score_threshold = 0.1

        result = match_query(qa_service, query, top_k, score_threshold)
        response = QuestionResponse(code=200, msg="success", data=result)

        return response

    except Exception as e:
        logging.error(f"Error in /matchQuestion: {str(e)}")
        raise HTTPException(status_code=500, detail=str(e))

def query_and_write_to_file(api_url, output_file_path):
    try:
        response = requests.get(api_url)
        response_data = response.json()

        if response.status_code == 200 and response_data["code"] == 200:
            question_items = response_data["data"]

            with open(output_file_path, "w", encoding="utf-8") as file:
                json.dump(question_items, file, ensure_ascii=False, indent=2)
                file.close()  # 确保文件被关闭

            logging.info(f"Data written to {output_file_path}")

            if store_data(output_file_path):
                os.remove(output_file_path)  # 删除文件
                return {"status": "success", "message": "数据初始化更新成功"}
            else:
                return {"status": "failure", "message": "数据初始化更新失败"}
        else:
            logging.error(f"接口调用失败:{response_data['msg']}")
            return False
    except Exception as e:
        logging.error(f"发生错误:{str(e)}")
        return False

api_url = "http://192.168.10.73:8891/virtual-patient-manage/qaKnowledge/queryQaKnowledge"
output_file_path = "output.json"
query_and_write_to_file(api_url, output_file_path)

if __name__ == "__main__":
    import uvicorn

    uvicorn.run(app, host="0.0.0.0", port=8000)