#!/usr/bin/env python

#
# ddr-signatures
#

description = """Picks signature files for each object in a collection and, updates metadata files."""

epilog = """
---"""


import argparse
import logging
import sys

from DDR import config
from DDR import identifier
from DDR import signatures
from DDR import util

logging.basicConfig(
    level=logging.DEBUG,
    format='%(asctime)s %(levelname)-8s %(message)s',
    stream=sys.stdout,
)

def main():
    parser = argparse.ArgumentParser(
        description=description,
        epilog=epilog,
        formatter_class=argparse.RawDescriptionHelpFormatter
    )
    parser.add_argument('collection', help='Absolute path to Collection.')
    parser.add_argument('-W', '--nowrite', help='Do not write changes.')
    parser.add_argument('-C', '--nocommit', help='Do not commit changes.')
    parser.add_argument('-u', '--user', help='(required for commit) User name')
    parser.add_argument('-m', '--mail', help='(required for commit) User email')
    args = parser.parse_args()
    if not args.nocommit:
        if not (args.user and args.mail):
            logging.debug('You must specify a user and email address! >:-0')
            sys.exit(1)

    logging.debug('-----------------------------------------------')
    logging.debug('Loading collection')
    collection = identifier.Identifier(args.collection).object()
    logging.debug(collection)

    paths = util.find_meta_files(args.collection, recursive=True, force_read=True)
    # Read data files, gather *published* Identifiers, map parents->nodes
    parents = signatures.choose(paths)
    # Read collection .json files, assign signatures, write files
    updates = signatures.find_updates(parents)

    if args.nowrite:
        logging.debug('Not writing changes')
        files_written = []
    else:
        files_written = signatures.write_updates(updates)

    if args.nocommit:
        logging.debug('Not committing changes')
    elif files_written:
        if (not args.user) or (not args.mail):
            logging.debug('You must specify a user and email address! >:-0')
            sys.exit(1)
        status,msg = signatures.commit_updates(
            collection,
            files_written,
            args.user, args.mail, agent='ddr-signature',
            commit=True
        )
    logging.debug('DONE')


if __name__ == '__main__':
    main()
