import re
from flask import Blueprint, render_template, request
from flask_socketio import emit
from groq import Groq
import database
import os
import chromadb

chat_bp = Blueprint('chat', __name__)

client = Groq(api_key="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")
chroma_client = chromadb.PersistentClient(path="./chroma_db")
collection = chroma_client.get_collection(name="care_knowledge")

def get_db_snapshot():
    conn = database.get_db_connection()
    try:
        with conn.cursor() as cursor:
            sql = "SELECT device_name, last_activity, last_seen FROM radar_devices WHERE device_id = 1"
            cursor.execute(sql)
            return cursor.fetchone()
    except: return None
    finally: conn.close()

def get_comprehensive_data(days=3):
    conn = database.get_db_connection()
    data_str = ""
    try:
        with conn.cursor() as cursor:
            # 修改 SQL：將 NULL (不在位) 也納入統計
            sql_act = """
                SELECT 
                    d, 
                    activity_type, 
                    SUM(duration_sec) as total_secs
                FROM (
                    SELECT 
                        DATE(record_time) as d, 
                        activity_type,
                        TIMESTAMPDIFF(SECOND, record_time, 
                            IFNULL(LEAD(record_time) OVER (PARTITION BY device_id ORDER BY record_time), NOW())
                        ) as duration_sec
                    FROM activity_logs 
                    WHERE record_time >= DATE_SUB(NOW(), INTERVAL %s DAY)
                ) as t
                GROUP BY d, activity_type
                ORDER BY d DESC
            """
            cursor.execute(sql_act, (days,))
            rows = cursor.fetchall()
            
            if rows:
                data_str += f"--- 過去 {days} 天詳細行為日誌 (用於作息分析) ---\n"
                for r in rows:
                    if r['total_secs'] > 0:
                        mins = r['total_secs'] // 60
                        hours = mins // 60
                        rem_mins = mins % 60
                        time_str = f"{hours}小時{rem_mins}分鐘" if hours > 0 else f"{mins}分鐘"
                        # 明確標記 NULL 為「不在位/外出」
                        act_display = r['activity_type'] if r['activity_type'] != 'null' else "不在(外出/死角)"
                        data_str += f"日期:{r['d']}, 動作:{act_display}, 累計:{time_str}\n"
            else:
                data_str += f"--- 過去 {days} 天查無數據 ---\n"

            sql_evt = """
                SELECT event_type, event_time 
                FROM event_logs 
                WHERE event_time >= DATE_SUB(NOW(), INTERVAL %s DAY)
                ORDER BY event_time DESC
            """
            cursor.execute(sql_evt, (days,))
            evts = cursor.fetchall()
            if evts:
                data_str += f"\n--- 過去 {days} 天緊急事件紀錄 ---\n"
                for e in evts:
                    data_str += f"時間:{e['event_time']}, 類型:{e['event_type']}\n"
    except Exception as e:
        data_str = f"分析失敗: {str(e)}"
    finally: conn.close()
    return data_str

def get_llm_response(user_input):
    # 判斷天數
    days = 3
    day_match = re.search(r'([一二三四五六七八九十0-9]+)\s*天', user_input)
    if day_match:
        d_map = {'一':1,'二':2,'三':3,'四':4,'五':5,'六':6,'七':7,'八':8,'九':9,'十':10}
        d_val = day_match.group(1)
        days = int(d_val) if d_val.isdigit() else d_map.get(d_val, 3)
    elif "週" in user_input: days = 7
    elif "昨" in user_input: days = 1

    snapshot = get_db_snapshot()
    history_info = get_comprehensive_data(days)

    try:
        results = collection.query(query_texts=[user_input], n_results=1)
        relevant_doc = results['documents'][0][0] if results['documents'] else "無"
    except: relevant_doc = "無"

    now_act = snapshot['last_activity'] if snapshot else "未知"
    now_time = str(snapshot['last_seen']) if snapshot else "未知"
    
    context = f"[即時事實]\n現在動作: {now_act}\n最後更新時間: {now_time}\n\n[資料庫紀錄資料]\n{history_info}\n\n[專業參考]\n{relevant_doc}"

    try:
        completion = client.chat.completions.create(
            model="llama-3.1-8b-instant",
            messages=[
                {
                    "role": "system", 
                    "content": f"""你是一位精煉、專業的居家照護助理。請遵循以下回話邏輯：
                    1. 若使用者詢問「目前狀態」，僅回答當前動作與更新時間。除非提及「統計」或「分析」，否則嚴禁列出歷史長度。
                    2. 動作定義：
                       - 'lay': 臥床睡眠。
                       - 'null': 不在位（代表外出、在雷達死角或浴室），不列入室內活動。
                       - 'walk', 'stand', 'sit': 室內活動。
                       - 'fall': 跌倒意外！是嚴重事件，絕對不是休息或活動，必須嚴肅提醒。
                    3. 數據準則：僅使用提供的「累計時間」數值，嚴禁腦補。計算總時長時，若有 'null' 時間，請主動說明「有一段時間不在監測範圍內」。
                    4. 作息建議：應考慮 'null' 時間代表外出。若活動時間少是因外出導致，屬正常現象。
                    5. 語氣：專業、冷靜、簡潔。"""
                },
                {"role": "assistant", "content": f"當前系統 Context：\n{context}"},
                {"role": "user", "content": user_input}
            ],
            temperature=0.1,
            max_tokens=600
        )
        return completion.choices[0].message.content
    except Exception as e:
        return f"AI 助理連線異常: {str(e)}"

# --- 路由與事件 ---
@chat_bp.route('/chat')
def chat_page():
    return render_template('chat.html')

def register_chat_events(socketio):
    @socketio.on('send_message')
    def handle_message(data):
        user_msg = data.get('message')
        ai_msg = get_llm_response(user_msg)
        emit('ai_response', {'message': ai_msg}, room=request.sid)