#!/usr/bin/env python
from cosymlib import Cosymlib, __version__
from cosymlib.file_io.tools import print_header, print_footer, print_input_info
from cosymlib.file_io import read_generic_structure_file
import argparse
import sys
import yaml


# positional arguments
parser = argparse.ArgumentParser(description='chirality')

# positional arguments
parser.add_argument(type=str,
                    dest='input_file',
                    nargs='?', default=None,
                    help='input file with structures')
parser.add_argument(type=str,
                    dest="yaml_input",
                    nargs='?', default=None,
                    help='input file with keywords')
# Main options
parser.add_argument('-m', '--measure',
                    dest='measure',
                    action='store_true',
                    default=False,
                    help='compute the chiral symmetry measure of the input structures')
parser.add_argument('-order',
                    dest='order',
                    default=1,
                    type=int,
                    help='max order of Sn calculation')
parser.add_argument('-o', '--output',
                    dest='output_name',
                    metavar='filename',
                    default=None,
                    help='store output into a file')
parser.add_argument('-c', '--central_atom',
                    action='store',
                    dest='central_atom',
                    metavar='N',
                    type=int,
                    default=0,
                    help='central atom is in position N in the input structure')

# Extra options
parser.add_argument('--info',
                    action='store_true',
                    default=False,
                    help='print information about the input structures')
parser.add_argument('-v', '--version',
                    dest='version',
                    action='store_true',
                    default=False,
                    help='print information about the input structures')

# Modifiers
parser.add_argument('--center',
                    dest='center', metavar='R',
                    type=float,
                    default=None,
                    nargs=3,
                    help='fix coordinates x,y,z for the center of symmetry operations (Angs)')

args = parser.parse_args()

if args.yaml_input:
    with open(args.yaml_input, 'r') as stream:
        input_parameters = yaml.load(stream, Loader=yaml.FullLoader)

    for key, value in input_parameters.items():
        if key.lower() in args:
            setattr(args, key.lower(), value)
        else:
            raise KeyError("Key %s is not valid" % key)

if args.version:
    print('Cosymlib version = {}'.format(__version__))
    exit()

common_output = open(args.output_name, 'w') if args.output_name is not None else sys.stdout
print_header(common_output)

if args.input_file is None:
    parser.error('No input file selected! An existing file must be provide')

structures = read_generic_structure_file(args.input_file, read_multiple=True)
structure_set = Cosymlib(structures)

if args.info:
    print_input_info(structure_set.get_geometries(), output=common_output)
    exit()

if args.order == 1:
    reference = ['Cs']
elif args.order == 2:
    reference = ['Ci']
elif int(args.order) > 8:
    raise ValueError('Maximum value available for Sn chirality measure is 8')
else:
    reference = ['Cs', 'Ci']
    for n in range(3, args.order + 1):
        if n%2 == 0:
            reference.append('S'+str(n))

reference = [r.lower() for r in reference]

# Chirality commands
if args.measure:
    structure_set.print_chirality_measure(reference,
                                          central_atom=args.central_atom,
                                          center=args.center,
                                          output=common_output)

print_footer(common_output)
