"""
Filter MAST GO-4598 to NIRCam F277W I2D mosaics only. Check HLSP availability.
"""
import os, sys, urllib3, requests
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
try:
    Observations._portal_api_connection.session.verify = False
except Exception:
    pass

# Query NIRCam F277W only
print("--- NIRCam F277W observations from GO-4598 ---")
obs = Observations.query_criteria(
    proposal_id='4598',
    instrument_name='NIRCAM/IMAGE',
    filters='F277W'
)
print(f"NIRCam F277W observations: {len(obs)}")
if len(obs) > 0:
    print("Target names:", set(obs['target_name']))
    print("Sample obs_id:", list(obs['obs_id'][:5]))

print()
print("--- Product list for these NIRCam F277W obs ---")
products = Observations.get_product_list(obs)
print(f"All products: {len(products)}")

# Filter to I2D (level-3 mosaics)
i2d = Observations.filter_products(
    products,
    productType=['SCIENCE'],
    productSubGroupDescription=['I2D'],
    extension='fits'
)
print(f"I2D mosaic products: {len(i2d)}")

if len(i2d) > 0:
    print()
    print("Filenames and sizes:")
    if 'size' in i2d.colnames:
        for row in i2d[:15]:
            sz_mb = row['size'] / 1e6 if row['size'] else 0
            print(f"  {row['productFilename']}  --  {sz_mb:.1f} MB")
    # Find smallest I2D for test download
    valid = [(i, r['size']) for i, r in enumerate(i2d) if r['size'] and r['size'] > 0]
    if valid:
        valid.sort(key=lambda x: x[1])
        smallest_idx, smallest_sz = valid[0]
        print()
        print(f"Smallest I2D: {i2d['productFilename'][smallest_idx]} ({smallest_sz/1e6:.1f} MB)")
        print(f"URI: {i2d['dataURI'][smallest_idx]}")
        # Save filtered list
        i2d.write('mast_F277W_i2d.csv', format='csv', overwrite=True)
        print(f"\nSaved {len(i2d)} F277W I2D rows to mast_F277W_i2d.csv")

# Check for HLSP (High-Level Science Products) for Bullet Cluster JWST
print()
print("--- Searching for HLSPs (high-level reduced products) ---")
try:
    hlsps = Observations.query_criteria(
        obs_collection='HLSP',
        target_name='*Bullet*'
    )
    print(f"HLSPs matching 'Bullet': {len(hlsps)}")
    if len(hlsps) > 0:
        for row in hlsps[:10]:
            print(f"  obs_id={row['obs_id']}  collection={row['obs_collection']}")
except Exception as e:
    print(f"HLSP query failed: {e}")
