#!python

import sys
import getopt

from esgcet.config import loadConfig, initLogging
from esgcet.query import printResult, getGatewayDatasetMetadata, getGatewayDatasetChildren, getGatewayExperiments, getGatewayDatasetFields, getGatewayDatasetFiles, getGatewayDatasetAccessPoints

usage = """Usage:
    esgquery_gateway [options]

    Query gateway metadata.

Arguments:

Options:

    -h, --help:
        Print a help message.

    -i init_dir:
        Directory containing all initialization files.
        Recommended: one initialization file for the default sections (esg.ini) and one per project, must match the name format esg.<project>.ini
        If not specified, the default installed init files are read.

    --files parent_dataset:
        List the data files in the parent dataset.

    --list parent_dataset:
        List children of a parent dataset. Use --verbose to list all metadata for each child dataset.

    --experiments:
        Generate a list of experiments.

    --metadata dataset:
        List the metadata associated with a dataset.

    --service-url service:
        URL of the remote metadata service. Defaults to the configured value
        of hessian_service_remote_metadata_url

    --urls parent_dataset:
        List file access point URLs. This is similar to --files, but will list each access point
        of a file.

    --verbose:
        With --list, print full metadata for each child dataset.

"""

def main(argv):

    try:
        args, lastargs = getopt.getopt(argv, "hi:", ['files=', 'help', 'experiments', 'list=', 'list-experiments', 'metadata=', 'service-url=', 'urls=', 'verbose'])
    except getopt.error:
        print sys.exc_value
        print usage
        sys.exit(0)

    datasetName = None
    filesParent = None
    init_dir = '/esg/config/esgcet/'
    listDatasetChildren = False
    listExperiments = False
    listFiles = False
    listMetadata = False
    listUrls = False
    parentDataset = None
    serviceUrl = None
    urlParent = None
    verbose = False
    for flag, arg in args:
        if flag=='--files':
            listFiles = True
            filesParent = arg
        elif flag in ['-h', '--help']:
            print usage
            sys.exit(0)
        elif flag=='-i':
            init_dir = arg
        elif flag=='--list':
            listDatasetChildren = True
            parentDataset = arg
        elif flag in ['--experiments', '--list-experiments']:
            listExperiments = True
        elif flag=='--metadata':
            listMetadata = True
            datasetName = arg
        elif flag=='--service-url':
            serviceUrl = arg
        elif flag=='--urls':
            listUrls = True
            urlParent = arg
        elif flag=='--verbose':
            verbose = True

    # Load the configuration and set up a database connection
    config = loadConfig(init_dir)
    initLogging('DEFAULT')

    if listDatasetChildren:
        result = getGatewayDatasetChildren(parentDataset, serviceUrl=serviceUrl)
        if not verbose:
            for childid in result:
                print childid
        else:
            fullresult = [getGatewayDatasetMetadata(item, serviceUrl=serviceUrl) for item in result]
            printResult(getGatewayDatasetFields(), fullresult)

    if listMetadata:
        header = getGatewayDatasetFields()
        result = getGatewayDatasetMetadata(datasetName, serviceUrl=serviceUrl)
        printResult(header, [result])

    if listExperiments:
        header, result = getGatewayExperiments(serviceUrl=serviceUrl)
        printResult(header, result)

    if listFiles:
        header, result = getGatewayDatasetFiles(filesParent, serviceUrl=serviceUrl)
        printResult(header, result)

    if listUrls:
        header, result = getGatewayDatasetAccessPoints(urlParent, serviceUrl=serviceUrl)
        printResult(header, result)

if __name__=='__main__':
    main(sys.argv[1:])
