import streamlit as st
from streamlit_chat import message
import base64
import json
import http.client
import ssl
import requests
import re

class CompletionExecutor:
    def __init__(self, host, api_key, request_id):
        self._host = host
        self._api_key = api_key
        self._request_id = request_id

    def execute(self, completion_request):
        headers = {
            'Authorization': self._api_key,
            'X-NCP-CLOVASTUDIO-REQUEST-ID': self._request_id,
            'Content-Type': 'application/json; charset=utf-8'
        }
        response = requests.post(self._host + '/v3/chat-completions/HCX-005',headers=headers, json=completion_request, stream=True)
        try:
           json_data = json.loads(response.text)
           print("JSON parsing successful.")
        except json.JSONDecodeError as e:
           print("JSON parsing failed:", e)

        return json_data['result']['message']['content']

st.title("HyperCLOVA X를 활용한 이메일 작성✉️")

with st.sidebar:
  st.sidebar.title('⚙️파라미터 설정값 조정')
  topP_value = st.slider('Select top P', 0.0, 1.0,0.8)
  topK_value = st.slider('Select top K', 0, 128,0)
  token_value = st.slider('Select maximum tokens?', 0, 4096,300)
  temperature_value = st.slider('Select Temperature', 0.0, 1.0,0.3)
  repeatPenalty_value = st.slider('Select Temperature', 0.0, 10.0,5.0)

if 'generated' not in st.session_state:
    st.session_state['generated'] = []

if 'past' not in st.session_state:
    st.session_state['past'] = []

with st.form('form', clear_on_submit=True):
    user_input = st.text_area('You: ', '', key='input',height=200)
    submitted = st.form_submit_button('Send')
    if submitted and user_input:
        with st.spinner("Waiting for HyperCLOVA..."):

            completion_executor = CompletionExecutor(
                host='https://clovastudio.stream.ntruss.com',
                api_key='Bearer <각자의 api키값>',
                request_id='1ecd7eaadf06431e92f647ff4d47a0f6'
            )

            preset_text = [{"role":"system","content":"- 키워드를 포함하여 이메일 내용을 생성합니다. \r\n- 메일 제목과 본문 내용을 출력합니다. \r\n- 아>래 예제와 유사한 포맷으로 작성합니다. \r\n- 예제 \r\n키워드: \r\n* 주제: 업무 협조 \r\n* 요구사항: 요청하신 내용으로 작업했습니다. 확인해주세요. \r\n* >발신자: 임소희 \r\n* 수신인: 최주희 \r\n제목: 작업 내용 확인 \r\n메일: 안녕하세요 최주희님, 저희 회사에서 진행하고 있는 프로젝트에 대해 말씀드리려고 합>니다. \r\n현재 개발중인 웹사이트가 있는데 혹시 괜찮으시다면 디자인 시안을 한번 봐주실 수 있을까요? \r\n가능하시다면 오늘 오후 3시쯤 뵙고 싶습니다. \r\n>감사합니다. \r\n임소희 드림\r"},{"role":"user","content":user_input}]
            request_data = {
                'messages': preset_text,
                'topP': topP_value,
                'topK': topK_value,
                'maxTokens': token_value,
                'temperature': temperature_value,
                'repeatPenalty': repeatPenalty_value,
                'stopBefore': [],
                'includeAiFilters': True,
                'seed': 0
            }

            response_text=completion_executor.execute(request_data)
            st.session_state.past.append(user_input)
            st.session_state.generated.append(response_text)

    if st.session_state['generated']:
        for i in range(len(st.session_state['generated'])-1, -1, -1):
            message(st.session_state['past'][i], is_user=True, key=str(i) + '_user')
            message(st.session_state["generated"][i], key=str(i))
