# Build Docker image from Lambda source code
resource "null_resource" "build_lambda" {
  triggers = var.build_triggers

  provisioner "local-exec" {
    command = <<-EOT
      cd ${var.lambda_source_dir}
      docker build --platform linux/amd64 --target local -t ${var.docker_image_tag}:latest .
    EOT
  }
}

# IAM role for Lambda
resource "aws_iam_role" "lambda_role" {
  name = "${var.environment}-abacus-${var.lambda_name}-role"

  assume_role_policy = jsonencode({
    Version = "2012-10-17"
    Statement = [{
      Effect = "Allow"
      Principal = {
        Service = "lambda.amazonaws.com"
      }
      Action = "sts:AssumeRole"
    }]
  })
}

# Attach basic execution role policy
resource "aws_iam_role_policy_attachment" "lambda_basic" {
  role       = aws_iam_role.lambda_role.name
  policy_arn = "arn:aws:iam::aws:policy/service-role/AWSLambdaBasicExecutionRole"
}

# Attach additional IAM policies
resource "aws_iam_role_policy_attachment" "additional_policies" {
  count = length(var.iam_policy_arns)

  role       = aws_iam_role.lambda_role.name
  policy_arn = var.iam_policy_arns[count.index]
}

# Lambda function
resource "aws_lambda_function" "lambda" {
  depends_on = [null_resource.build_lambda]

  function_name = "${var.environment}-lambda-abacus-${var.lambda_name}"
  role          = aws_iam_role.lambda_role.arn
  package_type  = "Image"
  image_uri     = "${var.docker_image_tag}:latest"
  timeout       = var.timeout
  memory_size   = var.memory_size

  environment {
    variables = merge(
      {
        ENVIRONMENT = var.environment
        # LocalStack configuration
        AWS_ENDPOINT_URL = "http://host.docker.internal:4566"
        # Disable Datadog tracing in local environment
        DD_TRACE_ENABLED = "false"
        DD_INSTRUMENTATION_TELEMETRY_ENABLED = "false"
      },
      var.environment_variables
    )
  }
}
