# This effectively creates an empty S3 folder.
resource "aws_s3_bucket_object" "lambda_new_release_json_folder" {
  bucket = "${var.s3_bucket}"
  acl    = "private"
  key    = "${var.s3_path}/"
  source = "/dev/null"
}

data "aws_iam_policy_document" "s3_policy_data" {
  statement {
    effect = "Allow"

    actions = [
      "s3:AbortMultipartUpload",
      "s3:DeleteObject",
      "s3:DeleteObjectVersion",
      "s3:GetBucketLocation",
      "s3:GetBucketVersioning",
      "s3:GetLifecycleConfiguration",
      "s3:GetObject",
      "s3:GetObjectAcl",
      "s3:GetObjectTorrent",
      "s3:GetObjectVersion",
      "s3:GetObjectVersionAcl",
      "s3:GetObjectVersionTorrent",
      "s3:GetReplicationConfiguration",
      "s3:ListBucket",
      "s3:ListBucketMultipartUploads",
      "s3:ListBucketVersions",
      "s3:ListMultipartUploadParts",
      "s3:PutObject",
      "s3:PutObjectAcl",
      "s3:PutObjectVersionAcl",
      "s3:ReplicateDelete",
      "s3:ReplicateObject",
      "s3:RestoreObject",
    ]

    resources = [
      "arn:aws:s3:::${var.s3_bucket}/${var.s3_path}",
      "arn:aws:s3:::${var.s3_bucket}/${var.s3_path}/*",
    ]
  }

  statement {
    effect = "Allow"

    actions = [
      "s3:GetBucketLocation",
      "s3:ListBucket",
    ]

    resources = [
      "arn:aws:s3:::${var.s3_bucket}",
    ]
  }
}

resource "aws_iam_policy" "s3_policy" {
  name   = "S3-${var.s3_bucket}-${var.s3_path}-RW"
  policy = "${data.aws_iam_policy_document.s3_policy_data.json}"
}

module "new_release_json_aggregator" {
  source = "git@github.com:theorchard/terraform-lambda.git//?ref=1.0.2"

  environment = "${var.environment}"
  lambda_function_handler = "new_release_json_blaster.blast_s3_with_new_release_data"
  lambda_name              = "${var.lambda_name}"
  use_custom_function_name = true
  custom_function_name     = "${var.lambda_name}-${var.environment}"
  lambda_description       = "${var.lambda_description}"

  lambda_function_environment_variables = "${var.lambda_function_environment_variables}"
  lambda_function_timeout               = "${var.lambda_function_timeout}"

  vpc_subnet_ids         = "${var.vpc_subnet_ids}"
  vpc_security_group_ids = "${var.vpc_security_group_ids}"

  iam_managed_policy_attachments = [
    "${aws_iam_policy.s3_policy.arn}",
    "${var.owsrequest_iam_policy}",
  ]
}

resource "aws_cloudwatch_event_rule" "lambda_run_daily" {
  name                = "${var.lambda_name}-${var.environment}"
  schedule_expression = "cron(0 11,23 * * ? *)"
  description         = "Run ${var.lambda_name} daily"
}

resource "aws_cloudwatch_event_target" "lambda_daily_target" {
  rule      = "${aws_cloudwatch_event_rule.lambda_run_daily.name}"
  target_id = "${var.lambda_name}_daily_target"
  arn       = "${module.new_release_json_aggregator.lambda_arn}"
}

resource "aws_lambda_permission" "allow_cloudwatch_to_call_lambda" {
  statement_id  = "AllowExecutionFromCloudWatch"
  action        = "lambda:InvokeFunction"
  function_name = "${var.lambda_name}-${var.environment}"
  principal     = "events.amazonaws.com"
  source_arn    = "${aws_cloudwatch_event_rule.lambda_run_daily.arn}"
}
