AWSTemplateFormatVersion: "2010-09-09"

Description: S3 trigger

Transform: AWS::Serverless-2016-10-31

Parameters:
  TableName:
    Type: String

  InputBucketName:
    Type: AWS::SSM::Parameter::Value<String>
    Default: InputBucketName

  InputBucketRawAudio:
    Type: AWS::SSM::Parameter::Value<String>
    Default: InputBucketRawAudio

Globals:
  Function:
    Runtime: python3.8
    MemorySize: 128
    Timeout: 15

Resources:
  FileDropTrigger:
    Type: "AWS::Serverless::Function"
    Properties:
      CodeUri:  ../../src/pca
      Handler: pca-aws-file-drop-trigger.lambda_handler
      Policies:
        - arn:aws:iam::aws:policy/AmazonTranscribeReadOnlyAccess
        - arn:aws:iam::aws:policy/AmazonSSMReadOnlyAccess
        - arn:aws:iam::aws:policy/AmazonS3ReadOnlyAccess
        - arn:aws:iam::aws:policy/AWSStepFunctionsFullAccess
    
  FileDropTriggerPermission:
    Type: AWS::Lambda::Permission
    Properties:
      FunctionName: !Ref FileDropTrigger
      Action: lambda:InvokeFunction
      Principal: s3.amazonaws.com
      SourceAccount: !Ref AWS::AccountId
      SourceArn: !Sub arn:aws:s3:::${InputBucketName}

  ConfigureBucketRole:
    Type: "AWS::IAM::Role"
    Properties:
      AssumeRolePolicyDocument:
        Statement:
          - Effect: Allow
            Principal:
              Service: lambda.amazonaws.com
            Action:
              - "sts:AssumeRole"
      ManagedPolicyArns:
        - "arn:aws:iam::aws:policy/service-role/AWSLambdaBasicExecutionRole"
      Policies:
        - PolicyName: allow-s3-notification-config
          PolicyDocument:
            Statement:
              Effect: Allow
              Action:
                - s3:GetBucketNotification
                - s3:PutBucketNotification
              Resource: !Sub arn:aws:s3:::${InputBucketName}

  ConfigureBucketFunction:
    Type: "AWS::Lambda::Function"
    Properties:
      Code:  ../../src/trigger
      Handler: index.handler
      Runtime: nodejs12.x
      Role: !GetAtt ConfigureBucketRole.Arn
      Environment:
        Variables:
          StackName: !Ref AWS::StackName

  ConfigureBucket:
    Type: "AWS::CloudFormation::CustomResource"
    Properties:
      ServiceToken: !GetAtt ConfigureBucketFunction.Arn
      BucketName: !Ref InputBucketName
      Prefix: !Ref InputBucketRawAudio
      LambdaArn: !GetAtt FileDropTrigger.Arn

  TranscribeEventbridge:
    Type: "AWS::Serverless::Function"
    Properties:
      CodeUri:  ../../src/pca
      Handler: pca-transcribe-eventbridge.lambda_handler
      Events:
        EventBridge:
          Type: EventBridgeRule
          Properties:
            Pattern:
              detail-type:
                - "Transcribe Job State Change"
              source:
                - aws.transcribe
              detail:
                TranscriptionJobStatus:
                  - FAILED
                  - COMPLETED
      Environment:
        Variables:
          TableName: !Ref TableName
      Policies:
        - arn:aws:iam::aws:policy/AmazonTranscribeReadOnlyAccess
        - arn:aws:iam::aws:policy/AWSStepFunctionsFullAccess
        - arn:aws:iam::aws:policy/AmazonDynamoDBFullAccess