import os
from openai import OpenAI
from dotenv import load_dotenv

load_dotenv()  # .env 를 자동 탐색(현재 폴더부터 상위로)해 OPENAI_API_KEY 로드
client = OpenAI(api_key=os.getenv('OPENAI_API_KEY'))

# --- messages 로 대화 이력 누적하기 ---
# 대화 누적 리스트 — system 메시지로 시작한다.
messages = [
    {'role': 'system', 'content': '당신은 친절한 AI 도우미입니다.'},
]


def chat(user_input):
    # 1) 정답
    # 1) 사용자 메시지를 리스트에 추가
    messages.append({'role': 'user', 'content': user_input})

    # 2) 지금까지의 '전체 대화'를 보낸다
    response = client.chat.completions.create(
        model='gpt-4o-mini',
        messages=messages,
    )
    answer = response.choices[0].message.content

    # 3) 모델의 답변도 assistant 역할로 추가 → 다음 턴에서 기억된다
    messages.append({'role': 'assistant', 'content': answer})
    return answer


# --- 대화 이력 길이 관리 ---
MAX_HISTORY_LENGTH = 10


def trim_history(history):
    # 2) 정답
    # 대화 히스토리 길이 관리: 오래된 대화부터 삭제
    # ⚠️ pop(0) 으로 지우면 0번 system 프롬프트가 먼저 삭제돼 챗봇이 역할을 잊는다.
    #    → system(0번)은 보존하고, 그 뒤(1번=가장 오래된 대화)부터 지운다.
    while len(history) > MAX_HISTORY_LENGTH:
        history.pop(1)
    return history


# --- Temperature 등 파라미터 조절 ---
temperature = 0.7  # 0.0 (정확·일관) / 1.5 (창의·다양)

# 3) 정답
response = client.chat.completions.create(
    model='gpt-4o-mini',
    messages=[
        {'role': 'system', 'content': '당신은 친절한 AI 도우미입니다.'},
        {'role': 'user', 'content': '인공지능을 한 문장으로 설명해줘.'},
    ],
    temperature=temperature,  # 창의성 (0.0 정확 ~ 2.0 창의)
    max_tokens=100,           # 응답의 최대 토큰 수
    top_p=0.9,                # 확률 상위 토큰만 선택 (0.0 ~ 1.0)
    frequency_penalty=0.5,    # 같은 단어 반복 억제 (-2.0 ~ 2.0)
    presence_penalty=0.6,     # 새로운 주제 도입 장려 (-2.0 ~ 2.0)
)


if __name__ == '__main__':
    # 멀티턴: 앞 대화를 기억하는지 확인
    print('[멀티턴 대화]')
    print('사용자: 내 이름은 홍길동이야.')
    print('AI:', chat('내 이름은 홍길동이야.'))
    print('사용자: 내 이름이 뭐라고 했지?')
    print('AI:', chat('내 이름이 뭐라고 했지?'))

    # 파라미터를 적용한 응답
    print('\n[Temperature 0.7 응답]')
    print(response.choices[0].message.content)
