# frontend/app.py
import sys
from pathlib import Path
sys.path.insert(0, str(Path(__file__).parent))

import streamlit as st
import requests
from datetime import datetime

from config import PRIVATE_KEY, WALLET_ADDRESS, FIDELITY, SESSION
from utils.helpers import get_event_title, get_category_from_event_title
from utils.event_discovery import discover_and_save_new_events
from tabs.heatmap import render_heatmap_tab
from tabs.surface_3d import render_surface_3d_tab
from tabs.smart_money import render_smart_money_tab
from tabs.signals import render_signals_tab
from tabs.model_builder import render_model_builder_tab
from tabs.data_updater import render_data_updater_tab
from tabs.rule_editor import render_rule_editor_tab
from tabs.auto_trading import render_auto_trading_tab
from components.rule_editor import rule_editor

st.set_page_config(page_title="Elon Tweet v6.3.8 • Backend", layout="wide", page_icon="📈")

# ====================== SAFE INITIALIZATION ======================
if "selected_slug" not in st.session_state:
    st.session_state.selected_slug = None
if "positions" not in st.session_state:
    st.session_state.positions = []

# ====================== BACKEND LOADING (ONLY CHANGE) ======================
BACKEND_URL = "http://172.17.0.2:3001"

@st.cache_data(ttl=25)
def load_surfaces_from_backend():
    try:
        resp = requests.get(f"{BACKEND_URL}/api/surfaces", timeout=15)
        if resp.status_code != 200:
            return {}, None
        data = resp.json()
        surfaces_list = data.get("surfaces", []) if isinstance(data, dict) else data
        
        surfaces = {}
        for s in surfaces_list:
            if isinstance(s, dict) and "slug" in s:
                slug = s["slug"]
                # Fetch full surface data for each slug
                full_resp = requests.get(f"{BACKEND_URL}/api/surface/{slug}", timeout=15)
                if full_resp.status_code == 200:
                    surfaces[slug] = full_resp.json()
                else:
                    surfaces[slug] = s  # fallback to light version
        return surfaces, None
    except Exception as e:
        st.error(f"Backend connection failed: {e}")
        return {}, None

surfaces, _ = load_surfaces_from_backend()

# ====================== WAITING + SELECTION (kept from your old version) ======================
if not surfaces:
    st.title("🕒 Waiting for first event data...")
    st.info("The backend is building surfaces.\nThis usually takes 20–60 seconds.")
    if st.button("🔍 Force Refresh Backend", type="primary"):
        st.cache_data.clear()
        st.rerun()
    st.stop()

if st.session_state.selected_slug is None or st.session_state.selected_slug not in surfaces:
    st.session_state.selected_slug = list(surfaces.keys())[0]

selected_slug = st.session_state.selected_slug
data = surfaces[selected_slug]
matrix = data.get("matrix", [])
meta = data.get("meta", {})

event_title = get_event_title(meta, selected_slug)
category = get_category_from_event_title(event_title)

# ====================== SIDEBAR (kept exactly as your old version) ======================
st.sidebar.title("📅 Events by Category")
for cat in ["2day", "7day_tue", "7day_fri", "month", "other"]:
    cat_events = [s for s in surfaces.keys() if get_category_from_event_title(get_event_title(surfaces[s].get("meta", {}), s)) == cat]
    cat_events.sort(key=lambda s: surfaces[s].get("meta", {}).get("start_date", "1970"), reverse=True)
    with st.sidebar.expander(f"{cat.upper()} ({len(cat_events)})", expanded=True):
        for s in cat_events:
            title = get_event_title(surfaces[s].get("meta", {}), s)
            label = f"{surfaces[s].get('meta', {}).get('start_date','???')[:10]} — {title[:50]}"
            if st.button(label, key=f"btn_{s}"):
                st.session_state.selected_slug = s
                st.rerun()

with st.sidebar.expander("All Events (fallback)"):
    for s in sorted(surfaces.keys(), key=lambda s: surfaces[s].get("meta", {}).get("start_date", "1970"), reverse=True):
        title = get_event_title(surfaces[s].get("meta", {}), s)
        label = f"{surfaces[s].get('meta', {}).get('start_date','???')[:10]} — {title[:50]}"
        if st.button(label, key=f"all_{s}"):
            st.session_state.selected_slug = s
            st.rerun()

# ====================== MAIN HEADER & TABS (unchanged style) ======================
col1, col2 = st.columns([4,1])
with col1:
    st.title("Elon Musk Tweet Count")
    st.header(event_title)
with col2:
    st.metric("Category", category.upper())

tab1, tab2, tab3, tab4, tab5, tab6, tab7 = st.tabs([
    "🌡 Heatmap", "🌌 3D Surface", "📊 Trading Signals","🔥 Smart Money", 
    "🔨 Model Builder", "🔄 Data Updater", "🚀 Auto Trading"
])

with tab1:
    render_heatmap_tab(selected_slug)
with tab2:
    render_surface_3d_tab(selected_slug)
with tab3:
    render_signals_tab(selected_slug)
with tab4:
    render_smart_money_tab(selected_slug, surfaces)
with tab5:
    render_model_builder_tab()
with tab6:
    render_data_updater_tab(selected_slug)
with tab7:
    render_auto_trading_tab(surfaces)        