"""WeatherSystem:剧情夜的天气状态机(docs/agent-runtime-v2.md §8)。

暴雨 ⇄ 狂风暴雨 ⇄ 雷暴 → 雨歇(凌晨渐歇)。天气是世界状态:进共识公告、
全岛广播换场事件;雷暴首雷显著度高(可惊醒/打断)。视觉层按 weather 字段叠加雨幕/闪电。
"""

from __future__ import annotations

import random

TRANSITIONS: dict[str, list[tuple[str, float]]] = {
    "暴雨":     [("暴雨", 0.35), ("狂风暴雨", 0.35), ("雷暴", 0.2), ("雨歇", 0.1)],
    "狂风暴雨": [("暴雨", 0.35), ("狂风暴雨", 0.3), ("雷暴", 0.35)],
    "雷暴":     [("暴雨", 0.45), ("狂风暴雨", 0.35), ("雷暴", 0.2)],
    "雨歇":     [("暴雨", 0.35), ("雨歇", 0.4), ("狂风暴雨", 0.1), ("薄雾", 0.15)],
    "薄雾":     [("薄雾", 0.4), ("雨歇", 0.35), ("暴雨", 0.25)],
}

ANNOUNCE = {
    "暴雨": ("雨势又密了起来,雨点连成线砸在窗上。", 0.3),
    "狂风暴雨": ("风陡然狂了——整座宅子的窗框都在哐当作响,雨横着打。", 0.4),
    "雷暴": ("一道惨白的闪电劈开夜幕,炸雷紧随而至,震得人心口发麻!", 0.65),
    "雨歇": ("雨声忽然小了,只剩屋檐滴水——这种安静反而更让人心里发毛。", 0.35),
    "薄雾": ("雨停了,可海上漫起浓雾,白茫茫一片裹住孤岛——十步开外什么都看不见了。", 0.45),
}

# 能见度(0-1):只作用于露天场所,越低则室外目击越易漏看、尸体越难被发现
VISIBILITY = {"暴雨": 0.5, "狂风暴雨": 0.4, "雷暴": 0.42, "雨歇": 0.8, "薄雾": 0.22}


def visibility(weather: str) -> float:
    return VISIBILITY.get(weather, 0.6)


def next_weather(current: str, rng: random.Random, hour: float) -> str:
    if 4.5 <= (hour % 24) < 8.0:          # 凌晨渐歇/起雾,给"天亮"留呼吸
        r = rng.random()
        return "薄雾" if r < 0.35 else ("雨歇" if r < 0.75 else "暴雨")
    table = TRANSITIONS.get(current, TRANSITIONS["暴雨"])
    r = rng.random()
    acc = 0.0
    for state, p in table:
        acc += p
        if r <= acc:
            return state
    return table[-1][0]
