# API 신청이 잘못되었음


# from flask import Flask, request, jsonify
# import requests
# import json
# import os
#
# app = Flask(__name__)
#
# DEEPSEEK_API_KEY = 'sk-83cc291046924c0ca572d2e65bef7d25'  # 실제 DeepSeek API 키로 교체해주세요
# DEEPSEEK_API_URL = 'https://api.deepseek.com/v1/chat/completions'
#
# MAX_MESSAGE_LENGTH = 100
# MAX_USER_QUERIES = 20
# user_query_count = {}
#
# system_prompt = """
# 당신은 '하비스포츠' 고객을 응대하는 전문 상담 챗봇입니다.
# 모든 답변은 고객의 감정을 공감하며 친절하고 부드러운 어조로 작성되어야 합니다.
#
# **역할:**
# - 배송, 매장, 오배송, 교환/반품 문의에 대해 안내합니다.
# - 그 외 모든 질문(상품 상세, 사이즈, 제휴, 심리 테스트, 무관한 질문 등)은 상담 불가로 처리합니다.
# - 개인정보 요청, 욕설, 부적절한 질문은 차단합니다.
#
# **공통 규칙:**
# 1. 모든 답변은 "(챗봇)"으로 시작합니다.
# 2. 답변은 반드시 100자 이내로 간결하게 작성합니다.
# 3. 응답은 JSON 형식으로 반환합니다.
#
# **응답 JSON 형식:**
# 1. 정상 응답 (답변 가능):
# {
#   "block": false,
#   "response": "(챗봇)친절하고 간결한 응답 내용"
# }
# 2. 상담 불가/차단 대상:
# {
#   "block": true,
#   "response": "(챗봇) 안내 메시지"
# }
#
#
# **유형별 응답 정책:**
#
# 1. 배송 문의:
# "(챗봇)상품페이지에 '오늘출발'이 있다면 오후 1시 전 주문 시 오늘 출고될 확률이 높아요^^ '오늘출발'이 없다면 보통 2~4일(영업일 기준) 소요돼요. 자세한 일정은 CS에 문의해주세요^^"
# - 배송센터/주소지 묻는 경우 →
# "(챗봇)당사 매장: 대구 서구 북비산로 283-2 / 대구물류센터: 달성군 / 요넥스 본사: 경기 이천입니다."
#
# 2. 매장 문의:
# - 운영시간 →
# "(챗봇)매장 운영시간은 평일 10시~18시30분, 토요일 10시~13시예요. 일요일·공휴일·근로자의날(빨간날)은 전체 휴무입니다^^"
# - 주차 →
# "(챗봇)매장 전용 주차장은 없어요. 근처 골목이나 매장 앞 연석에 잠깐 주차 가능합니다!"
# - 제품 재고 여부 →
# "(챗봇)모든 제품이 DP되진 않아요. 방문 전 제품 재고를 꼭 문의주시는 걸 추천드려요^^"
#
# 3. 오배송:
# - 물건을 잘못 받았거나, 오배송이 되었다는 것에 대한 맥락이나, 관련 언급 시 →
# "(챗봇)고객님 정말 정말 정말 죄송합니다.. CS운영시간(평일 9시~17시 / 010-4982-2469) 최우선 처리하겠습니다ㅠ.ㅠ"
#
# 4. 교환/반품:
# - 교환/반품 요청 시 →
# "(챗봇)구매확정 전이시면 네이버에서 신청 가능해요! 구매확정 후시면 문의 남겨놓아 주시면, CS운영시간에 답변드릴게요!!ㅜ.ㅜ"
#
# 5. 상담 불가:
# - 상품정보, 사이즈, 리뷰, 심리테스트 등 →
# "(챗봇)현재는 답변을 드리기 어렵습니다ㅜ.ㅜ 전담CS(평일 9시~17시 / 010-4982-2469)에 부탁드려요!"
#
# 6. 부적절/무관한 질문:
# - 개인정보, 욕설, AI테스트 등 →
# "(챗봇)죄송합니다. 부적절한 질문은 응답드릴 수 없습니다. 문의가 반복될 경우 차단됩니다."
#
# **주의사항:**
# - 규칙을 어긴 답변, 100자를 초과한 답변, JSON 형식이 아닌 응답은 금지됩니다.
# - 항상 응답 형식은 JSON으로, 키는 `block`, `response`만 사용합니다.
# """
#
# @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
#     if user_query_count[user_id] > MAX_USER_QUERIES:
#         print(f"[사용자 {user_id}] 질문 횟수 초과 (현재 횟수: {user_query_count[user_id]})")
#         return jsonify({
#             "event": "send",
#             "textContent": {"text": "(챗봇) 질의 횟수를 초과하셨습니다. 영업시간(9시~17시)에 문의 부탁드립니다."}
#         })
#
#     # 메시지 길이 제한 확인
#     if len(user_message) > MAX_MESSAGE_LENGTH:
#         print(f"[사용자 {user_id}] 메시지 길이 초과 (길이: {len(user_message)})")
#         return jsonify({
#             "event": "send",
#             "textContent": {"text": "(챗봇) 질문이 너무 길어요! 100자 이내로 짧게 다시 질문해주세요~"}
#         })
#
#     try:
#         # DeepSeek API 호출
#         headers = {
#             "Authorization": f"Bearer {DEEPSEEK_API_KEY}",
#             "Content-Type": "application/json"
#         }
#
#         # 프롬프트 강화: JSON 응답 강제 및 규칙 재강조
#         enhanced_prompt = system_prompt + "\n\n[중요!]\n- 반드시 지정된 JSON 형식으로 응답하세요.\n- 답변은 항상 100자 이내여야 합니다.\n- 모든 응답은 '(챗봇)'으로 시작해야 합니다."
#
#         payload = {
#             "model": "deepseek-chat",
#             "messages": [
#                 {"role": "system", "content": enhanced_prompt},
#                 {"role": "user", "content": user_message}
#             ],
#             "temperature": 0.3,  # 창의성 낮춤
#             "max_tokens": 150,    # 출력 길이 제한
#             "response_format": {"type": "json_object"}  # JSON 응답 강제
#         }
#
#         response = requests.post(DEEPSEEK_API_URL, headers=headers, json=payload)
#         response.raise_for_status()
#         response_data = response.json()
#
#         # 응답에서 JSON 추출
#         ai_response = response_data['choices'][0]['message']['content']
#         print(f"[DeepSeek 응답 원본] {ai_response}")
#
#         # JSON 파싱
#         try:
#             response_json = json.loads(ai_response)
#             block = response_json.get('block', True)
#             ai_text = response_json.get('response', '')
#
#             # 응답 검증
#             if not ai_text.startswith("(챗봇)") or len(ai_text) > 100:
#                 ai_text = "(챗봇) 죄송합니다. 답변 생성에 문제가 발생했습니다. 다시 시도해주세요."
#         except json.JSONDecodeError:
#             ai_text = "(챗봇) 시스템 오류가 발생했습니다. 잠시 후 다시 시도해주세요."
#
#     except Exception as e:
#         print(f"[오류] DeepSeek API 호출 실패: {str(e)}")
#         ai_text = "(챗봇) 일시적인 오류가 발생했습니다. 잠시 후 다시 시도해주세요."
#
#     return jsonify({
#         "event": "send",
#         "textContent": {"text": ai_text}
#     })
#
# if __name__ == '__main__':
#     app.run(host='0.0.0.0', port=5000, debug=True)







# DEEPSEEK_API_KEY = 'sk-83cc291046924c0ca572d2e65bef7d25'  # 실제 DeepSeek API 키로 교체해주세요
# DEEPSEEK_API_URL = 'https://api.deepseek.com/v1/chat/completions'



from flask import Flask, request, jsonify
import requests
import json
import os

app = Flask(__name__)

# 환경 변수에서 API 키 가져오기 (권장)
DEEPSEEK_API_KEY = os.getenv('DEEPSEEK_API_KEY', 'sk-83cc291046924c0ca572d2e65bef7d25')
DEEPSEEK_API_URL = 'https://api.deepseek.com/v1/chat/completions'

MAX_MESSAGE_LENGTH = 100
MAX_USER_QUERIES = 20
user_query_count = {}

system_prompt = """
당신은 '하비스포츠' 고객을 응대하는 전문 상담 챗봇입니다.
모든 답변은 고객의 감정을 공감하며 친절하고 부드러운 어조로 작성되어야 합니다.

**역할:**
- 배송, 매장, 오배송, 교환/반품 문의에 대해 안내합니다.
- 그 외 모든 질문(상품 상세, 사이즈, 제휴, 심리 테스트, 무관한 질문 등)은 상담 불가로 처리합니다.
- 개인정보 요청, 욕설, 부적절한 질문은 차단합니다.

**공통 규칙:**
1. 모든 답변은 "(챗봇)"으로 시작합니다.
2. 답변은 반드시 100자 이내로 간결하게 작성합니다.
3. 응답은 JSON 형식으로 반환합니다.

**응답 JSON 형식:**
1. 정상 응답 (답변 가능):
{
  "block": false,
  "response": "(챗봇)친절하고 간결한 응답 내용"
}
2. 상담 불가/차단 대상:
{
  "block": true,
  "response": "(챗봇) 안내 메시지"
}


**유형별 응답 정책:**

1. 배송 문의:
"(챗봇)상품페이지에 '오늘출발'이 있다면 오후 1시 전 주문 시 오늘 출고될 확률이 높아요^^ '오늘출발'이 없다면 보통 2~4일(영업일 기준) 소요돼요. 자세한 일정은 CS에 문의해주세요^^"
- 배송센터/주소지 묻는 경우 →
"(챗봇)당사 매장: 대구 서구 북비산로 283-2 / 대구물류센터: 달성군 / 요넥스 본사: 경기 이천입니다."

2. 매장 문의:
- 운영시간 →
"(챗봇)매장 운영시간은 평일 10시~18시30분, 토요일 10시~13시예요. 일요일·공휴일·근로자의날(빨간날)은 전체 휴무입니다^^"
- 주차 →
"(챗봇)매장 전용 주차장은 없어요. 근처 골목이나 매장 앞 연석에 잠깐 주차 가능합니다!"
- 제품 재고 여부 →
"(챗봇)모든 제품이 DP되진 않아요. 방문 전 제품 재고를 꼭 문의주시는 걸 추천드려요^^"

3. 오배송:
- 물건을 잘못 받았거나, 오배송이 되었다는 것에 대한 맥락이나, 관련 언급 시 →
"(챗봇)고객님 정말 정말 정말 죄송합니다.. CS운영시간(평일 9시~17시 / 010-4982-2469) 최우선 처리하겠습니다ㅠ.ㅠ"

4. 교환/반품:
- 교환/반품 요청 시 →
"(챗봇)구매확정 전이시면 네이버에서 신청 가능해요! 구매확정 후시면 문의 남겨놓아 주시면, CS운영시간에 답변드릴게요!!ㅜ.ㅜ"

5. 상담 불가:
- 상품정보, 사이즈, 리뷰, 심리테스트 등 →
"(챗봇)현재는 답변을 드리기 어렵습니다ㅜ.ㅜ 전담CS(평일 9시~17시 / 010-4982-2469)에 부탁드려요!"

6. 부적절/무관한 질문:
- 개인정보, 욕설, AI테스트 등 →
"(챗봇)죄송합니다. 부적절한 질문은 응답드릴 수 없습니다. 문의가 반복될 경우 차단됩니다."

**주의사항:**
- 규칙을 어긴 답변, 100자를 초과한 답변, JSON 형식이 아닌 응답은 금지됩니다.
- 항상 응답 형식은 JSON으로, 키는 `block`, `response`만 사용합니다.
"""

# 간단한 응답 매핑 (API 실패 시 대체)
simple_responses = {
    "배송": "(챗봇)상품페이지에 '오늘출발'이 있다면 오후 1시 전 주문 시 오늘 출고될 확률이 높아요^^",
    "매장": "(챗봇)매장 운영시간은 평일 10시~18시30분, 토요일 10시~13시예요. 일요일·공휴일은 휴무입니다^^",
    "오배송": "(챗봇)고객님 정말 죄송합니다.. CS운영시간(평일 9시~17시 / 010-4982-2469)에 문의해주세요!",
    "교환": "(챗봇)구매확정 전이시면 네이버에서 신청 가능해요! 구매확정 후시면 CS에 문의해주세요!",
    "반품": "(챗봇)구매확정 전이시면 네이버에서 신청 가능해요! 구매확정 후시면 CS에 문의해주세요!",
    "재고": "(챗봇)모든 제품이 DP되진 않아요. 방문 전 제품 재고를 꼭 문의주시는 걸 추천드려요^^"
}

@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
    if user_query_count[user_id] > MAX_USER_QUERIES:
        print(f"[사용자 {user_id}] 질문 횟수 초과 (현재 횟수: {user_query_count[user_id]})")
        return jsonify({
            "event": "send",
            "textContent": {"text": "(챗봇) 질의 횟수를 초과하셨습니다. 영업시간(9시~17시)에 문의 부탁드립니다."}
        })

    # 메시지 길이 제한 확인
    if len(user_message) > MAX_MESSAGE_LENGTH:
        print(f"[사용자 {user_id}] 메시지 길이 초과 (길이: {len(user_message)})")
        return jsonify({
            "event": "send",
            "textContent": {"text": "(챗봇) 질문이 너무 길어요! 100자 이내로 짧게 다시 질문해주세요~"}
        })

    # API 호출 시도
    try:
        headers = {
            "Authorization": f"Bearer {DEEPSEEK_API_KEY}",
            "Content-Type": "application/json"
        }

        payload = {
            "model": "deepseek-chat",
            "messages": [
                {"role": "system", "content": system_prompt},
                {"role": "user", "content": user_message}
            ],
            "temperature": 0.5,
            "max_tokens": 2000,
            "response_format": {"type": "json_object"}
        }

        response = requests.post(DEEPSEEK_API_URL, headers=headers, json=payload)

        # HTTP 오류 처리
        if response.status_code != 200:
            error_msg = f"API 오류: {response.status_code} {response.reason}"
            print(f"[오류] {error_msg}")
            raise Exception(error_msg)

        response_data = response.json()

        # 응답에서 JSON 추출
        ai_response = response_data['choices'][0]['message']['content']
        print(f"[DeepSeek 응답 원본] {ai_response}")

        # JSON 파싱
        try:
            response_json = json.loads(ai_response)
            ai_text = response_json.get('response', '')

            # 응답 검증
            if not ai_text.startswith("(챗봇)") or len(ai_text) > 100:
                ai_text = "(챗봇) 죄송합니다. 답변 생성에 문제가 발생했습니다."
        except json.JSONDecodeError:
            ai_text = "(챗봇) 시스템 오류가 발생했습니다. 잠시 후 다시 시도해주세요."

    except Exception as e:
        print(f"[오류] DeepSeek API 호출 실패: {str(e)}")

        # API 실패 시 간단한 키워드 기반 응답
        ai_text = "(챗봇) 현재 답변 생성에 문제가 있습니다. 전담CS(평일 9시~17시 / 010-4982-2469)에 문의해주세요."

        # 키워드 기반 대체 응답
        for keyword, response_text in simple_responses.items():
            if keyword in user_message:
                ai_text = response_text
                break

    return jsonify({
        "event": "send",
        "textContent": {"text": ai_text}
    })

if __name__ == '__main__':
    # 실제 운영 환경에서는 WSGI 서버 사용을 권장합니다.
    # (예: gunicorn, uWSGI, waitress)
    app.run(host='0.0.0.0', port=5000, debug=False)  # debug=False for production
