"""
MAST DOI 10.17909/8zea-jv19 metadata query for Bullet Cluster JWST + HST imaging.
Cha et al. 2025 ApJ 987 L15.
"""
import os
import sys
import urllib3
import requests

# Disable SSL warnings + verification at the requests level
urllib3.disable_warnings(urllib3.exceptions.InsecureRequestWarning)
old_request = requests.Session.request
def _patched(self, *args, **kwargs):
    kwargs['verify'] = False
    return old_request(self, *args, **kwargs)
requests.Session.request = _patched

from astroquery.mast import Observations
# Patch astroquery internal sessions
try:
    Observations._portal_api_connection.session.verify = False
    Observations._cloud_connection.session.verify = False
except Exception:
    pass

print("--- Querying MAST for JWST proposal_id=4598 (Bullet Cluster GO-4598) ---")
try:
    obs2 = Observations.query_criteria(proposal_id='4598')
    print(f"All proposal 4598 observations: {len(obs2)}")
    if len(obs2) > 0:
        print("Collections present:", set(obs2['obs_collection']))
        print("Instruments:", set(obs2['instrument_name']))
        # Filter listing
        filters_set = set()
        for f in obs2['filters']:
            filters_set.add(str(f))
        print(f"Filters: {sorted(filters_set)[:20]}")
        # Save for later use
        obs2.write('mast_proposal_4598.csv', format='csv', overwrite=True)
        print(f"Saved {len(obs2)} rows to mast_proposal_4598.csv")
except Exception as e:
    print(f"Broad query failed: {type(e).__name__}: {e}")
    import traceback
    traceback.print_exc()
    sys.exit(1)

print()
print("--- Product list for first 5 observations ---")
try:
    products = Observations.get_product_list(obs2[:5])
    print(f"Products (first 5 obs): {len(products)}")
    if len(products) > 0:
        sci = Observations.filter_products(products, productType=['SCIENCE'], extension='fits')
        print(f"Science FITS products: {len(sci)}")
        if 'size' in sci.colnames:
            sizes = [s for s in sci['size'] if s is not None and s > 0]
            total_mb = sum(sizes) / 1e6
            print(f"Total volume (first 5 obs SCIENCE FITS only): {total_mb:.1f} MB")
        if 'productSubGroupDescription' in sci.colnames:
            print("\nProduct subgroups:")
            subgroups = {}
            for row in sci:
                key = str(row['productSubGroupDescription'])
                subgroups[key] = subgroups.get(key, 0) + 1
            for k, v in sorted(subgroups.items()):
                print(f"  {k}: {v}")
        sci.write('mast_products_first5obs.csv', format='csv', overwrite=True)
        print(f"\nSaved {len(sci)} product rows to mast_products_first5obs.csv")
except Exception as e:
    print(f"Product list failed: {type(e).__name__}: {e}")
    import traceback
    traceback.print_exc()
