"""Serveur MCP : expose les outils finlab à Claude (transport stdio).

Lancement manuel :  python -m finlab.mcp_server
Configuré dans Claude via .mcp.json / claude mcp add (voir README).
"""
from __future__ import annotations

from mcp.server.fastmcp import FastMCP

from . import alerts, data, digest as digest_mod, fundamental, scanner, technical, tracker

mcp = FastMCP("finlab")


@mcp.tool()
def digest(theme: str = "all", target_pct: float = 5.0) -> str:
    """Digest compact (À PRIVILÉGIER) : portefeuille + opportunités haussières filtrées
    + alertes du jour, en ~20 lignes. Économe en tokens. theme = thème de watchlists,
    'all' ou 'portfolio'."""
    return digest_mod.build(theme, target_pct)


@mcp.tool()
def opportunities(theme: str = "all", target_pct: float = 5.0, bullish_only: bool = True) -> str:
    """Scanner d'opportunités sur un thème : capacité de mouvement (volatilité) + biais
    directionnel. theme = nom de thème (energy_power, chips, cables_optical_network,
    software_cloud, datacenter_infra), 'all' ou 'portfolio'."""
    df = scanner.scan_theme(theme, target_pct, bullish_only=bullish_only)
    return df.to_string(index=False)


@mcp.tool()
def alerts_today(watch: str = "all") -> str:
    """Alertes déclenchées aujourd'hui (croisements MACD, cassures MM50, survente...)."""
    return alerts.render(alerts.run(watch))


@mcp.tool()
def portfolio_summary() -> str:
    """Valorisation du portefeuille : valeur, P&L, poids et exposition sectorielle."""
    return tracker.report()


@mcp.tool()
def price(ticker: str) -> str:
    """Dernier cours d'un titre dans sa devise native (symbole Yahoo Finance)."""
    p, cur = data.last_price(ticker)
    return f"{ticker}: {p:.2f} {cur}"


@mcp.tool()
def technical_analysis(tickers: list[str] | None = None, period: str = "1y") -> str:
    """Indicateurs techniques (RSI, MACD, MM50/200, Bollinger, ATR) et signaux.
    tickers vide = tout le portefeuille."""
    df = technical.scan(tickers, period) if tickers else technical.scan_portfolio(period)
    return df.to_string(index=False)


@mcp.tool()
def fundamentals(tickers: list[str] | None = None) -> str:
    """Ratios fondamentaux (PER, PEG, marges, ROE, croissance, dette, cible analystes).
    tickers vide = tout le portefeuille."""
    df = fundamental.compare(tickers) if tickers else fundamental.compare_portfolio()
    return df.to_string(index=False)


@mcp.tool()
def paper_account() -> str:
    """État du compte paper trading Alpaca (argent fictif). Nécessite les clés .env."""
    from . import paper
    try:
        return str(paper.account())
    except paper.NotConfigured as e:
        return str(e)


@mcp.tool()
def paper_positions() -> str:
    """Positions ouvertes sur le compte paper trading Alpaca."""
    from . import paper
    try:
        return str(paper.positions())
    except paper.NotConfigured as e:
        return str(e)


@mcp.tool()
def paper_order(ticker: str, qty: float, side: str = "buy", limit: float | None = None) -> str:
    """Passe un ordre FICTIF (paper) sur Alpaca. side = buy|sell. limit optionnel."""
    from . import paper
    try:
        return str(paper.order(ticker, qty, side, limit))
    except paper.NotConfigured as e:
        return str(e)


if __name__ == "__main__":
    mcp.run()
