from __future__ import annotations

from dataclasses import dataclass
from datetime import datetime, timezone
from pathlib import Path

from journal import read_journal_events


@dataclass(frozen=True)
class DailyMetrics:
    date: str
    closed_trade_count: int
    realized_pnl_usd: float


def _as_utc(dt: datetime) -> datetime:
    if dt.tzinfo is None:
        return dt.replace(tzinfo=timezone.utc)
    return dt.astimezone(timezone.utc)


def calculate_daily_metrics(journal_path: str | Path, *, now: datetime | None = None) -> DailyMetrics:
    current = _as_utc(now or datetime.now(timezone.utc))
    date = current.date().isoformat()
    closed_count = 0
    realized = 0.0

    for event in read_journal_events(journal_path):
        if event.get("dry_run") is True:
            continue
        if event.get("event_type") != "exit":
            continue
        try:
            event_ts = _as_utc(datetime.fromisoformat(str(event.get("ts"))))
        except Exception:
            continue
        if event_ts.date().isoformat() != date:
            continue
        closed_count += 1
        realized += float(event.get("realized_pnl_usd", 0.0))

    return DailyMetrics(date=date, closed_trade_count=closed_count, realized_pnl_usd=round(realized, 8))
