#!/usr/bin/env python

import os
import boto3


def describe_endpoint():
    client = boto3.client('iot')
    endpoint = client.describe_endpoint(endpointType='iot:Data-ATS')
    return endpoint['endpointAddress']


def get_account_id():
    client = boto3.client('sts')
    aws_account_id = client.get_caller_identity()['Account']
    return aws_account_id.strip('\n')


def get_aws_region():
    my_session = boto3.session.Session()
    aws_region = my_session.region_name
    return aws_region.strip('\n')


def create_policy_document():
    this_file_directory = os.getcwd()
    policy_document = os.path.join(this_file_directory,
                                   'policy_document.templ')
    region_name = str(get_aws_region())
    aws_account_id = str(get_account_id())
    with open(policy_document) as policy_document_file:
        policy_document_text = policy_document_file.read()

    # Replace Account ID and AWS Region
    policy_document_text = policy_document_text.replace('<aws-region>',
                                                        region_name)
    policy_document_text = policy_document_text.replace('<aws-account-id>',
                                                        aws_account_id)

    return policy_document_text


def format_credential_keys_text(credential_text):
    credential_text_lines = credential_text.split('\n')
    formatted_credential_text_lines = []

    for credential_text_line in credential_text_lines:
        if credential_text_line.strip():
            formatted_credential_text_line = '    {:68s}'\
                .format('"' + credential_text_line + '\\n"')
            formatted_credential_text_lines.append(
                formatted_credential_text_line)

    formatted_credential_text = ' \\\n'.join(formatted_credential_text_lines)
    return formatted_credential_text


def write_client_credentials(
        source_dir,
        thing_name='',
        client_certificate_pem='',
        client_private_key_pem='',
        cleanup=False):

    file_to_modify = os.path.join(source_dir,
                                  'FreeRTOS-Labs',
                                  'Demo',
                                  'FreeRTOS_IoT_Libraries',
                                  'include',
                                  'aws_iot_demo_profile.h')
    file_text = ''

    if cleanup:
        filename = "aws_iot_demo_profile_empty.templ"
        with open(filename, 'r') as template_file:
            file_text = template_file.read()

    else:
        endpoint = describe_endpoint()
        client_certificate_pem =\
            format_credential_keys_text(client_certificate_pem)
        client_private_key_pem =\
            format_credential_keys_text(client_private_key_pem)

        filename = "aws_iot_demo_profile.templ"
        with open(filename, 'r') as template_file:
            file_text = template_file.read()
            file_text = file_text.replace("<IOTEndpoint>",
                                          "\"" + endpoint + "\"")
            file_text = file_text.replace("<IOTThingName>",
                                          "\"" + thing_name + "\"")
            file_text = file_text.replace("<ClientCertificatePEM>",
                                          client_certificate_pem)
            file_text = file_text.replace("<ClientPrivateKeyPEM>",
                                          client_private_key_pem)

    header_file = open(str(file_to_modify), 'w')
    header_file.write(file_text)
    header_file.close()
