import itertools
import csv
import random
import numpy as np
from pyproj import Proj, transform

# Koordinaten der Extrempunkte von Berlin in WGS84
nordwest = (52.6755, 13.0883)
südost = (52.3384, 13.7600)

# Schritte für die Breite und Länge eines Quadrats (1 km)
schritt_breitengrad = 0.009002
schritt_laengengrad = 0.014794

interval = [7200.0, 14400.0, 18000.0, 21600.0, 25200.0, 28800.0, 32400.0, 36000.0, 39600.0, 43200.0, 46800.0, 50400.0, 54000.0, 57600.0, 61200.0, 64800.0, 68400.0, 72000.0, 79200.0, 82800.0]

# Dateinamen für die CSV-Dateien
csv_datei_wgs84 = "berlin_quadrate_wgs84.csv"
csv_datei_31468 = "berlin_quadrate_31468.csv"
csv_datei_25832 = "berlin_quadrate_25832.csv"

# Erzeugen Sie eine Liste von Koordinaten für die Mittelpunkte der Quadrate
mittelpunkte = []
for lat in itertools.count(nordwest[0], -schritt_breitengrad):
    if lat < südost[0]:
        break
    for lon in itertools.count(nordwest[1], schritt_laengengrad):
        if lon > südost[1]:
            break
        mittelpunkte.append((lat - schritt_breitengrad / 2, lon + schritt_laengengrad / 2))

# Funktion zur Transformation der Koordinaten in ein anderes Referenzsystem
def transform_coordinates(src_proj, dst_proj, coords):
    return transform(src_proj, dst_proj, coords[0], coords[1])

# Schreiben Sie die Koordinaten und zufällige Werte in die CSV-Dateien
for csv_datei, epsg_code in [(csv_datei_wgs84, 'EPSG:4326'), (csv_datei_31468, 'EPSG:31468'), (csv_datei_25832, 'EPSG:25832')]:
    with open(csv_datei, mode='w', newline='') as file:
        writer = csv.writer(file)
        writer.writerow(["# " + epsg_code])  # Füge das EPSG-Code-Kommentar hinzu
        writer.writerow(["time", "x", "y", "value"])

        previous_value = None  # Vorheriger zufälliger Wert
        for i, (lat, lon) in enumerate(mittelpunkte):
            
            for index, time in enumerate(interval):
                x = lon  # Längengrad in WGS84
                y = lat  # Breitengrad in WGS84
    
                # Koordinatentransformation in das gewünschte Referenzsystem
                if epsg_code != 'EPSG:4326':
                    src_proj = Proj(init='epsg:4326')
                    dst_proj = Proj(init=epsg_code)
                    x, y = transform_coordinates(src_proj, dst_proj, (x, y))
    
                # Generieren Sie einen zufälligen Wert aus einer Normalverteilung
                if previous_value is not None:
                    mean = previous_value
                    std_deviation = 10  # Standardabweichung
                    value = max(0, min(100, random.gauss(mean, std_deviation)))
                else:
                    value = random.uniform(0, 100)
    
                writer.writerow([time, x, y, value])
                previous_value = value
