from flask import Flask, request, jsonify
from openai import OpenAI
import json

app = Flask(__name__)

# client = OpenAI(api_key='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')

client = OpenAI(api_key='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')

MAX_MESSAGE_LENGTH = 100  # 사용자 질문 길이 제한
MAX_USER_QUERIES = 10     # 사용자별 최대 질문 횟수 제한

user_query_count = {}     # 사용자별 질문 횟수를 저장하는 딕셔너리

@app.route('/webhook', methods=['POST'])
def webhook():
    data = request.json
    user_message = data.get('textContent', {}).get('text', '')
    user_id = data.get('user', '')
    input_type = data.get('textContent', {}).get('inputType', '')

    if input_type != "typing":
        return jsonify(success=True), 200

    print(f"[사용자 {user_id}] 메시지: {user_message}")

    # 사용자별 질문 횟수 증가
    user_query_count[user_id] = user_query_count.get(user_id, 0) + 1

    # 10회 초과 질문 시 즉시 차단
    if user_query_count[user_id] > MAX_USER_QUERIES:
        response = {
            "event": "send",
            "textContent": {
                "text": "(챗봇) 질의 초과 / 9시~17시 영업시간 답변드리겠습니다."
            }
        }
        print(f"[사용자 {user_id}] 질문 횟수 초과 (현재 횟수: {user_query_count[user_id]})")
        return jsonify(response)

    # 사용자 입력 길이 초과 검사
    if len(user_message) > MAX_MESSAGE_LENGTH:
        response = {
            "event": "send",
            "textContent": {
                "text": "(챗봇) 질문이 너무 깁니다^^ 100자 이내로 짧게 다시 질문해주세요~"
            }
        }
        print(f"[사용자 {user_id}] 메시지 길이 초과 (길이: {len(user_message)})")
        return jsonify(response)

    system_prompt = """
    당신은 친절한 고객 상담 챗봇.
    정서적으로 친절하게 답함.
    규칙:
    - 답변 앞에 "(챗봇)"를 붙힘.
    - 답변은 100자 이내로 제한.
    - 배송문의:
        각 상품페이지를 보시면 확인이 가능합니다^^
        "오늘출발제품"이 아니면 영업일 기준 2~4일 소요됩니다^^

    - 매장문의:
        매장주소: 대구광역시 서구 북비산로 283-2번지
        매장엽업시간: 평일오전10시~18시, 토요일10시~13시 (공휴일, 일요일 전부 휴무)
        (당사는 매장과 물류센터 위치가 달라서 매장에 모든 제품을 구비하고 있지않음)
        (온라인 담당 CS센터 직통번호: 010-4982-2469)

    - 교환 및 반품 문의:
        네이버를 통해서 교환 및 반품 접수를 해주시면 됩니다^^ 원하시는 사이즈나 색상이 있는 경우 교환 신청 하실 때, 꼭 메모해주세요^^
        반품이나 교환은 일단 저희가 제품이 회수되는대로 제품을 확인하고 처리가 되니, 영업일 기준 신청하시고 보통 2~3일인데 최대 5일정도 생각해주셔야합니다^^
        혹시 구매확정처리를 하셨다면, 현재 봇상담으로는 불가합니다ㅠ 저희가 평일 cs담당님이 계신시간 다시 연락드리겠습니다.
        단순교환의 경우 왕복배송비가 발생합니다ㅠ
        불량교환의 경우 왕복배송비가 발생하지 않습니다! 그런데 저희가 회수 후 불량이 아닌 경우는 왕복배송비가 청구 될수있습니다.

    - 배송, 매장 문의를 제외한 모든 상담은 현재 불가하여, 다음과 같이 답한다.:
        현재는 배송안내를 제외한 상담은 불가합니다. 다른 상담은 오전9시~17시 가능합니다.

    - 개인정보, 제품과 무관한 질문, 심리테스트 요청 등은 차단.

    JSON 형식 답변:
    {
        "block": true 또는 false,
        "response": "답변내용(한글 100자 이내)"
    }
    """

    completion = client.chat.completions.create(
        model="gpt-4-turbo",
        response_format={"type": "json_object"},
        messages=[
            {"role": "system", "content": system_prompt},
            {"role": "user", "content": user_message}
        ]
    )

    reply_json = completion.choices[0].message.content.strip()
    reply_dict = json.loads(reply_json)

    if reply_dict.get('block'):
        reply_text = "(챗봇) 현재는 배송안내 외 다른 상담은 불가합니다. 다른 상담은 오전9시~17시 가능합니다."
    else:
        reply_text = reply_dict.get('response')

    usage = completion.usage
    print(f"[사용자 {user_id}] 사용 토큰수: 입력({usage.prompt_tokens}), 출력({usage.completion_tokens}), 총합({usage.total_tokens})")

    response = {
        "event": "send",
        "textContent": {
            "text": reply_text
        }
    }

    return jsonify(response)

if __name__ == '__main__':
    app.run(host='0.0.0.0', port=5000)
