#!/usr/bin/env python

r"""
This is a simple script that will create an export of an m4db database from the NEB path perspective. That means
that NEB paths with given unique ids (or all NEB paths) are exported along with all dependencies (i.e. parent NEB
paths, start/end Model objects, DBUser objects etc.) which may then be imported to create a functioning m4db database
along with data files.

@author L. Nagy, W. Williams
"""
import sys
import os

from argparse import ArgumentParser

from m4db_database.export_data_files_utilities import export_geometry_data_files_by_unique_id
from m4db_database.export_data_files_utilities import export_model_data_files_by_unique_id
from m4db_database.export_data_files_utilities import export_neb_data_files_by_unique_id

from m4db_database.dependency_exporter import neb_dependencies

from m4db_database.export_json_utilities import export_db_user
from m4db_database.export_json_utilities import export_software
from m4db_database.export_json_utilities import export_unit
from m4db_database.export_json_utilities import export_physical_constant
from m4db_database.export_json_utilities import export_size_convention
from m4db_database.export_json_utilities import export_anisotropy_form
from m4db_database.export_json_utilities import export_neb_calculation_type
from m4db_database.export_json_utilities import export_material
from m4db_database.export_json_utilities import export_geometry_by_unique_id
from m4db_database.export_json_utilities import export_model_by_unique_id
from m4db_database.export_json_utilities import export_neb_by_unique_id


def get_command_line_parser():
    r"""
    Retrieve a command line parser object for this script.

    Returns:
        A command line parser object for this script.

    """
    parser = ArgumentParser()

    parser.add_argument("dir_path",
                        help="output directory, will contain all files pertaining to the import.")
    parser.add_argument("-l", "--list", action="append",
                        help="a list of neb unique ids")
    parser.add_argument("-f", "--formatted", action="store_true",
                        help="flag to indicate whether the output should be formatted")
    return parser


def main():
    parser = get_command_line_parser()
    args = parser.parse_args()

    print("Exporting NEB paths with given unique IDs")

    if args.list is None:
        print("No NEB unique ids selected!")
        sys.exit(1)

    if not os.path.isdir(args.dir_path):
        os.mkdir(args.dir_path)

    print("Resolving dependencies")
    geometry_uids, model_uids, neb_uids = neb_dependencies(args.list)

    # Export all the *.json metadata files
    print("Exporting")
    export_db_user(args.dir_path, format_json=args.formatted)
    export_software(args.dir_path, format_json=args.formatted)
    export_unit(args.dir_path, format_json=args.formatted)
    export_physical_constant(args.dir_path, format_json=args.formatted)
    export_size_convention(args.dir_path, format_json=args.formatted)
    export_anisotropy_form(args.dir_path, format_json=args.formatted)
    export_neb_calculation_type(args.dir_path, format_json=args.formatted)
    export_material(args.dir_path, format_json=args.formatted)

    export_geometry_by_unique_id(args.dir_path, geometry_uids, format_json=args.formatted)
    export_geometry_data_files_by_unique_id(args.dir_path, geometry_uids, zipped=True, remove_geometry_dir=True)

    export_model_by_unique_id(args.dir_path, model_uids, format_json=args.formatted)
    export_model_data_files_by_unique_id(args.dir_path, model_uids, zipped=True, remove_model_dir=True)

    export_neb_by_unique_id(args.dir_path, neb_uids, format_json=args.formatted)
    export_neb_data_files_by_unique_id(args.dir_path, neb_uids, zipped=True, remove_neb_dir=True)

    print("Done!")


if __name__ == "__main__":
    main()
