"""Portfolio API endpoints."""
from flask import Blueprint, jsonify, request
from flask_login import login_required, current_user
from app.extensions import db
from app.models.portfolio import Portfolio, TradeHistory
from app.services.portfolio import PortfolioService
from app.helpers.auth import get_current_user_id

api_portfolio_bp = Blueprint('api_portfolio', __name__)

_service = None


def _get_service():
    global _service
    if _service is None:
        _service = PortfolioService()
    return _service


@api_portfolio_bp.route('/summary')
@login_required
def portfolio_summary():
    """Get portfolio summary with all positions and P&L."""
    svc = _get_service()
    return jsonify(svc.get_portfolio_summary(user_id=get_current_user_id()))


@api_portfolio_bp.route('/trades')
@login_required
def trade_history():
    """Get trade history."""
    asset_id = request.args.get('asset_id')
    limit = request.args.get('limit', 50, type=int)
    svc = _get_service()
    trades = svc.get_trade_history(asset_id, limit, user_id=get_current_user_id())
    return jsonify({'trades': trades, 'count': len(trades)})


@api_portfolio_bp.route('/trade', methods=['POST'])
@login_required
def execute_trade():
    """Execute a simulated trade.

    JSON body:
        asset_id: str
        side: 'BUY' or 'SELL'
        price: float (IDR)
        quantity: float
        signal_id: int (optional)
    """
    data = request.get_json()
    if not data:
        return jsonify({'error': 'JSON body required'}), 400

    required = ['asset_id', 'side', 'price', 'quantity']
    for field in required:
        if field not in data:
            return jsonify({'error': f'Missing field: {field}'}), 400

    if data['side'] not in ('BUY', 'SELL'):
        return jsonify({'error': 'side must be BUY or SELL'}), 400

    svc = _get_service()
    result = svc.execute_trade(
        asset_id=data['asset_id'],
        side=data['side'],
        price=float(data['price']),
        quantity=float(data['quantity']),
        signal_id=data.get('signal_id'),
        is_simulation=data.get('is_simulation', True),
        user_id=get_current_user_id(),
    )
    return jsonify(result)


@api_portfolio_bp.route('/position/<asset_id>', methods=['DELETE'])
@login_required
def delete_position(asset_id):
    """Delete/reset a portfolio position. Trade history remains as audit trail."""
    position = Portfolio.query.filter_by(asset_id=asset_id, user_id=get_current_user_id()).first()
    if not position:
        return jsonify({'error': 'Position not found'}), 404

    db.session.delete(position)
    db.session.commit()
    return jsonify({'deleted': asset_id})


@api_portfolio_bp.route('/trade/<int:trade_id>', methods=['DELETE'])
@login_required
def delete_trade(trade_id):
    """Delete a single trade record. Does NOT reverse the position effect."""
    trade = TradeHistory.query.filter_by(id=trade_id, user_id=get_current_user_id()).first()
    if not trade:
        return jsonify({'error': 'Trade not found'}), 404

    db.session.delete(trade)
    db.session.commit()
    return jsonify({'deleted': trade_id})
