#!/usr/bin/env python3
"""
Script zum Herunterladen von OSM Bright Tiles für die Region Regensburg
"""

import os
import requests
import math
from pathlib import Path

# Regensburg Koordinaten und Bereich
REGENSBURG_LAT = 49.0195
REGENSBURG_LON = 12.0975
BOUNDING_BOX_SIZE = 0.1  # ~11km Radius

# Zoom-Level (10-18 für mehr Detail beim Reinzoomen)
MIN_ZOOM = 10
MAX_ZOOM = 18

# Output-Verzeichnis (sowohl server als auch flutter assets)
OUTPUT_DIR_SERVER = Path("/var/www/regensburg.j-jn.com/server/maps/tiles")
OUTPUT_DIR_FLUTTER = Path("/var/www/regensburg.j-jn.com/flutter/app/assets/maps/tiles")

def deg2num(lat_deg, lon_deg, zoom):
    """Konvertiert Koordinaten zu Tile-Nummern"""
    lat_rad = math.radians(lat_deg)
    n = 2.0 ** zoom
    xtile = int((lon_deg + 180.0) / 360.0 * n)
    ytile = int((1.0 - math.asinh(math.tan(lat_rad)) / math.pi) / 2.0 * n)
    return (xtile, ytile)

def download_tile(z, x, y, output_dirs):
    """Lädt ein einzelnes OSM Tile herunter und speichert es in beiden Verzeichnissen"""
    # Verwende normalen OSM Mapnik (ähnlich OSM Bright)
    url = f"https://tile.openstreetmap.de/{z}/{x}/{y}.png"
    
    # Prüfe ob bereits vorhanden (nur in Flutter-Ordner prüfen)
    tile_path_flutter = output_dirs['flutter'] / str(z) / str(x) / f"{y}.png"
    if tile_path_flutter.exists():
        return True
    
    try:
        response = requests.get(url, headers={'User-Agent': 'RegensburgApp/1.0 (https://regensburg.j-jn.com)'}, timeout=10)
        if response.status_code == 200 and len(response.content) > 1000:  # Mindestens 1KB (weiße Tiles sind kleiner)
            # Speichere in beiden Verzeichnissen
            for output_dir in output_dirs.values():
                tile_path = output_dir / str(z) / str(x) / f"{y}.png"
                tile_path.parent.mkdir(parents=True, exist_ok=True)
                tile_path.write_bytes(response.content)
            return True
        else:
            print(f"Warnung: Tile {z}/{x}/{y} zu klein oder Fehler (Status: {response.status_code})")
            return False
    except Exception as e:
        print(f"Fehler beim Download von {url}: {e}")
        return False

def main():
    print("Starte Download der OSM Tiles für Regensburg (Zoom 10-18)...")
    
    # Erstelle beide Output-Verzeichnisse
    OUTPUT_DIR_SERVER.mkdir(parents=True, exist_ok=True)
    OUTPUT_DIR_FLUTTER.mkdir(parents=True, exist_ok=True)
    
    output_dirs = {
        'server': OUTPUT_DIR_SERVER,
        'flutter': OUTPUT_DIR_FLUTTER
    }
    
    # Berechne Tile-Bereich für alle Zoom-Level
    total_tiles = 0
    downloaded = 0
    
    for zoom in range(MIN_ZOOM, MAX_ZOOM + 1):
        print(f"\nZoom-Level {zoom}...")
        
        # Berechne Bounding Box
        min_lat = REGENSBURG_LAT - BOUNDING_BOX_SIZE
        max_lat = REGENSBURG_LAT + BOUNDING_BOX_SIZE
        min_lon = REGENSBURG_LON - BOUNDING_BOX_SIZE
        max_lon = REGENSBURG_LON + BOUNDING_BOX_SIZE
        
        # Konvertiere zu Tile-Koordinaten
        x_min, y_max = deg2num(min_lat, min_lon, zoom)
        x_max, y_min = deg2num(max_lat, max_lon, zoom)
        
        # Erweitere Bereich leicht für Sicherheit
        x_min -= 1
        x_max += 1
        y_min -= 1
        y_max += 1
        
        zoom_tiles = (x_max - x_min + 1) * (y_max - y_min + 1)
        total_tiles += zoom_tiles
        
        print(f"  Bereich: x={x_min}-{x_max}, y={y_min}-{y_max} ({zoom_tiles} Tiles)")
        
        for x in range(x_min, x_max + 1):
            for y in range(y_min, y_max + 1):
                if download_tile(zoom, x, y, output_dirs):
                    downloaded += 1
                if downloaded % 10 == 0:
                    print(f"  {downloaded}/{total_tiles} Tiles heruntergeladen...", end='\r')
    
    print(f"\n\nFertig! {downloaded} Tiles heruntergeladen.")
    print(f"Tiles gespeichert in:")
    print(f"  - {OUTPUT_DIR_SERVER}")
    print(f"  - {OUTPUT_DIR_FLUTTER}")

if __name__ == "__main__":
    main()

