#!/usr/bin/env python3
"""
BTC Bottom Panel - One-click launcher
1. Fetches latest data from APIs
2. Starts a local HTTP server with API endpoints
3. Opens the dashboard in browser
"""

import json
import subprocess
import sys
import time
import webbrowser
from pathlib import Path
from http.server import HTTPServer, SimpleHTTPRequestHandler
import threading

ROOT = Path(__file__).parent
FRONTEND = ROOT / "frontend"
DATA_FILE = ROOT / "data" / "indicators.json"

def run_fetcher():
    """Run the data fetcher script."""
    print("[1/3] Fetching latest indicator data...")
    fetcher = ROOT / "backend" / "fetch_data.py"
    result = subprocess.run(
        [sys.executable, str(fetcher)],
        capture_output=True,
        text=True,
    )
    if result.returncode != 0:
        print("[WARN] Fetcher error:", result.stderr)
        return False
    print(result.stdout.strip())
    return True

class Handler(SimpleHTTPRequestHandler):
    def __init__(self, *args, **kwargs):
        super().__init__(*args, directory=str(ROOT), **kwargs)

    def log_message(self, format, *args):
        pass  # Silence logs

    def do_OPTIONS(self):
        self.send_response(204)
        self.send_header("Access-Control-Allow-Origin", "*")
        self.send_header("Access-Control-Allow-Methods", "GET, POST, OPTIONS")
        self.send_header("Access-Control-Allow-Headers", "Content-Type")
        self.end_headers()

    def do_GET(self):
        if self.path == "/api/data" or self.path.startswith("/api/data?"):
            self._serve_api_data()
        else:
            super().do_GET()

    def do_POST(self):
        if self.path == "/api/refresh":
            self._handle_refresh()
        else:
            self.send_error(404)

    def _serve_api_data(self):
        """Serve the current indicators.json."""
        try:
            data = json.loads(DATA_FILE.read_text(encoding="utf-8"))
            body = json.dumps(data, ensure_ascii=False).encode("utf-8")
            self.send_response(200)
            self.send_header("Content-Type", "application/json; charset=utf-8")
            self.send_header("Access-Control-Allow-Origin", "*")
            self.send_header("Content-Length", str(len(body)))
            self.end_headers()
            self.wfile.write(body)
        except Exception as e:
            self._send_json({"error": str(e)}, 500)

    def _handle_refresh(self):
        """Trigger fetch_data.py and return latest data."""
        success = run_fetcher()
        if success and DATA_FILE.exists():
            self._serve_api_data()
        else:
            self._send_json({"error": "Refresh failed"}, 500)

    def _send_json(self, data, status=200):
        body = json.dumps(data, ensure_ascii=False).encode("utf-8")
        self.send_response(status)
        self.send_header("Content-Type", "application/json; charset=utf-8")
        self.send_header("Access-Control-Allow-Origin", "*")
        self.send_header("Content-Length", str(len(body)))
        self.end_headers()
        self.wfile.write(body)

def start_server():
    """Start a local HTTP server for the frontend."""
    port = 8765
    server = HTTPServer(("127.0.0.1", port), Handler)
    thread = threading.Thread(target=server.serve_forever, daemon=True)
    thread.start()
    return port

def main():
    # Step 1: Fetch data
    run_fetcher()

    # Step 2: Start server
    print("[2/3] Starting local server...")
    port = start_server()
    time.sleep(0.5)

    # Step 3: Open browser
    url = f"http://127.0.0.1:{port}/frontend/index.html"
    print(f"[3/3] Opening dashboard: {url}")
    webbrowser.open(url)

    print("\n[INFO] Server running at", url)
    print("[INFO] Press Ctrl+C to stop")

    try:
        while True:
            time.sleep(1)
    except KeyboardInterrupt:
        print("\n[INFO] Stopped.")

if __name__ == "__main__":
    main()
