import gradio as gr
import random

locations = {
    "Downtown": {"lat": -1.95, "lon": 30.05},
    "Highway": {"lat": -1.92, "lon": 30.06},
    "Industrial Area": {"lat": -1.94, "lon": 30.07},
    "School Zone": {"lat": -1.93, "lon": 30.03}
}

tile_layers = {
    "Light": {
        "url": "https://{s}.basemaps.cartocdn.com/light_all/{z}/{x}/{y}.png",
        "attribution": '&copy; <a href="https://carto.com/">CartoDB</a> contributors'
    },
    "Dark": {
        "url": "https://{s}.basemaps.cartocdn.com/dark_all/{z}/{x}/{y}.png",
        "attribution": '&copy; <a href="https://carto.com/">CartoDB</a> contributors'
    },
    "Satellite": {
        "url": "https://{s}.google.com/vt/lyrs=s&x={x}&y={y}&z={z}",
        "attribution": "Β© Google",
        "subdomains": ["mt0", "mt1", "mt2", "mt3"]
    }
}

def simulate_map_style(style):
    markers = ""
    alerts = []

    for name, info in locations.items():
        speed = round(random.gauss(30, 15), 1)
        vehicles = int(random.gauss(40, 15))

        if speed < 20 and vehicles > 50:
            status = "🚦 Heavy Traffic"
            color = "red"
        elif speed < 40 or vehicles > 40:
            status = "⚠️ Moderate Traffic"
            color = "orange"
        else:
            status = "βœ… Light Traffic"
            color = "green"

        alerts.append(f"πŸ“ {name}: {status} β€” {speed} km/h, {vehicles} cars")

        markers += f"""
        L.circleMarker([{info['lat']}, {info['lon']}], {{
            color: '{color}',
            radius: 10
        }}).addTo(map).bindPopup("<b>{name}</b><br>Speed: {speed} km/h<br>Cars: {vehicles}<br>Status: {status}");"""

    layer = tile_layers[style]
    subdomains_str = f", subdomains: {layer['subdomains']}" if "subdomains" in layer else ""

    html = f"""
    <div id="map" style="width:100%; height:500px;"></div>
    <link rel="stylesheet" href="https://unpkg.com/leaflet/dist/leaflet.css"/>
    <script src="https://unpkg.com/leaflet/dist/leaflet.js"></script>
    <script>
      var map = L.map('map').setView([-1.935, 30.05], 13);
      L.tileLayer('{layer['url']}', {{
        attribution: '{layer['attribution']}',
        maxZoom: 19
        {subdomains_str}
      }}).addTo(map);
      L.control.zoom({{ position: 'topright' }}).addTo(map);
      {markers}
    </script>
    """

    return "\n".join(alerts), html

with gr.Blocks() as demo:
    gr.Markdown("## πŸ—ΊοΈ Traffic Map with Style Selector (Light, Dark, Satellite)")

    style_dropdown = gr.Dropdown(label="Hitamo Style ya Map", choices=list(tile_layers.keys()), value="Light")
    btn = gr.Button("πŸ” Refresh Traffic Data")
    report = gr.Textbox(label="Traffic Report", lines=8)
    map_html = gr.HTML()

    btn.click(fn=simulate_map_style, inputs=style_dropdown, outputs=[report, map_html])

demo.launch()