#!/usr/bin/env python

import os
import sys
import json
import pprint
import argparse
import boto3
import misc
import certs
import thing
import policy

pp = pprint.PrettyPrinter(indent=4)


def check_aws_configuration():
    mysession = boto3.session.Session()
    if not mysession._session._config['profiles']:
        print("AWS not configured. Please run `aws configure`.")
        sys.exit(1)


def prereq():
    with open('configure.json') as configure_file:
        json_text = json.load(configure_file)

    # Create a Thing
    thing_name = json_text['thing_name']
    thing_obj = thing.Thing(thing_name)
    if not thing_obj.create():

        # Create a Certificate
        cert_obj = certs.Certificate()
        result = cert_obj.create()

        # Store certId
        cert_id = result['certificateId']
        cert_id_filename = thing_name + '_cert_id_file.txt'
        cert_id_file = open(cert_id_filename, 'w')
        cert_id_file.write(cert_id)
        cert_id_file_path = os.path.abspath(cert_id_filename)
        os.chmod(cert_id_file_path, 0o444)
        cert_id_file.close()

        # Store cert_pem as file
        cert_pem = result['certificatePem']
        cert_pem_filename = thing_name + '_cert_pem_file.pem'
        cert_pem_file = open(cert_pem_filename, 'w')
        cert_pem_file.write(cert_pem)
        cert_pem_file_path = os.path.abspath(cert_pem_filename)
        os.chmod(cert_pem_file_path, 0o444)
        cert_pem_file.close()

        # Store private key PEM as file
        private_key_pem = result['keyPair']['PrivateKey']
        private_key_pem_filename = thing_name + '_private_key_pem_file.pem'
        private_key_pem_file = open(private_key_pem_filename, 'w')
        private_key_pem_file.write(private_key_pem)
        private_key_pem_file_path = os.path.abspath(private_key_pem_filename)
        os.chmod(private_key_pem_file_path, 0o444)
        private_key_pem_file.close()

        # Create a Policy
        policy_document = misc.create_policy_document()
        policy_name = thing_name + '_amazon_freertos_policy'
        policy_obj = policy.Policy(policy_name, policy_document)
        policy_obj.create()

        # Attach certificate to Thing
        cert_obj.attach_thing(thing_name)

        # Attach policy to certificate
        cert_obj.attach_policy(policy_name)


def update_credential_file():
    with open('configure.json') as configure_file:
        json_text = json.load(configure_file)

    source_dir = os.path.expanduser(json_text['FreeRTOS_source_dir'])
    thing_name = json_text['thing_name']

    # Read cert_pem from file
    cert_pem_filename = thing_name + '_cert_pem_file.pem'
    try:
        cert_pem_file = open(cert_pem_filename, 'r')
    except IOError:
        print("{} file not found. Run prerequisite step"
              .format(cert_pem_filename))
        sys.exit(1)
    else:
        cert_pem = cert_pem_file.read()

    # Read private_key_pem from file
    private_key_pem_filename = thing_name + '_private_key_pem_file.pem'
    try:
        private_key_pem_file = open(private_key_pem_filename, 'r')
    except IOError:
        print("{} file not found. Run prerequisite step"
              .format(private_key_pem_filename))
        sys.exit(1)
    else:
        private_key_pem = private_key_pem_file.read()

    # Modify 'iot_clientcredential.h' file
    misc.write_client_credentials(
        source_dir,
        thing_name=thing_name,
        client_certificate_pem=cert_pem,
        client_private_key_pem=private_key_pem,
        cleanup=False)


def delete_prereq():
    with open('configure.json') as configure_file:
        json_text = json.load(configure_file)

    # Delete Thing
    thing_name = json_text['thing_name']
    thing_obj = thing.Thing(thing_name)
    if thing_obj.exists():
        thing_obj.delete()

    # Delete certificate
    cert_id_filename = thing_name + '_cert_id_file.txt'
    if os.path.exists(cert_id_filename):
        cert_id_file = open(cert_id_filename, 'r')
        cert_id = cert_id_file.read()
        cert_obj = certs.Certificate(cert_id)
        cert_obj.delete()
        cert_id_file.close()
        cert_id_file_path = os.path.abspath(cert_id_filename)
        os.chmod(cert_id_file_path, 0o666)
        os.remove(cert_id_filename)

    # Delete cert_pem file and private_key_pem file
    cert_pem_filename = thing_name + '_cert_pem_file.pem'
    if os.path.exists(cert_pem_filename):
        cert_pem_file_path = os.path.abspath(cert_pem_filename)
        os.chmod(cert_pem_file_path, 0o666)
        os.remove(cert_pem_filename)

    private_key_pem_filename = thing_name + '_private_key_pem_file.pem'
    if os.path.exists(private_key_pem_filename):
        private_key_pem_file_path = os.path.abspath(private_key_pem_filename)
        os.chmod(private_key_pem_file_path, 0o666)
        os.remove(private_key_pem_filename)

    # Delete policy
    policy_name = thing_name + '_amazon_freertos_policy'
    policy_obj = policy.Policy(policy_name)
    if policy_obj.exists():
        policy_obj.delete()


def cleanup_creds():
    with open('configure.json') as file:
        json_text = json.load(file)

    source_dir = os.path.expanduser(json_text['FreeRTOS_source_dir'])

    # Cleanup 'iot_clientcredential.h' file
    misc.write_client_credentials(source_dir, cleanup=True)


def setup():
    prereq()
    update_credential_file()
    print("Setup Completed")


def cleanup():
    delete_prereq()
    cleanup_creds()
    print("Cleanup Completed")


def list_certificates():
    client = boto3.client('iot')
    certs = client.list_certificates()['certificates']
    pp.pprint(certs)


def list_things():
    client = boto3.client('iot')
    things = client.list_things()['things']
    pp.pprint(things)


def list_policies():
    client = boto3.client('iot')
    policies = client.list_policies()['policies']
    pp.pprint(policies)


if __name__ == "__main__":

    arg_parser = argparse.ArgumentParser()
    subparsers = arg_parser.add_subparsers(help='Available commands',
                                           dest='command')
    subparsers.add_parser('setup', help='Setup AWS IoT')
    subparsers.add_parser('cleanup', help='Cleanup AWS IoT')
    subparsers.add_parser('list_certificates', help='List certificates')
    subparsers.add_parser('list_things', help='List things')
    subparsers.add_parser('list_policies', help='List policies')
    subparsers.add_parser('prereq', help='Setup prerequisites for AWS IoT')
    subparsers.add_parser('update_creds', help='Update credential files')
    subparsers.add_parser('delete_prereq', help='Delete prerequisites created')
    subparsers.add_parser('cleanup_creds', help='Cleanup credential files')
    args = arg_parser.parse_args()
    check_aws_configuration()

    if args.command == 'setup':
        setup()
    elif args.command == 'cleanup':
        cleanup()
    elif args.command == 'list_certificates':
        list_certificates()
    elif args.command == 'list_things':
        list_things()
    elif args.command == 'list_policies':
        list_policies()
    elif args.command == 'prereq':
        prereq()
    elif args.command == 'update_creds':
        update_credential_file()
    elif args.command == 'delete_prereq':
        delete_prereq()
    elif args.command == 'cleanup_creds':
        cleanup_creds()
    else:
        print("Command does not exist")

    sys.exit(1)