# Copyright (c) 2012-2019, Mark Peek <mark@peek.org>
# All rights reserved.
#
# See LICENSE file for full license.
#

from troposphere import Tags

from . import AWSObject, AWSProperty
from .validators import integer


class AudioLanguageSelection(AWSProperty):
    props = {
        "LanguageCode": (str, False),
        "LanguageSelectionPolicy": (str, False),
    }


class AudioPidSelection(AWSProperty):
    props = {
        "Pid": (integer, False),
    }


class AudioSelectorSettings(AWSProperty):
    props = {
        "AudioLanguageSelection": (AudioLanguageSelection, False),
        "AudioPidSelection": (AudioPidSelection, False),
    }


class AudioSelector(AWSProperty):
    props = {
        "Name": (str, False),
        "SelectorSettings": (AudioSelectorSettings, False),
    }


class AribSourceSettings(AWSProperty):
    props = {}


class DvbSubSourceSettings(AWSProperty):
    props = {
        "Pid": (integer, False),
    }


class EmbeddedSourceSettings(AWSProperty):
    props = {
        "Convert608To708": (str, False),
        "Scte20Detection": (str, False),
        "Source608ChannelNumber": (integer, False),
        "Source608TrackNumber": (integer, False),
    }


class Scte20SourceSettings(AWSProperty):
    props = {
        "Convert608To708": (str, False),
        "Source608ChannelNumber": (integer, False),
    }


class Scte27SourceSettings(AWSProperty):
    props = {
        "Pid": (integer, False),
    }


class TeletextSourceSettings(AWSProperty):
    props = {
        "PageNumber": (str, False),
    }


class CaptionSelectorSettings(AWSProperty):
    props = {
        "AribSourceSettings": (AribSourceSettings, False),
        "DvbSubSourceSettings": (DvbSubSourceSettings, False),
        "EmbeddedSourceSettings": (EmbeddedSourceSettings, False),
        "Scte20SourceSettings": (Scte20SourceSettings, False),
        "Scte27SourceSettings": (Scte27SourceSettings, False),
        "TeletextSourceSettings": (TeletextSourceSettings, False),
    }


class CaptionSelector(AWSProperty):
    props = {
        "LanguageCode": (str, False),
        "Name": (str, False),
        "SelectorSettings": (CaptionSelectorSettings, False),
    }


class HlsInputSettings(AWSProperty):
    props = {
        "Bandwidth": (integer, False),
        "BufferSegments": (integer, False),
        "Retries": (integer, False),
        "RetryInterval": (integer, False),
    }


class NetworkInputSettings(AWSProperty):
    props = {
        "HlsInputSettings": (HlsInputSettings, False),
        "ServerValidation": (str, False),
    }


class VideoSelectorPid(AWSProperty):
    props = {
        "Pid": (integer, False),
    }


class VideoSelectorProgramId(AWSProperty):
    props = {
        "ProgramId": (integer, False),
    }


class VideoSelectorSettings(AWSProperty):
    props = {
        "VideoSelectorPid": (VideoSelectorPid, False),
        "VideoSelectorProgramId": (VideoSelectorProgramId, False),
    }


class VideoSelector(AWSProperty):
    props = {
        "ColorSpace": (str, False),
        "ColorSpaceUsage": (str, False),
        "SelectorSettings": (VideoSelectorSettings, False),
    }


class InputSettings(AWSProperty):
    props = {
        "AudioSelectors": ([AudioSelector], False),
        "CaptionSelectors": ([CaptionSelector], False),
        "DeblockFilter": (str, False),
        "DenoiseFilter": (str, False),
        "FilterStrength": (integer, False),
        "InputFilter": (str, False),
        "NetworkInputSettings": (NetworkInputSettings, False),
        "SourceEndBehavior": (str, False),
        "VideoSelector": (VideoSelector, False),
    }


class InputAttachment(AWSProperty):
    props = {
        "InputAttachmentName": (str, False),
        "InputId": (str, False),
        "InputSettings": (InputSettings, False),
    }


class InputSpecification(AWSProperty):
    props = {
        "Codec": (str, False),
        "MaximumBitrate": (str, False),
        "Resolution": (str, False),
    }


class MediaPackageOutputDestinationSettings(AWSProperty):
    props = {
        "ChannelId": (str, False),
    }


class OutputDestinationSettings(AWSProperty):
    props = {
        "PasswordParam": (str, False),
        "StreamName": (str, False),
        "Url": (str, False),
        "Username": (str, False),
    }


class OutputDestination(AWSProperty):
    props = {
        "Id": (str, False),
        "MediaPackageSettings": ([MediaPackageOutputDestinationSettings], False),
        "Settings": ([OutputDestinationSettings], False),
    }


class Channel(AWSObject):
    resource_type = "AWS::MediaLive::Channel"

    props = {
        "ChannelClass": (str, False),
        "Destinations": ([OutputDestination], False),
        "EncoderSettings": (dict, False),
        "InputAttachments": ([InputAttachment], False),
        "InputSpecification": (InputSpecification, False),
        "LogLevel": (str, False),
        "Name": (str, False),
        "RoleArn": (str, False),
        "Tags": (Tags, False),
    }


class InputDestinationRequest(AWSProperty):
    props = {
        "StreamName": (str, False),
    }


class InputSourceRequest(AWSProperty):
    props = {
        "PasswordParam": (str, False),
        "Url": (str, False),
        "Username": (str, False),
    }


class InputVpcRequest(AWSProperty):
    props = {
        "SecurityGroupIds": ([str], False),
        "SubnetIds": ([str], False),
    }


class MediaConnectFlowRequest(AWSProperty):
    props = {
        "FlowArn": (str, False),
    }


class Input(AWSObject):
    resource_type = "AWS::MediaLive::Input"

    props = {
        "Destinations": ([InputDestinationRequest], False),
        "InputSecurityGroups": ([str], False),
        "MediaConnectFlows": ([MediaConnectFlowRequest], False),
        "Name": (str, False),
        "RoleArn": (str, False),
        "Sources": ([InputSourceRequest], False),
        "Tags": (Tags, False),
        "Type": (str, False),
        "Vpc": (InputVpcRequest, False),
    }


class InputWhitelistRuleCidr(AWSProperty):
    props = {
        "Cidr": (str, False),
    }


class InputSecurityGroup(AWSObject):
    resource_type = "AWS::MediaLive::InputSecurityGroup"

    props = {
        "Tags": (Tags, False),
        "WhitelistRules": ([InputWhitelistRuleCidr], False),
    }
