# ============================================================
# [실습] Agentic RAG: 검색 판단과 재시도 루프
#
# (개념) 고정 RAG 는 무조건 검색한다(낭비). 에이전트는 '검색이 필요한가'부터 판단한다.
# create_agent 없이, 평범한 if/for/break 로 'agentic 흐름'을 직접 짠다. 각 단계를 print 한다.
#
# 아래 항목을 직접 구현하세요:
#  1) needs_retrieval(question): 검색 필요 여부를 YES/NO 로 묻고 bool 반환.
#     (회사·제품 등 고유 정보가 필요하면 YES, 일반 상식/계산은 NO 로 유도)
#  2) rewrite_query(question, prev_query): 검색용 쿼리 재작성 (이전 쿼리 있으면 다른 각도로).
#  3) is_sufficient(question, docs): 결과가 충분한지 SUFFICIENT/INSUFFICIENT 로 묻고 bool 반환.
#  4) answer(question): 검색 불필요면 곧장 답. 필요하면 [재작성→검색→평가] 루프 후 답한다.
# ============================================================

from dotenv import load_dotenv
from langchain_openai import ChatOpenAI, OpenAIEmbeddings
from langchain_core.messages import HumanMessage, SystemMessage
from langchain_core.documents import Document
from langchain_text_splitters import RecursiveCharacterTextSplitter
from langchain_chroma import Chroma

load_dotenv()
llm = ChatOpenAI(model="gpt-4o-mini", temperature=0)
MAX_TRIES = 2

# LLM 이 '스스로는 모르는' 사내 전용 내용 → 검색이 꼭 필요해진다
sample_docs = [
    Document(page_content="우리 회사의 배포 도구 'DeployX' 는 매주 화요일 새벽 2시에 자동 배포를 수행한다."),
    Document(page_content="DeployX 롤백은 'dx rollback <버전>' 명령으로 약 1분 내에 이전 버전으로 복구한다."),
    Document(page_content="우리 회사의 코드 리뷰 규정: PR 은 최소 2명 승인과 'ready' 라벨이 있어야 머지된다."),
    Document(page_content="우리 회사의 사내 VPN 은 2단계 인증(OTP) 후에만 접속할 수 있다."),
]
splits = RecursiveCharacterTextSplitter(chunk_size=200, chunk_overlap=50).split_documents(sample_docs)
store = Chroma.from_documents(splits, embedding=OpenAIEmbeddings(model="text-embedding-3-small"),
                             collection_name="agentic_practice")
retriever = store.as_retriever(search_kwargs={"k": 3})


def needs_retrieval(question: str) -> bool:
    # 1) 여기에 코드를 작성하세요
    pass


def rewrite_query(question: str, prev_query) -> str:
    # 2) 여기에 코드를 작성하세요
    pass


def is_sufficient(question: str, docs: list[str]) -> bool:
    # 3) 여기에 코드를 작성하세요
    pass


def answer(question: str) -> str:
    # 4) 여기에 코드를 작성하세요 (판단/재작성/검색/평가 단계를 print 로 보여 주기)
    pass


if __name__ == "__main__":
    print("[답변]", answer("DeployX 롤백은 어떻게 해?"))
    print()
    print("[답변]", answer("2 + 2 는?"))
    store.delete_collection()
