# CloudWatch Logs ============================================================

resource "aws_cloudwatch_log_group" "this" {
  name              = local.log_group_name
  retention_in_days = var.cloudwatch_logs_retention_days
  kms_key_id        = var.kms_key_id

  tags = local.tags
}

# IAM role for CloudTrail → CloudWatch Logs delivery -------------------------

data "aws_iam_policy_document" "cloudtrail_assume" {
  statement {
    effect  = "Allow"
    actions = ["sts:AssumeRole"]
    principals {
      type        = "Service"
      identifiers = ["cloudtrail.amazonaws.com"]
    }
  }
}

resource "aws_iam_role" "cloudtrail_cw" {
  name               = local.role_name
  assume_role_policy = data.aws_iam_policy_document.cloudtrail_assume.json

  tags = local.tags
}

data "aws_iam_policy_document" "cloudtrail_cw_logs" {
  statement {
    effect = "Allow"
    actions = [
      "logs:CreateLogStream",
      "logs:PutLogEvents",
    ]
    resources = ["${aws_cloudwatch_log_group.this.arn}:*"]
  }
}

resource "aws_iam_role_policy" "cloudtrail_cw" {
  name   = "cloudtrail-cw-logs"
  role   = aws_iam_role.cloudtrail_cw.id
  policy = data.aws_iam_policy_document.cloudtrail_cw_logs.json
}

# Trail ======================================================================

resource "aws_cloudtrail" "this" {
  name                          = var.trail_name
  s3_bucket_name                = var.s3_bucket_name
  s3_key_prefix                 = var.s3_key_prefix
  is_organization_trail         = var.is_organization_trail
  is_multi_region_trail         = var.is_multi_region_trail
  include_global_service_events = var.include_global_service_events
  enable_log_file_validation    = var.enable_log_file_validation
  kms_key_id                    = var.kms_key_id
  cloud_watch_logs_group_arn    = "${aws_cloudwatch_log_group.this.arn}:*"
  cloud_watch_logs_role_arn     = aws_iam_role.cloudtrail_cw.arn

  event_selector {
    read_write_type           = var.management_events_rw_type
    include_management_events = true

    dynamic "data_resource" {
      for_each = var.data_resources
      content {
        type   = data_resource.value.type
        values = data_resource.value.values
      }
    }
  }

  tags = local.tags
}
