import json
from pathlib import Path
import xml.etree.ElementTree as ET
import osm2streets_python

root = Path('/home/alina/osm2streets')
osm = (root / 'bologna-test.osm').read_bytes()

# Misura separatamente i dati OSM espliciti dalle geometrie inferite.
tree = ET.fromstring(osm)
road_ways = []
for way in tree.findall('way'):
    tags = {tag.attrib['k']: tag.attrib['v'] for tag in way.findall('tag')}
    if 'highway' in tags:
        road_ways.append(tags)
lane_tagged = [t for t in road_ways if t.get('lanes') or t.get('lanes:forward') or t.get('lanes:backward')]
turn_tagged = [t for t in road_ways if any(k.startswith('turn:lanes') for k in t)]
marking_tagged = [t for t in road_ways if t.get('lane_markings') is not None or t.get('divider') is not None]
change_tagged = [t for t in road_ways if any(k.startswith('change:lanes') for k in t)]
major_classes = {'motorway', 'motorway_link', 'trunk', 'trunk_link', 'primary', 'primary_link', 'secondary', 'secondary_link'}
major = [t for t in road_ways if t.get('highway') in major_classes]
major_lanes = [t for t in major if t.get('lanes') or t.get('lanes:forward') or t.get('lanes:backward')]
print(f'OSM explicit: roads={len(road_ways)} lanes={len(lane_tagged)} ({100*len(lane_tagged)/max(1,len(road_ways)):.1f}%) '
      f'major_lanes={len(major_lanes)}/{len(major)} ({100*len(major_lanes)/max(1,len(major)):.1f}%) '
      f'turn_lanes={len(turn_tagged)} ({100*len(turn_tagged)/max(1,len(road_ways)):.1f}%) '
      f'lane_markings={len(marking_tagged)} ({100*len(marking_tagged)/max(1,len(road_ways)):.1f}%) '
      f'change_lanes={len(change_tagged)} ({100*len(change_tagged)/max(1,len(road_ways)):.1f}%)')
options = json.dumps({
    'debug_each_step': False,
    'dual_carriageway_experiment': False,
    'sidepath_zipping_experiment': False,
    # Non aggiungere marciapiedi o cordoli non presenti nei dati.
    'inferred_sidewalks': False,
    'inferred_kerbs': False,
    'date_time': None,
    'override_driving_side': 'Right',
})

network = osm2streets_python.PyStreetNetwork(osm, '', options)
outputs = {
    'lanes': network.to_lane_polygons_geojson(),
    'lane_markings': network.to_lane_markings_geojson(),
    'intersection_markings': network.to_intersection_markings_geojson(),
    'network': network.to_geojson_plain(),
}

out_dir = root / 'bologna-output'
out_dir.mkdir(exist_ok=True)
for name, raw in outputs.items():
    parsed = json.loads(raw)
    (out_dir / f'{name}.geojson').write_text(
        json.dumps(parsed, separators=(',', ':')), encoding='utf-8'
    )
    types = {}
    for feature in parsed.get('features', []):
        props = feature.get('properties') or {}
        key = str(props.get('type') or props.get('lane_type') or props.get('kind') or 'unknown')
        types[key] = types.get(key, 0) + 1
    print(f'{name}: features={len(parsed.get("features", []))} bytes={len(raw)} types={types}')
