import streamlit as st
from pathlib import Path
import numpy as np
from utils.helpers import parse_lower

@st.cache_data(ttl=0)
def load_surfaces(folder):
    base = Path(folder)
    files = list(base.rglob("*elon*.npz")) + list(base.rglob("*tweet*.npz")) + list(base.rglob("*surface*.npz"))
    files = sorted(set(files), key=lambda f: f.stat().st_mtime, reverse=True)
    surfaces = {}
    for f in files:
        try:
            data = np.load(f, allow_pickle=True)
            meta = {}
            for k in data.files:
                if k == "matrix": continue
                val = data[k]
                if isinstance(val, np.ndarray):
                    meta[k] = val.tolist() if len(val.shape) > 0 else val.item()
                elif isinstance(val, (np.integer, np.floating, np.bool_)):
                    meta[k] = val.item()
                else:
                    meta[k] = val
            matrix = data["matrix"]
            bins = meta.get("bins", [])
            if bins:
                lower = [parse_lower(b) for b in bins]
                idx = np.argsort(lower)
                matrix = matrix[:, idx]
                meta["bins"] = [bins[i] for i in idx]
            slug = meta.get("event_slug") or f.stem.replace("elon_surface_", "").replace("_FULL", "").replace("_ORDERED", "")
            surfaces[slug] = {"matrix": matrix, "meta": meta}
        except Exception as e:
            st.warning(f"Skipped corrupted file {f.name}: {e}")
            continue

    # ←←← CHANGED: never call st.stop() in background thread
    if not surfaces:
        return {}, files   # return empty gracefully

    return surfaces, files
