import system
import wifi
import display
import gc
import buttons
import urequests as requests
import sys
import mch22

# Simple logging implementation
class Logger:
    INFO = 1
    ERROR = 2
    DEBUG = 3
    
    def __init__(self, name):
        self.name = name
    
    def _log(self, level, msg):
        level_str = "INFO" if level == self.INFO else "ERROR" if level == self.ERROR else "DEBUG"
        print(f"[{level_str}] {self.name}: {msg}")
    
    def info(self, msg):
        self._log(self.INFO, msg)
    
    def error(self, msg):
        self._log(self.ERROR, msg)
    
    def debug(self, msg):
        self._log(self.DEBUG, msg)

# Create logger instance
logger = Logger(__name__)

def draw_error(message, details=""):
    """Utility function to display errors consistently"""
    display.drawFill(display.WHITE)
    display.drawText(10, 10, message, 0x000000, "Roboto_Regular12")
    if details:
        display.drawText(10, 30, str(details), 0x000000, "Roboto_Regular12")
    display.flush()

def connect_to_wifi():
    if not wifi.status():
        logger.info("Connecting to WiFi...")
        wifi.connect() #("Wokwi-GUEST", "")
        display.drawFill(display.WHITE)
        display.drawText(10, 10, "Connecting to WiFi...", 0x000000, "Roboto_Regular12")
        display.flush()
        if not wifi.wait():
            logger.error("WiFi connection failed")
            system.home()
        logger.info("WiFi connected successfully")

def draw_splash():
    display.drawFill(display.WHITE)
    display.drawText(10, 10, "Getting aircraft data...", 0x000000, "Roboto_Regular12")
    display.drawText(10, 30, "Powered by ADSB.fi", 0x000000, "Roboto_Regular12")
    display.flush()

def fetch_aircraft_data():
    # Zeewolde coordinates
    lat = 52.3333
    lon = 5.5333
    dist = 25  # 25nm radius
    
    url = f"https://opendata.adsb.fi/api/v2/lat/{lat}/lon/{lon}/dist/{dist}"
    logger.info(f"Fetching aircraft data from {url}")
    r = requests.get(url)
    gc.collect()
    data = r.json()
    r.close()
    logger.info("Aircraft data fetched successfully")
    return data

def draw_aircraft(aircraft_list):
    display.drawFill(display.WHITE)
    
    # Draw header with nice border
    display.drawRect(0, 0, display.width(), 25, False, 0x000000)
    display.drawText(5, 5, f"Aircraft near Zeewolde ({len(aircraft_list)})", 0x000000, "pixelade13")
    
    if not aircraft_list:
        display.drawText(10, 40, "No aircraft in range", 0x000000, "Roboto_Regular12")
        display.flush()
        return
    
    y = 35
    for i, aircraft in enumerate(aircraft_list[:6]):  # Show max 7 aircraft for better spacing
        callsign = aircraft.get("flight", "N/A").strip()
        alt = aircraft.get("alt_baro", 0)
        speed = aircraft.get("gs", 0)  # Ground speed in knots
        alt_text = "GND" if isinstance(alt, str) else f"{int(alt)}ft"
        
        # Draw box around each aircraft entry
        display.drawRect(5, y + (i * 30) - 5, display.width() - 10, 25, False, 0x000000)
        
        # Main flight info
        display.drawText(10, y + (i * 30), callsign, 0x000000, "DejaVuSans20")
        
        # Altitude and speed on the right
        speed_text = f"{int(speed)}kt" if speed else "---"
        alt_info = f"{alt_text}/{speed_text}"
        display.drawText(display.width() - 120, y + (i * 30), alt_info, 0x000000, "Roboto_Regular12")
    
    # Draw footer
    footer_y = y + (6 * 30)
    display.drawLine(0, footer_y, display.width(), footer_y, 0x000000)
    display.drawText(5, footer_y + 5, "A: Refresh | HOME: Exit", 0x000000, "Roboto_Regular12")
    
    display.flush()

def main():
    try:
        logger.info("Starting application")
        connect_to_wifi()
        draw_splash()
        
        data = fetch_aircraft_data()
        aircraft_list = data.get("aircraft", [])
        draw_aircraft(aircraft_list)
    except Exception as exc:
        sys.print_exception(exc)
        error_msg = f"Error in main: {type(exc).__name__} - {str(exc)}"
        logger.error(error_msg)
        draw_error("Application Error", error_msg)

def cb_home(pressed):
    logger.info("Home callback triggered")
    if pressed:
        logger.info("Home button pressed")
        mch22.exit_python()

def cb_refresh(pressed):
    logger.info("Refresh callback triggered")
    if pressed:
        logger.info("Refresh button pressed")
        try:
            data = fetch_aircraft_data()
            aircraft_list = data.get("aircraft", [])
            draw_aircraft(aircraft_list)
        except Exception as exc:
            sys.print_exception(exc)
            error_msg = f"Error during refresh: {str(exc)}"
            logger.error(error_msg)
            draw_error("Error fetching data", error_msg)

buttons.attach(buttons.BTN_HOME, cb_home)
buttons.attach(buttons.BTN_A, cb_refresh)

main()