"""Read-only paper account and crypto feed. No broker order methods exist."""
import json
import os
from urllib.error import HTTPError, URLError
from urllib.parse import urlencode
from urllib.request import HTTPRedirectHandler, Request, build_opener
from engine import Rejected

PAPER = 'https://paper-api.alpaca.markets'
DATA = 'https://data.alpaca.markets'

class NoRedirect(HTTPRedirectHandler):
    def redirect_request(self, req, fp, code, msg, headers, newurl):
        raise Rejected('Redirect blocked')

def get(url, headers=None):
    try:
        with build_opener(NoRedirect).open(Request(url, headers=headers or {}, method='GET'), timeout=10) as response:
            raw = response.read(1_000_001)
            if len(raw) > 1_000_000:
                raise Rejected('Response too large')
            return json.loads(raw, parse_float=str)
    except HTTPError as exc:
        raise Rejected('Broker/data request rejected, HTTP ' + str(exc.code)) from None
    except (URLError, TimeoutError, json.JSONDecodeError):
        raise Rejected('Broker/data unavailable; no fallback prices used') from None

def paper_account_check():
    if os.environ.get('ALPACA_BASE_URL', PAPER) != PAPER:
        raise Rejected('Only exact paper endpoint allowed')
    key, secret = os.environ.get('ALPACA_PAPER_KEY'), os.environ.get('ALPACA_PAPER_SECRET')
    if any(not v or any(t in v.lower() for t in ('mock', 'replacement', 'change_me', 'your-', 'prod')) for v in (key, secret)):
        raise Rejected('Provide valid paper credentials through environment; never chat')
    a = get(PAPER + '/v2/account', {'APCA-API-KEY-ID': key, 'APCA-API-SECRET-KEY': secret})
    return {'status': a.get('status'), 'cash': a.get('cash'), 'equity': a.get('equity'),
            'trading_blocked': a.get('trading_blocked'), 'endpoint': PAPER,
            'credentials_authenticated': True, 'broker_order_submission': False}

def crypto_quotes():
    result = get(DATA + '/v1beta3/crypto/us/latest/quotes?' + urlencode({'symbols':'BTC/USD,ETH/USD'}))
    q = result.get('quotes', {})
    if set(q) != {'BTC/USD', 'ETH/USD'}:
        raise Rejected('Incomplete crypto quote response')
    return {symbol: {'price': str(v['bp']), 'ask': str(v['ap']), 'at': v['t'], 'source': DATA} for symbol, v in q.items()}
