from flask import Blueprint, render_template, session, request, redirect, jsonify, url_for, current_app
from routes.auth import login_required, admin_required
import database
import math
from datetime import datetime, timedelta
import pytz

main_bp = Blueprint('main', __name__)

# 定義台北時區
tw_tz = pytz.timezone('Asia/Taipei')

@main_bp.route('/')
@login_required
def index():
    initial_state = database.get_current_ui_state()
    user_role = session.get('role', 'guest')

    # 針對 Caregiver 遮蔽初始狀態
    if user_role == 'caregiver':
        if initial_state.get('raw_activity') == 'null':
            initial_state.update({'title': '不在家', 'color': '#adb5bd', 'icon': '🚪', 'desc': '目前不在家'})
        else:
            initial_state.update({'title': '在家', 'color': '#28a745', 'icon': '🏠', 'desc': '目前在家'})
        initial_state['x'] = '---'
        initial_state['y'] = '---'
        initial_state['zone'] = '未知'

    notify_enabled = 1
    try:
        db = database.get_db_connection()
        with db.cursor() as cursor:
            cursor.execute("SELECT notify_enabled FROM users WHERE user_id = %s", (session['user_id'],))
            user = cursor.fetchone()
            if user: notify_enabled = user['notify_enabled']
    except Exception as e:
        print(f"讀取通知狀態失敗: {e}")
    finally:
        if 'db' in locals() and db: db.close()
            
    return render_template('dashboard.html', state=initial_state, user_name=session.get('name'), user_role=user_role, notify_enabled=notify_enabled)

@main_bp.route('/events')
@login_required
def event_history():
    page = request.args.get('page', 1, type=int)
    current_type = request.args.get('type', '')
    start_date = request.args.get('start', '')
    end_date = request.args.get('end', '')
    
    events, total_count = database.get_events(page, 10, current_type, start_date, end_date)
    return render_template('event_history.html', 
                           events=events, 
                           page=page, 
                           total_pages=math.ceil(total_count / 10), 
                           current_type=current_type,   # 讓網頁記住現在選的類型
                           start_date=start_date,       # 讓網頁記住開始日期
                           end_date=end_date,           # 讓網頁記住結束日期
                           user_name=session.get('name'),
                           user_role=session.get('role'))

@main_bp.route('/devices', methods=['GET', 'POST'])
@login_required
@admin_required
def devices_management():
    if request.method == 'POST':
        name = request.form.get('device_name', '').strip()
        room_id = request.form.get('room_id', 1)  # 指定所屬房間
        role = request.form.get('device_role', 'all')  # 定義雷達職責 (position/activity/all)
        if name:
            database.add_device(name, room_id, role)
            return redirect(url_for('main.devices_management'))
    return render_template('devices.html', devices=database.get_all_devices(), user_role=session.get('role'), user_name=session.get('name'))

@main_bp.route('/bind')
@login_required
def bind_line():
    user, bound_list = database.get_user_bind_info(session['user_id'])
    return render_template('bind_line.html', user=user, bound_list=bound_list, user_name=session.get('name'), user_role=session.get('role'))

@main_bp.route('/statistics')
@login_required
def statistics():
    if session.get('role') == 'caregiver': return redirect('./') # Caregiver 防呆
    today = datetime.now(tw_tz).strftime('%Y-%m-%d')
    start_date = request.args.get('start_date', today)
    end_date = request.args.get('end_date', today)
    # summary = database.get_daily_summary_data(start_date, end_date)
    # timeline_data, events = database.get_statistics_data(start_date, end_date)
    return render_template('statistics.html', start_date=start_date, end_date=end_date, user_name=session.get('name'), user_role=session.get('role'))

@main_bp.route('/settings', methods=['GET', 'POST'])
@login_required
@admin_required 
def settings():
    if request.method == 'POST':
        # 取得網頁表單傳來的數值
        no_move_min = request.form.get('no_move_min')
        no_home_min = request.form.get('no_home_min')
        night_start = request.form.get('night_start', '00:00')
        night_end = request.form.get('night_end', '06:00')
        
        # 更新資料庫中的設定值
        database.update_system_settings('threshold_no_move_min', no_move_min)
        database.update_system_settings('threshold_no_home_min', no_home_min)
        database.update_system_settings('night_start_time', night_start)
        database.update_system_settings('night_end_time', night_end)
        
        # 重導向回 /settings 並帶上成功訊息
        return redirect('settings?msg=success')

    # GET 請求時：抓取目前的設定顯示在表單上
    current_settings = database.get_system_settings()
    return render_template('settings.html', settings=current_settings, user_name=session.get('name'), user_role=session.get('role'))

@main_bp.route('/spatial')
@login_required
def spatial_analysis():
    # 照護人員無權限查看詳細座標分析
    if session.get('role') == 'caregiver': return redirect('./') 
    
    today = datetime.now(tw_tz).strftime('%Y-%m-%d')
    start_date = request.args.get('start_date', (datetime.now(tw_tz) - timedelta(days=7)).strftime('%Y-%m-%d')) # 預設看過去 7 天
    end_date = request.args.get('end_date', today)
    
    return render_template('spatial_analysis.html', 
                           start_date=start_date, 
                           end_date=end_date, 
                           user_name=session.get('name'), 
                           user_role=session.get('role'))

@main_bp.route('/api/statistics_data')
@login_required
def api_statistics_data():
    start_date = request.args.get('start') + " 00:00:00"
    end_date = request.args.get('end') + " 23:59:59"
    timeline_data, events = database.get_statistics_data(start_date, end_date)
    
    return jsonify({
        'status': 'success', 
        'timeline_data': timeline_data, 
        'events': events
    })

@main_bp.route('/api/spatial_data')
@login_required
def api_spatial_data():
    start_date = request.args.get('start') + " 00:00:00"
    end_date = request.args.get('end') + " 23:59:59"
    data = database.get_spatial_statistics(start_date, end_date)
    return jsonify({'status': 'success', 'data': data})

@main_bp.route('/api/trigger_ui_update')
def trigger_ui_update():
    """當外部程式(如雷達端)寫入資料庫後，手動觸發前端 UI 刷新"""
    state = database.get_current_ui_state()
    current_app.socketio.emit('ui_update', state, namespace='/')
    return "UI_UPDATED"

# 提供給 Chart.js 的 JSON API
@main_bp.route('/api/stats_data')
@login_required
def stats_data():
    # 回傳 6 類動作的圓餅圖數據
    summary = database.get_daily_summary_data()
    return jsonify({
        "labels": list(summary['stats'].keys()),
        "data": list(summary['stats'].values())
    })

# 提供軌跡資料給前端
@main_bp.route('/api/event_trajectory/<int:event_id>')
@login_required
def api_event_trajectory(event_id):
    try:
        data = database.get_event_trajectory(event_id)
        return jsonify({'status': 'success', 'data': data})
    except Exception as e:
        return jsonify({'status': 'error', 'message': str(e)}), 500

@main_bp.route('/resolve_all', methods=['POST'])
@login_required
def resolve_all():
    username = session.get('name', '家屬') 
    if database.resolve_all_events(username):
        from flask import current_app
        try:
            state = database.get_current_ui_state()
            current_app.socketio.emit('ui_update', state, namespace='/')
        except Exception as e:
            print(f"Socket廣播失敗: {e}")
            
        try:
            from routes.line import line_bot_api
            from linebot.models import TextSendMessage
            
            db = database.get_db_connection()
            with db.cursor() as cursor:
                cursor.execute("SELECT line_user_id, role FROM users WHERE line_user_id IS NOT NULL AND notify_enabled = 1 AND is_active = 1")
                recipients = cursor.fetchall()
            db.close()
            
            if recipients:
                reply_text = (
                    f"🛡️ 警報已由 {username} 解除！\n"
                    "──────────────\n"
                    f"【目前狀態】\n"
                    f"狀態：{state.get('title', '未知')}\n"
                    f"更新時間：{state.get('last_activity_time', '---')}\n"
                    f"說明：{state.get('desc', '無')}"
                )
                
                # 針對 Caregiver 特製簡化版解除通知
                cg_is_home = state.get('raw_activity', 'null') != 'null'
                cg_status_text = "在家" if cg_is_home else "不在家 / 外出"
                reply_text_cg = (
                    f"🛡️ 警報已由 {username} 解除！\n"
                    "──────────────\n"
                    f"【目前狀態】\n"
                    f"狀態：{cg_status_text}\n"
                    f"更新時間：{state.get('last_activity_time', '---')}"
                )

                for r in recipients:
                    msg_to_send = reply_text_cg if r['role'] == 'caregiver' else reply_text
                    line_bot_api.push_message(r['line_user_id'], TextSendMessage(text=msg_to_send))
                    
        except Exception as e:
            print(f"網頁解除警報後，LINE推播失敗: {e}")
        
        return jsonify({"status": "success", "message": "警告已解除"}), 200
    return jsonify({"status": "error", "message": "解除失敗"}), 500

@main_bp.route('/toggle_notify', methods=['POST'])
def toggle_notify():
    """接收網頁的通知開關設定"""
    if 'user_id' not in session:
        return jsonify({'status': 'error', 'msg': '未登入'}), 401

    data = request.json
    enabled = data.get('enabled', True)
    user_id = session['user_id']
    
    # 存入資料庫 (僅針對目前登入的 user_id)
    try:
        db = database.get_db_connection()
        with db.cursor() as cursor:
            val = 1 if enabled else 0
            cursor.execute("UPDATE users SET notify_enabled = %s WHERE user_id = %s", (val, user_id))
            db.commit()
    except Exception as e:
        print(f"網頁設定通知開關發生錯誤: {e}")
        return jsonify({'status': 'error'}), 500
    finally:
        if 'db' in locals() and db:
            db.close()

    return jsonify({'status': 'success', 'enabled': enabled})

@main_bp.route('/api/test_check_alerts')
def test_check_alerts():
    """手動觸發超時警報檢查的測試 API"""
    try:
        device_id = 1 
        
        # 1. 先去資料庫抓最新的狀態
        db = database.get_db_connection()
        with db.cursor() as cursor:
            cursor.execute("SELECT last_activity FROM rooms WHERE room_id = 1")
            room = cursor.fetchone()
            current_activity = room['last_activity'] if room else 'lay'
        db.close()

        # 2. 強制執行檢查
        alert = database.check_timed_alerts(device_id, current_activity)
        
        if alert:
            return jsonify({"status": "success", "message": f"成功觸發警報: {alert}"})
        else:
            return jsonify({"status": "success", "message": "檢查完成，無警報條件達成。"})
    except Exception as e:
        return jsonify({"status": "error", "message": str(e)}), 500