from __future__ import annotations

from sqlite3 import Connection

from fastapi import HTTPException

from jarvis_finance.api.schemas.positions import EquityPosition
from jarvis_finance.dashboard import data as dashboard_data
from jarvis_finance.services.api_helpers import optional_decimal_text, status_label


def _asset_class_label(value: object) -> str:
    raw = str(value or "").lower()
    if raw == "etf":
        return "ETF"
    if raw in {"cash", "geld"}:
        return "Cash"
    return "Aktie"


def _position_status(row: dict[str, str]) -> str:
    price_status = str(row.get("price_status") or "").lower()
    fx_status = str(row.get("fx_status") or "").lower()
    quality = str(row.get("data_quality_status") or row.get("valuation_status") or "").lower()
    warnings = str(row.get("quality_warnings") or "").lower()
    if price_status in {"missing", "missing_market_price", "fehlt"}:
        return "Preis fehlt"
    if fx_status in {"missing", "missing_fx", "fehlt"} and dashboard_data.d(row.get("market_value_chf")) == 0:
        return "FX fehlt für Bewertung"
    if "cost_basis_missing" in warnings or dashboard_data.d(row.get("market_value_chf")) == 0:
        return "Einstand unvollständig"
    if price_status == "ok" and fx_status == "ok":
        return "Bewertet"
    if quality in {"missing", "incomplete", "partial", "warning"}:
        return "Einstand unvollständig"
    return "Bewertet"


def list_equity_positions(conn: Connection) -> list[EquityPosition]:
    positions: list[EquityPosition] = []
    for row in dashboard_data.get_positions(conn):
        asset_class = row.get("asset_class", "").lower()
        if asset_class not in {"stock", "equity", "etf"}:
            continue
        if row.get("instrument_status", "").lower() == "inactive":
            continue
        position_id = f"{row.get('account_id')}:{row.get('instrument_id')}"
        market_value = row.get("market_value_chf")
        positions.append(
            EquityPosition(
                position_id=position_id,
                name=row.get("name", ""),
                ticker=row.get("ticker", ""),
                isin=row.get("isin", ""),
                account=row.get("account_name", ""),
                asset_class=_asset_class_label(asset_class),
                quantity=optional_decimal_text(row.get("quantity")) or "0",
                currency=row.get("price_currency") or row.get("currency") or "",
                price=optional_decimal_text(row.get("market_price_original")),
                market_value_chf=None if dashboard_data.d(market_value) == 0 else optional_decimal_text(market_value, 2),
                status=_position_status(row),
            )
        )
    return positions


def get_equity_position(conn: Connection, position_id: str) -> EquityPosition:
    position = next((p for p in list_equity_positions(conn) if p.position_id == position_id), None)
    if position is None:
        raise HTTPException(status_code=404, detail="Equity position not found")
    return position
