# ============================================================
# [실습] 2단계: 문서 1개 업로드 + RAG  (= 01 + 업로드·검색)
#
# 01 의 chain 은 그대로 두고, 프롬프트에 [문서] 자리를 더한다.
#   업로드: 저장 → 로드(파싱) → 청킹 → 임베딩 → 벡터스토어
#   질의  : 검색 → 그 내용을 {context} 로 chain 에 끼워 답변
#
# 실행:  python 02_upload_rag_실습.py   →   http://localhost:5000
#
# 구현 항목:
#  1) prompt 에 "[문서]\n{context}\n\n[질문] {question}" 자리를 넣고 chain 구성
#  2) /upload : (pdf/txt) 로더 → 청킹 → store.add_documents
#  3) /ask    : similarity_search(k=3) → context → chain.invoke({context, question})
# ============================================================

import os
from flask import Flask, request, jsonify, send_from_directory
from langchain_openai import ChatOpenAI, OpenAIEmbeddings
from langchain_core.prompts import ChatPromptTemplate
from langchain_core.output_parsers import StrOutputParser
from langchain_core.vectorstores import InMemoryVectorStore
from langchain_community.document_loaders import PyPDFLoader, TextLoader
from langchain_text_splitters import RecursiveCharacterTextSplitter
from dotenv import load_dotenv

load_dotenv()
app = Flask(__name__)
UPLOAD_DIR = "uploads"
os.makedirs(UPLOAD_DIR, exist_ok=True)

llm = ChatOpenAI(model="gpt-4o-mini", temperature=0)
# 1) 여기에 코드를 작성하세요 (prompt + chain — system 은 '문서 근거로만 답', human 은 [문서]/[질문])

store = InMemoryVectorStore(OpenAIEmbeddings(model="text-embedding-3-small"))


@app.get("/")
def index():
    return send_from_directory(app.static_folder, "02.html")


@app.post("/upload")
def upload():
    file = request.files.get("file")
    if not file or not file.filename:
        return jsonify({"error": "파일이 없습니다"}), 400
    path = os.path.join(UPLOAD_DIR, file.filename)
    file.save(path)
    # 2) 여기에 코드를 작성하세요
    #    ext 로 PyPDFLoader/TextLoader 선택 → RecursiveCharacterTextSplitter 로 청킹 → store.add_documents
    return jsonify({"message": f"'{file.filename}' 업로드 완료"})


@app.post("/ask")
def ask():
    question = request.json["question"]
    # 3) 여기에 코드를 작성하세요
    #    hits = store.similarity_search(question, k=3) → context 만들기 → chain.invoke({context, question})
    pass


if __name__ == "__main__":
    app.run(debug=True, port=5000)
