from dotenv import load_dotenv

load_dotenv()  # .env 에서 OPENAI_API_KEY 로드

from langchain_community.document_loaders import TextLoader
from langchain_text_splitters import (
    CharacterTextSplitter,
    RecursiveCharacterTextSplitter,
)

documents = TextLoader("../DATA/nvme.txt", encoding="utf-8").load()

# (1) 정답
original = documents[0].page_content
print(f"원본 글자수: {len(original)}\n")

# 1) CharacterTextSplitter — 단순히 정해진 separator 로 나누기
char_splitter = CharacterTextSplitter(
    separator="\n\n",     # 목표는 빈 줄 기준
    chunk_size=500,       # 최대 500글자로 합침 (넘치지 않게)
    chunk_overlap=100,    # 이전과 겹치게
)
chunks_char = char_splitter.split_documents(documents)
print(f"[CharacterTextSplitter] {len(chunks_char)} 청크")

# 2) RecursiveCharacterTextSplitter — 여러 separator 를 순서대로 시도
# (\n\n → \n → 공백 → 글자 순). 가장 권장되는 일반용 splitter.
recur_splitter = RecursiveCharacterTextSplitter(
    chunk_size=500,
    chunk_overlap=100,
)
chunks_recur = recur_splitter.split_documents(documents)
print(f"[RecursiveCharacterTextSplitter] {len(chunks_recur)} 청크")

# (2) 정답
# 3) Token 기반 — tiktoken 으로 실제 토큰 수 기준 (OpenAI 모델 호환)
#   ※ pip install tiktoken
token_splitter = RecursiveCharacterTextSplitter.from_tiktoken_encoder(
    chunk_size=200,        # 토큰 단위!
    chunk_overlap=50,
)
chunks_token = token_splitter.split_documents(documents)
print(f"[tiktoken 기반] {len(chunks_token)} 청크")

# (3) 정답 — split_documents 가 원본 metadata 를 각 청크에 그대로 물려주는지 확인
ssd_docs = TextLoader("../DATA/ssd.txt", encoding="utf-8").load()
print(f"원본 Document 수: {len(ssd_docs)}")

splitter = RecursiveCharacterTextSplitter(
    chunk_size=500,
    chunk_overlap=100,
)
chunks = splitter.split_documents(ssd_docs)
print(f"청킹 후 Document 수: {len(chunks)}\n")

first = chunks[0]
print("metadata:")
print(first.metadata)
