#!/usr/bin/env python
import argparse
import glob
import json
import sys
import os

from datums import __version__

from datums import pipeline
from datums.pipeline import add
from datums.pipeline import update
from datums.pipeline import delete

from datums import models
from datums.models import base

'''bin/datums provides entry point main().'''


def create_parser():
    # Breaking out argument parsing for easier testing
    parser = argparse.ArgumentParser(
        prog='datums', description='PostgreSQL pipeline for Reporter.', usage='%(prog)s [options]')
    parser.add_argument('-v', '--version', action='store_true')
    parser.add_argument('--setup', action='store_true',
                        help='Setup the datums database')
    parser.add_argument('--teardown', action='store_true',
                        help='Tear down the datums database')
    parser.add_argument('-A', '--add',
                        help='Add the reports in file(s) specified')
    parser.add_argument('-U', '--update',
                        help='Update the reports in the file(s) specified')
    parser.add_argument('-D', '--delete',
                        help='Delete the reports in the file(s) specified from the database')
    return parser


def main():
    '''Runs program and handles command line options.'''
    parser = create_parser()
    args = parser.parse_args()

    if args.version:
        print __version__
    if args.setup:
        base.database_setup(base.engine)
    if args.teardown:
        base.database_teardown(base.engine)
    if args.add:
        files = glob.glob(os.path.expanduser(args.add))
        for file in files:
            with open(file, 'r') as f:
                reports = json.load(f)
            # Add questions first because reports need them
            for question in reports['questions']:
                add.add_question(question)
            for snapshot in reports['snapshots']:
                add.add_report(snapshot)
    if args.update:
        files = glob.glob(os.path.expanduser(args.update))
        for file in files:
            with open(file, 'r') as f:
                reports = json.load(f)
            for snapshot in reports['snapshots']:
                update.update_report(snapshot)
    if args.delete:
        files = glob.glob(os.path.expanduser(args.update))
        for file in files:
            with open(file, 'r') as f:
                reports = json.load(f)
            for snapshot in file['snapshots']:
                delete.delete_report(snapshot)


if __name__ == '__main__':
    main()
