#!/usr/bin/env python3
"""Populate InfluxDB with Smart City sensor data for Martinique."""
import os
import time
import random
from datetime import datetime, timezone

try:
    import influxdb_client
    from influxdb_client.client.write_api import SYNCHRONOUS
except ImportError:
    print("❌ influxdb-client not installed. Run: pip install influxdb-client")
    exit(1)

# Config
INFLUX_URL = os.environ.get("INFLUX_URL", "http://localhost:8086")
INFLUX_ORG = os.environ.get("INFLUX_ORG", "digitribe")
INFLUX_BUCKET = os.environ.get("INFLUX_BUCKET", "iot_data")
INFLUX_TOKEN = os.environ.get("INFLUX_TOKEN", 
    "yA8zFZYsPOLDdDxlviIfHw_5gELH8k439TANamk2JiJIyAbhyNCHDzUeYJkjL-hAy99fs_96j_59WprZy98A==")

# Martinique coordinates (Fort-de-France area)
BASE_LAT = 14.6091
BASE_LON = -61.2155

# Sensor types and their fields
SENSOR_TYPES = {
    "traffic": {
        "fields": {"vehicle_count": (10, 150), "average_speed_kmh": (10, 80), "congestion_level": (0, 5)},
        "locations": ["Carrefour Central", "Avenue des Caraïbes", "Boulevard Pasteur", "Rue des Flamboyants", "Place de la République"]
    },
    "airquality": {
        "fields": {"pm25_ugm3": (5, 80), "pm10_ugm3": (10, 150), "no2_ugm3": (5, 60), "o3_ugm3": (20, 120)},
        "locations": ["Quartier Bonde", "Port de Fort-de-France", "Château Denis", "Lamentin Aéroport"]
    },
    "parking": {
        "fields": {"total_spots": (50, 500), "available_spots": (0, 500), "occupancy_percent": (0, 100)},
        "locations": ["Parking Rivière-Salée", "Parking Cluny", "Parking Médoc", "Parking Grand-Camp"]
    },
}

def main():
    print("📈 Connecting to InfluxDB...")
    client = influxdb_client.InfluxDBClient(url=INFLUX_URL, token=INFLUX_TOKEN, org=INFLUX_ORG)
    write_api = client.write_api(write_options=SYNCHRONOUS)
    
    points = []
    now = datetime.now(timezone.utc)
    
    print("📊 Generating sensor data for Martinique...")
    
    for stype, config in SENSOR_TYPES.items():
        for i, location in enumerate(config["locations"]):
            sid = f"{stype}_{i:03d}"
            lat = BASE_LAT + random.uniform(-0.05, 0.05)
            lon = BASE_LON + random.uniform(-0.05, 0.05)
            
            for field, (lo, hi) in config["fields"].items():
                value = round(random.uniform(lo, hi), 1)
                p = influxdb_client.Point(stype)\
                    .tag("sensor_id", sid)\
                    .tag("location", location)\
                    .field(field, float(value))\
                    .field("lat", lat)\
                    .field("lon", lon)\
                    .time(now)
                points.append(p)
    
    print(f"📤 Writing {len(points)} points to bucket '{INFLUX_BUCKET}'...")
    write_api.write(bucket=INFLUX_BUCKET, record=points)
    print(f"✅ Done! {len(points)} points written.")
    
    client.close()

if __name__ == "__main__":
    main()
