import requests
import os
from urllib.parse import urlparse
import socket

# SPARQL-Abfrage zur Abholung der Ämter und ihrer Webseiten
SPARQL_ENDPOINT = "https://query.wikidata.org/sparql"
SPARQL_QUERY = """
SELECT distinct ?amt ?amtLabel ?ars ?www
WHERE {

    # Finde alle Ämter in Schleswig-Holstein
    ?amt wdt:P31 ?typ;   
         wdt:P131 ?kreis .   

    # Typen von Interesse: Amt
    VALUES ?typ { wd:Q478847}

    ?amt wdt:P131 ?kreis.
    ?kreis wdt:P31 wd:Q61856889;      # Instanz von: Kreis in Schleswig-Holstein
  
    MINUS { ?amt wdt:P576 [] }
    MINUS { ?amt wdt:P1366 [] }
           
    # Amtlicher Regionalschlüssel
    OPTIONAL { ?amt wdt:P1388 ?ars. }

    # Webseite
    OPTIONAL { ?amt wdt:P856 ?www. }
  
    SERVICE wikibase:label { bd:serviceParam wikibase:language "de". }
} ORDER BY ?ars
"""

def get_sparql_data(query, endpoint=SPARQL_ENDPOINT):
    """Führe die SPARQL-Abfrage aus und gebe das Ergebnis zurück."""

    response = requests.get(endpoint, params={"query": query, "format": "json"})
    
    if response.status_code == 200:
        return response.json()
    else:
        print(f"Fehler bei der Abfrage: {response.status_code}")
        return None

def get_ip_address(www):
    hostname = urlparse(www).hostname

    if hostname:
        # IPv4-Adresse ermitteln
        try:
            ipv4 = socket.gethostbyname(hostname)
            try:
                response = requests.get(f"https://ipinfo.io/{ipv4}/json")
                data = response.json()
                org = data.get('org')
            except Exception as e:
                print(f"Fehler bei ipinfo.io-Abfrage: {e}")
                org = ''
        except socket.gaierror:
            pass

        # IPv6-Adresse ermitteln
        try:
            ipv6 = socket.getaddrinfo(hostname, None, socket.AF_INET6)[0][4][0]
        except (socket.gaierror, IndexError):
            pass
            ipv6 = ''

    return [ipv4, org, ipv6]

def main():
    data = get_sparql_data(SPARQL_QUERY)
    
    if data:
        for item in data['results']['bindings']:
            amt_label = item['amtLabel']['value']
            ars = item['ars']['value']
            www = item.get('www', {}).get('value')
            
            if www:
                host_data = get_ip_address(www)
                print(f"{ars},{amt_label},{www},{host_data[0]},{host_data[1]},{host_data[2]}")
                
            else:
                print(f"Keine Webseite für {amt_label} gefunden.")

if __name__ == "__main__":
    main()
