#!/usr/bin/env python
"""
parse_versa_model

Tool to parse Versa

"""

import re
import sys
import os
import glob
import time
import argparse
from itertools import islice
import logging

import rdflib
from rdflib import URIRef, Literal
from amara3 import iri

#from amara.thirdparty import httplib2, json
#from amara.lib.iri import relativize, absolutize

from rdflib import URIRef, Literal, RDF

from versa import I, VERSA_BASEIRI, ORIGIN, RELATIONSHIP, TARGET
from versa.driver import memory
from versa import VERSA_BASEIRI
from versa.reader.md import from_markdown
from versa.writer.rdfs import write

TYPE_REL = I(iri.absolutize('type', VERSA_BASEIRI))
VNS = rdflib.Namespace(VERSA_BASEIRI)

RDF_NAMESPACE = 'http://www.w3.org/1999/02/22-rdf-syntax-ns#'
RDFS_NAMESPACE = 'http://www.w3.org/2000/01/rdf-schema#'

def run(inputs=None, base=None, config=None, jsonf=None, rdfttl=None, rdfxml=None, rdfsonly=False, ns=None, verbose=False):
    '''
    See the command line help
    '''
    prefixes = dict(( pair[0].split(':', 1) for pair in ns or [] ))
    logger = logging.getLogger('parse_versa_model')
    if verbose:
        logger.setLevel(logging.DEBUG)

    config = config or {
        'autotype-h1': VERSA_BASEIRI + 'Resource',
        'autotype-h2': VERSA_BASEIRI + 'Property',
        'interpretations': {
            VERSA_BASEIRI + 'refines': VERSA_BASEIRI + 'resourceset',
            VERSA_BASEIRI + 'properties': VERSA_BASEIRI + 'resourceset',
            VERSA_BASEIRI + 'synonyms': VERSA_BASEIRI + 'resourceset',
            VERSA_BASEIRI + 'highlight': VERSA_BASEIRI + 'resourceset',
            VERSA_BASEIRI + 'scope': VERSA_BASEIRI + 'resource',
        }
    }

    def models():
        for inf in inputs:
            m = memory.connection(baseiri=base)
            base_out = from_markdown(inf.read(), m, config=config)
            m.base = base_out
            yield m
    g = write(models(), base=None, graph=None, rdfsonly=False, prefixes=None, logger=logging)

    if rdfttl: rdfttl.write(g.serialize(format="turtle"))
    if rdfxml: rdfxml.write(g.serialize(format="pretty-xml"))
    return


# Handle the command-line arguments

#import signal
#import shutil

if __name__ == '__main__':
    #parser = argparse.ArgumentParser(prog="bootstrap", add_help=False)
    parser = argparse.ArgumentParser()
    parser.add_argument('inputs', type=argparse.FileType('r'), metavar='inputs', nargs='+',
                        help='One or more Versa files to be parsed into a single model')
    parser.add_argument('--ns', metavar="prefix:iri", nargs="*", action='append',
        help='Namespace mapping')
    parser.add_argument('--json', type=argparse.FileType('wb'),
        help='file where JSON output should be written')
    parser.add_argument('--rdfttl', type=argparse.FileType('wb'),
        help='file where RDF Turtle output should be written')
    parser.add_argument('--rdfxml', type=argparse.FileType('wb'),
        help='file where RDF/XML output should be written')
    parser.add_argument('--rdfsonly', action='store_true',
        help='Strip any non RDFS or RDF vocabulary (based on property)')
    parser.add_argument('-c', '--config', type=argparse.FileType('r'),
        help='config, a Versa file whose config (in the @docheader) should be used to parse the rest')
    parser.add_argument('-b', '--base', metavar="IRI", #dest="base",
        help='Base IRI to be used for parsing the Versa. Can be overridden by a base statement within the docheader')
    parser.add_argument('-v', '--verbose', action='store_false',
        help='whether or not to show verbose error messages')
    #
    args = parser.parse_args()

    run(inputs=args.inputs, base=args.base, config=args.config, jsonf=args.json,
        rdfttl=args.rdfttl, rdfxml=args.rdfxml, rdfsonly=args.rdfsonly, ns=args.ns,
        verbose=args.verbose)
    for f in args.inputs: f.close()
    if args.config: args.config.close()
    if args.json: args.json.close()
    if args.rdfttl: args.rdfttl.close()
    if args.rdfxml: args.rdfxml.close()

