
#!/usr/bin/env python3

import os
import sys
import osmium


INPUT = sys.argv[1]
OUTPUT = sys.argv[2]


WAY_TAGS = {

    "highway",

    "maxspeed",
    "maxspeed:forward",
    "maxspeed:backward",
    "maxspeed:conditional",
    "maxspeed:type",
    "source:maxspeed",
    "zone:maxspeed",

    "oneway",
    "junction",

    "access",
    "vehicle",
    "motor_vehicle",
    "motorcar",

    "service",

    # Conservés pour le map matching / debug.
    # Pourront être supprimés ultérieurement si inutiles.
    "ref",
    "name",
}


WAY_PREFIXES = (
    "maxspeed:",
)


RELATION_TAGS = {

    "type",

    "restriction",

    "restriction:conditional",

    "except",
}


RELATION_PREFIXES = (
    "restriction:",
)


def filter_tags(tags, allowed, prefixes=()):

    result = {}

    for tag in tags:

        key = tag.k

        if key in allowed:

            result[key] = tag.v

            continue

        if any(
            key.startswith(prefix)
            for prefix in prefixes
        ):

            result[key] = tag.v

    return result


class Handler(osmium.SimpleHandler):

    def __init__(self, writer):

        super().__init__()

        self.writer = writer

        self.nodes = 0
        self.ways = 0
        self.relations = 0


    def node(self, node):

        self.nodes += 1

        if len(node.tags):

            node = node.replace(tags={})

        self.writer.add_node(node)


    def way(self, way):

        self.ways += 1

        tags = filter_tags(
            way.tags,
            WAY_TAGS,
            WAY_PREFIXES,
        )

        self.writer.add_way(
            way.replace(tags=tags)
        )


    def relation(self, relation):

        self.relations += 1

        tags = filter_tags(
            relation.tags,
            RELATION_TAGS,
            RELATION_PREFIXES,
        )

        self.writer.add_relation(
            relation.replace(tags=tags)
        )


if os.path.exists(OUTPUT):
    os.unlink(OUTPUT)


writer = osmium.SimpleWriter(OUTPUT)

handler = Handler(writer)


try:

    handler.apply_file(
        INPUT,
        locations=False,
    )

finally:

    writer.close()


print(
    f"nodes={handler.nodes} "
    f"ways={handler.ways} "
    f"relations={handler.relations}"
)

