#!/usr/bin/env python3

"""
Connects to the graph query service and dumps all graph edges in Turtle
format.
"""

import rdflib
import io
import sys
import argparse
import os

from trustgraph.api import Api, Uri

default_url = os.getenv("TRUSTGRAPH_URL", 'http://localhost:8088/')
default_user = 'trustgraph'
default_collection = 'default'

def show_graph(url, user, collection):

    api = Api(url)

    rows = api.triples_query(
        s=None, p=None, o=None,
        limit=10_000)
#         user=user, collection=collection,

    g = rdflib.Graph()

    for row in rows:

        sv = rdflib.term.URIRef(row.s)
        pv = rdflib.term.URIRef(row.p)

        if isinstance(row.o, Uri):

            # Skip malformed URLs with spaces in
            if " " in row.o:
                continue

            ov = rdflib.term.URIRef(row.o)

        else:

            ov = rdflib.term.Literal(row.o)

        g.add((sv, pv, ov))

    g.serialize(destination="output.ttl", format="turtle")

    buf = io.BytesIO()

    g.serialize(destination=buf, format="turtle")

    sys.stdout.write(buf.getvalue().decode("utf-8"))


def main():

    parser = argparse.ArgumentParser(
        prog='tg-graph-to-turtle',
        description=__doc__,
    )

    parser.add_argument(
        '-u', '--api-url',
        default=default_url,
        help=f'API URL (default: {default_url})',
    )

    parser.add_argument(
        '-U', '--user',
        default=default_user,
        help=f'User ID (default: {default_user})'
    )

    parser.add_argument(
        '-C', '--collection',
        default=default_collection,
        help=f'Collection ID (default: {default_collection})'
    )

    args = parser.parse_args()

    try:

        show_graph(
            url=args.api_url,
            user=args.user,
            collection=args.collection
        )

    except Exception as e:

        print("Exception:", e, flush=True)

main()

