"""Performance Analytics & Daily Reporting service."""
from datetime import date, datetime

from sqlalchemy.orm import Session

from .. import models
from ..config import settings


def portfolio_summary(db: Session) -> dict:
    trades = db.query(models.PaperTrade).all()
    open_t = [t for t in trades if t.status == "open"]
    closed = [t for t in trades if t.status == "closed"]
    wins = [t for t in closed if t.pnl > 0]
    realized = round(sum(t.pnl for t in closed), 2)
    unrealized = round(sum(t.pnl for t in open_t), 2)
    open_risk = round(sum(abs(t.entry_price - t.stop_loss) * t.quantity for t in open_t), 2)
    return {
        "account_equity": settings.ACCOUNT_EQUITY + realized,
        "starting_equity": settings.ACCOUNT_EQUITY,
        "realized_pnl": realized,
        "unrealized_pnl": unrealized,
        "open_trades": len(open_t),
        "closed_trades": len(closed),
        "win_rate": round(len(wins) / len(closed) * 100, 1) if closed else 0.0,
        "open_risk_usd": open_risk,
        "max_daily_risk_usd": round(settings.ACCOUNT_EQUITY * settings.MAX_DAILY_RISK_PCT / 100, 2),
        "risk_utilization_pct": round(
            open_risk / (settings.ACCOUNT_EQUITY * settings.MAX_DAILY_RISK_PCT / 100) * 100, 1
        ) if settings.ACCOUNT_EQUITY else 0.0,
    }


def generate_daily_report(db: Session, for_date: date | None = None) -> models.DailyReport:
    d = for_date or date.today()
    day_start = datetime(d.year, d.month, d.day)

    signals = db.query(models.Signal).filter(models.Signal.created_at >= day_start).all()
    approved = [s for s in signals if s.status == "approved"]
    trades_closed = (
        db.query(models.PaperTrade)
        .filter(models.PaperTrade.closed_at.isnot(None), models.PaperTrade.closed_at >= day_start)
        .all()
    )
    summary_stats = portfolio_summary(db)
    day_pnl = round(sum(t.pnl for t in trades_closed), 2)
    wins = [t for t in trades_closed if t.pnl > 0]

    top = sorted(approved, key=lambda s: s.confidence, reverse=True)[:5]
    summary_lines = [
        f"Daily Report — {d.isoformat()}",
        f"Signals generated: {len(signals)} ({len(approved)} approved, {len(signals) - len(approved)} rejected)",
        f"Trades closed today: {len(trades_closed)} (win rate {round(len(wins)/len(trades_closed)*100,1) if trades_closed else 0}%)",
        f"Realized P&L today: ${day_pnl:,.2f}",
        f"Account equity: ${summary_stats['account_equity']:,.2f}",
    ]
    if top:
        summary_lines.append("Top setups: " + ", ".join(
            f"{s.symbol} {s.direction} ({s.confidence:.0f} conf)" for s in top))

    payload = {
        "date": d.isoformat(),
        "signals_total": len(signals),
        "signals_approved": len(approved),
        "signals_rejected": len(signals) - len(approved),
        "trades_closed": len(trades_closed),
        "day_pnl": day_pnl,
        "portfolio": summary_stats,
        "top_signals": [
            {"symbol": s.symbol, "direction": s.direction, "confidence": s.confidence,
             "probability": s.probability, "risk_reward": s.risk_reward}
            for s in top
        ],
    }

    existing = db.query(models.DailyReport).filter(models.DailyReport.report_date == d).first()
    if existing:
        existing.summary = "\n".join(summary_lines)
        existing.payload = payload
        report = existing
    else:
        report = models.DailyReport(report_date=d, summary="\n".join(summary_lines), payload=payload)
        db.add(report)
    db.commit()
    db.refresh(report)
    return report
