#!/usr/bin/env python3
"""Validate a MediaConvert MP4 job. --submit explicitly creates billable work."""
import argparse
import json
import os
from urllib.request import Request, urlopen

import boto3


def main():
    parser = argparse.ArgumentParser(description=__doc__)
    parser.add_argument('--endpoint', default='https://silken.io')
    parser.add_argument('--input-url', required=True)
    parser.add_argument('--output-url', required=True)
    parser.add_argument('--role', default='presigned-input', help='Registered role ARN for s3:// input')
    parser.add_argument('--submit', action='store_true', help='Create a billable job')
    args = parser.parse_args()
    key = os.environ['SILKEN_API_KEY']
    job = {
        'Role': args.role,
        'Settings': {
            'Inputs': [{'FileInput': args.input_url}],
            'OutputGroups': [{
                'OutputGroupSettings': {
                    'Type': 'FILE_GROUP_SETTINGS',
                    'FileGroupSettings': {'Destination': args.output_url}},
                'Outputs': [{
                    'ContainerSettings': {'Container': 'MP4'},
                    'VideoDescription': {'Height': 720, 'CodecSettings': {'Codec': 'H_264'}},
                    'AudioDescriptions': [{'CodecSettings': {'Codec': 'AAC'}}]}]}]}}
    client = boto3.client('mediaconvert', endpoint_url=args.endpoint,
                          region_name='us-east-1', aws_access_key_id=key,
                          aws_secret_access_key=key)
    endpoint = client.describe_endpoints()['Endpoints'][0]['Url']
    request = Request(args.endpoint.rstrip('/') + '/v1/mediaconvert/validate',
                      data=json.dumps(job).encode(), method='POST',
                      headers={'Content-Type': 'application/json', 'Authorization': 'Bearer ' + key})
    with urlopen(request, timeout=30) as response:
        verdict = json.load(response)
    if not verdict['valid']:
        # Reasons may include submitted field values; do not dump capabilities.
        raise SystemExit('Job validation failed; inspect fields with the docs validator.')
    print('MediaConvert translation passed; endpoint discovery succeeded.')
    if args.submit:
        if endpoint.rstrip('/') != args.endpoint.rstrip('/'):
            raise SystemExit('Discovered endpoint differs; set --endpoint to the published endpoint first.')
        result = client.create_job(**job)['Job']
        print(result['Id'], result['Status'])


if __name__ == '__main__':
    main()
