from __future__ import annotations

from datetime import datetime, timezone

from analysis.lpl_orderbook.activity_trades import (
    infer_requested_markets,
    match_activity_trade,
    normalized_activity_row,
    select_target_markets,
)


def test_select_target_markets_filters_moneyline_and_games() -> None:
    markets = [
        {
            "id": "1",
            "slug": "lol-wb-we-2026-05-07",
            "question": "Series",
            "conditionId": "0xseries",
            "outcomes": '["WB","WE"]',
            "clobTokenIds": '["series_wb","series_we"]',
        },
        {
            "id": "2",
            "slug": "lol-wb-we-2026-05-07-game1",
            "question": "Game 1",
            "conditionId": "0xgame1",
            "outcomes": '["WB","WE"]',
            "clobTokenIds": '["game1_wb","game1_we"]',
        },
        {
            "id": "3",
            "slug": "lol-wb-we-2026-05-07-game1-first-blood",
            "question": "First Blood",
            "conditionId": "0xfb",
            "outcomes": '["WB","WE"]',
            "clobTokenIds": '["fb_wb","fb_we"]',
        },
    ]

    targets = select_target_markets(
        "lol-wb-we-2026-05-07",
        markets,
        {"moneyline", "game1"},
    )

    assert [target.slug for target in targets] == [
        "lol-wb-we-2026-05-07",
        "lol-wb-we-2026-05-07-game1",
    ]
    assert targets[0].kind == "moneyline"
    assert targets[1].kind == "game1"


def test_auto_markets_exclude_game5_and_props() -> None:
    markets = [
        {"slug": "lol-bo5-2026-05-07"},
        {"slug": "lol-bo5-2026-05-07-game1"},
        {"slug": "lol-bo5-2026-05-07-game2"},
        {"slug": "lol-bo5-2026-05-07-game3"},
        {"slug": "lol-bo5-2026-05-07-game4"},
        {"slug": "lol-bo5-2026-05-07-game5"},
        {"slug": "lol-bo5-2026-05-07-game1-first-blood"},
    ]

    assert infer_requested_markets("lol-bo5-2026-05-07", markets) == {
        "moneyline",
        "game1",
        "game2",
        "game3",
        "game4",
    }


def test_match_activity_trade_by_payload_slug_and_token() -> None:
    targets = select_target_markets(
        "lol-wb-we-2026-05-07",
        [
            {
                "id": "1",
                "slug": "lol-wb-we-2026-05-07",
                "question": "Series",
                "conditionId": "0xseries",
                "outcomes": '["WB","WE"]',
                "clobTokenIds": '["series_wb","series_we"]',
            },
            {
                "id": "2",
                "slug": "lol-wb-we-2026-05-07-game1",
                "question": "Game 1",
                "conditionId": "0xgame1",
                "outcomes": '["WB","WE"]',
                "clobTokenIds": '["game1_wb","game1_we"]',
            },
        ],
        {"moneyline", "game1"},
    )

    by_slug = {
        "topic": "activity",
        "type": "trades",
        "payload": {"slug": "lol-wb-we-2026-05-07-game1"},
    }
    by_token = {
        "topic": "activity",
        "type": "trades",
        "payload": {"asset": "series_we"},
    }

    assert match_activity_trade(by_slug, targets).slug == "lol-wb-we-2026-05-07-game1"
    assert match_activity_trade(by_token, targets).slug == "lol-wb-we-2026-05-07"


def test_normalized_activity_row_uses_ws_delay() -> None:
    target = select_target_markets(
        "lol-wb-we-2026-05-07",
        [
            {
                "id": "1",
                "slug": "lol-wb-we-2026-05-07",
                "question": "Series",
                "conditionId": "0xseries",
                "outcomes": '["WB","WE"]',
                "clobTokenIds": '["series_wb","series_we"]',
            }
        ],
        {"moneyline"},
    )[0]
    row = normalized_activity_row(
        item={
            "topic": "activity",
            "type": "trades",
            "timestamp": 1778123236408,
            "payload": {
                "asset": "series_we",
                "price": 0.23,
                "size": 21.7,
                "side": "BUY",
                "timestamp": 1778123236,
                "transactionHash": "0xabc",
            },
        },
        target=target,
        event_slug="lol-wb-we-2026-05-07",
        received_at_wall=datetime.fromtimestamp(1778123236.508, tz=timezone.utc),
        received_at_monotonic_ns=123,
        message_index=7,
    )

    assert row["matched_market_slug"] == "lol-wb-we-2026-05-07"
    assert row["asset"] == "series_we"
    assert row["transaction_hash"] == "0xabc"
    assert row["delay_ms"] == 100.0
