# notification.py
import time
import logging
from chat import add_system_message, get_db, close_game_connection
from online_state import online_cache, cache_lock

logger = logging.getLogger(__name__)

_socketio = None

def init_notification(socketio):
    global _socketio
    _socketio = socketio

def send_public(content, sender='系统'):
    add_system_message(content, msg_type='public', target=None)
    logger.info(f"[公屏] {sender}: {content}")

def send_private(target_player, content, sender='系统'):
    add_system_message(content, msg_type='private', target=target_player)

def send_system(content, msg_type='system'):
    add_system_message(content, msg_type=msg_type)

def broadcast_world_boss_event(event_type, map_id, data, skip_sid=None):
    if _socketio is not None:
        data['map_id'] = map_id
        _socketio.emit(f'world_boss_{event_type}', data, room=f'map_{map_id}', skip_sid=skip_sid)

def broadcast_auction_update():
    if _socketio is not None:
        _socketio.emit('auction_update', {'type': 'list_changed'})

def notify_player_gold(player_name):
    """向指定玩家推送金币更新（通过玩家名称房间）"""
    if _socketio is None:
        return
    with cache_lock:
        if player_name not in online_cache:
            logger.warning(f"玩家 {player_name} 不在线，跳过金币推送")
            return

    conn = None
    try:
        conn = get_db()
        c = conn.cursor()
        c.execute('SELECT gold FROM players WHERE name = ?', (player_name,))
        row = c.fetchone()
        if row:
            gold = row[0]
            _socketio.emit('gold_update', {'gold': gold}, room=player_name)
            logger.info(f"已推送金币更新给 {player_name}，金币={gold}")
        else:
            logger.warning(f"未找到玩家 {player_name} 的金币记录")
    except Exception as e:
        logger.error(f"notify_player_gold 数据库查询失败: {e}")
    finally:
        if conn:
            close_game_connection(conn)

def notify_player_inventory(player_name):
    if _socketio is None:
        return
    with cache_lock:
        info = online_cache.get(player_name)
        if info:
            _socketio.emit('inventory_update', {'need_refresh': True}, room=info['sid'])
        else:
            _socketio.emit('inventory_update', {'need_refresh': True}, room=player_name)

def notify_map_stats(map_id, monster_count, players_online):
    """通知前端地图统计信息（原 broadcast_map_stats 重命名）"""
    if _socketio is not None:
        _socketio.emit('map_stats', {
            'map_id': map_id,
            'monsters_remaining': monster_count,
            'players_online': players_online
        }, room=f'map_{map_id}')

def notify_auction_update(players):
    if _socketio is None:
        return
    data = {'timestamp': time.time()}
    for player in players:
        if player:
            _socketio.emit('auction_update', data, room=player)