"""Bybit Demo Trading Adapter (Dedicated api-demo.bybit.com Isolation)."""
from __future__ import annotations

from datetime import datetime, timezone
from decimal import Decimal
from typing import Any, Optional

from backend.app.audit.logger import audit_logger
from backend.app.config.settings import TradingMode, settings
from backend.app.database.session import db_manager
from backend.app.market_data.bybit_client import BybitV5Client
from backend.app.schemas.order import OrderIntent, OrderResult, OrderStatus


class BybitDemoExecutionAdapter:
    """Executes trades against official Bybit Demo Unified Account with reconciliation."""

    def __init__(self) -> None:
        self.client = BybitV5Client(mode=TradingMode.BYBIT_DEMO)

    def execute_order(self, intent: OrderIntent) -> OrderResult:
        # Check credentials
        if not settings.BYBIT_DEMO_API_KEY or not settings.BYBIT_DEMO_API_SECRET:
            return OrderResult(
                client_order_id=intent.client_order_id,
                exchange_order_id=None,
                status=OrderStatus.REJECTED,
                message="BYBIT_DEMO credentials not configured in environment.",
            )

        now = datetime.now(timezone.utc).isoformat()
        try:
            res = self.client.place_order(
                symbol=intent.symbol,
                side=intent.side.value,
                order_type=intent.order_type.value,
                qty=str(intent.quantity),
                price=str(intent.price) if intent.price else None,
                stop_loss=str(intent.stop_loss) if intent.stop_loss else None,
                take_profit=str(intent.take_profit) if intent.take_profit else None,
                client_order_id=intent.client_order_id,
                reduce_only=intent.reduce_only,
            )

            if res.get("retCode") == 0:
                order_id = res.get("result", {}).get("orderId")
                audit_logger.info("Bybit Demo Order accepted: %s (Exchange ID: %s)", intent.client_order_id, order_id)
                return OrderResult(
                    client_order_id=intent.client_order_id,
                    exchange_order_id=order_id,
                    status=OrderStatus.ACCEPTED,
                    filled_qty=intent.quantity,
                    avg_price=intent.price or Decimal("0"),
                    message="Demo order accepted on Bybit Demo Trading.",
                )
            else:
                err_msg = res.get("retMsg", "Unknown error")
                audit_logger.error("Bybit Demo Order rejected: %s", err_msg)
                return OrderResult(
                    client_order_id=intent.client_order_id,
                    exchange_order_id=None,
                    status=OrderStatus.REJECTED,
                    message=f"Bybit Demo rejected: {err_msg}",
                )

        except Exception as e:
            audit_logger.error("Bybit Demo connection/execution error: %s", str(e))
            return OrderResult(
                client_order_id=intent.client_order_id,
                exchange_order_id=None,
                status=OrderStatus.UNKNOWN,
                message=f"Ambiguous network status: {str(e)}. Reconciliation queued.",
            )


bybit_demo_adapter = BybitDemoExecutionAdapter()
