provider "aws" {
  region = "us-east-1"
}

<<<<<<< HEAD
# Local values for lambda source directories and environment variables
locals {
  # Lambda source directories
  lambda_dirs = {
    file-upload-complete          = "${var.lambda_source_base_dir}/file_upload_complete"
    adjustment-file-initialize    = "${var.lambda_source_base_dir}/adjustment_file_initialize"
    adjustment-file-prepare       = "${var.lambda_source_base_dir}/adjustment_file_prepare"
    adjustment-file-process-batch = "${var.lambda_source_base_dir}/adjustment_file_process_batch"
    adjustment-file-complete      = "${var.lambda_source_base_dir}/adjustment_file_complete"
    outbox-process                = "${var.lambda_source_base_dir}/outbox_process"
  }

  # Environment variables for each lambda
  lambda_env_vars = {
    file-upload-complete = {
      OWSREQUEST_SERVICE_MAP = jsonencode({
        "ows-royalties" = "http://host.docker.internal:6052"
      })
    }
    adjustment-file-initialize = {
      OWSREQUEST_SERVICE_MAP = jsonencode({
        "ows-royalties" = "http://host.docker.internal:6052"
      })
      MYSQL_DB_HOST = "host.docker.internal"
      MYSQL_DB_PORT = "6050"
      MYSQL_DB_NAME = "royalty_accounting"
      MYSQL_DB_USER = "royalties"
      MYSQL_DB_PASS = "1234"
    }
    adjustment-file-prepare = {
      OWSREQUEST_SERVICE_MAP = jsonencode({
        "ows-royalties" = "http://host.docker.internal:6052"
      })
      MYSQL_DB_HOST = "host.docker.internal"
      MYSQL_DB_PORT = "6050"
      MYSQL_DB_NAME = "royalty_accounting"
      MYSQL_DB_USER = "royalties"
      MYSQL_DB_PASS = "1234"
    }
    adjustment-file-process-batch = {
      OWSREQUEST_SERVICE_MAP = jsonencode({
        "ows-royalties" = "http://host.docker.internal:6052"
      })
      MYSQL_DB_HOST = "host.docker.internal"
      MYSQL_DB_PORT = "6050"
      MYSQL_DB_NAME = "royalty_accounting"
      MYSQL_DB_USER = "royalties"
      MYSQL_DB_PASS = "1234"
    }
    adjustment-file-complete = {
      OWSREQUEST_SERVICE_MAP = jsonencode({
        "ows-royalties" = "http://host.docker.internal:6052"
      })
    }
    outbox-process = {
      MYSQL_DB_HOST    = "host.docker.internal"
      MYSQL_DB_PORT    = "6050"
      MYSQL_DB_NAME    = "royalty_accounting"
      MYSQL_DB_USER    = "royalties"
      MYSQL_DB_PASS    = "1234"
      BATCH_SIZE       = "100"
      EVENT_SOURCE     = "abacus.outbox"
=======
variable "environment" {
  description = "Environment name"
  type        = string
  default     = "dev"
}

# File Upload Complete Lambda function
# Build Docker image from actual Lambda code
locals {
  lambda_source_dir = "/Users/michael.rojas/Library/CloudStorage/OneDrive-SonyMusicEntertainment/Documents/projects/lambda-abacus/lambda/file_upload_complete"
}

resource "null_resource" "build_file_upload_complete" {
  triggers = {
    # Rebuild if handler code changes
    code_hash = filemd5("${local.lambda_source_dir}/file_upload_complete/processor.py")
    config_hash = filemd5("${local.lambda_source_dir}/config.py")
    app_hash = filemd5("${local.lambda_source_dir}/app.py")
    # Rebuild if Dockerfile or dependencies change
    dockerfile_hash = filemd5("${local.lambda_source_dir}/Dockerfile")
    pyproject_hash = filemd5("${local.lambda_source_dir}/pyproject.toml")
    uvlock_hash = filemd5("${local.lambda_source_dir}/uv.lock")
  }

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

resource "aws_iam_role" "file_upload_complete_lambda_role" {
  name = "${var.environment}-abacus-lambda-file-upload-complete-role"

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

resource "aws_iam_role_policy_attachment" "file_upload_complete_lambda_basic" {
  role       = aws_iam_role.file_upload_complete_lambda_role.name
  policy_arn = "arn:aws:iam::aws:policy/service-role/AWSLambdaBasicExecutionRole"
}

# Deploy Lambda from Docker image
resource "aws_lambda_function" "file_upload_complete" {
  depends_on = [null_resource.build_file_upload_complete]

  function_name = "${var.environment}-lambda-abacus-file-upload-complete"
  role          = aws_iam_role.file_upload_complete_lambda_role.arn
  package_type  = "Image"
  image_uri     = "file-upload-complete:latest"
  timeout       = 300
  memory_size   = 512

  environment {
    variables = {
      ENVIRONMENT = var.environment  # Use "dev" for local to skip M2M auth
      # OWS service routing using owsclient (proper pattern)
      OWSREQUEST_SERVICE_MAP = jsonencode({
        "ows-royalties" = "http://host.docker.internal:6052"
      })
      # 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"
>>>>>>> ac25dc0bf2425992ad07b4763e07dd92b2fca390
    }
  }
}

# S3 Full Access Policy for lambdas that need it
resource "aws_iam_policy" "s3_full_access" {
  name        = "${var.environment}-abacus-lambda-s3-full-access"
  description = "S3 full access for Abacus lambdas"

  policy = jsonencode({
    Version = "2012-10-17"
    Statement = [{
      Effect   = "Allow"
      Action   = "s3:*"
      Resource = "*"
    }]
  })
}

# ============================================================================
# File Upload Complete Lambda
# ============================================================================
module "file_upload_complete" {
  source = "../_shared/modules/localstack-lambda"

  lambda_name       = "file-upload-complete"
  lambda_source_dir = local.lambda_dirs["file-upload-complete"]
  docker_image_tag  = "file-upload-complete"
  timeout           = var.lambda_configs["file-upload-complete"].timeout
  memory_size       = var.lambda_configs["file-upload-complete"].memory_size
  environment       = var.environment

  environment_variables = local.lambda_env_vars["file-upload-complete"]

  build_triggers = {
    dir_hash        = sha1(join("", [for f in fileset("${local.lambda_dirs["file-upload-complete"]}/src", "**") : filesha1("${local.lambda_dirs["file-upload-complete"]}/src/${f}")]))
    config_hash     = filemd5("${local.lambda_dirs["file-upload-complete"]}/config.py")
    dockerfile_hash = filemd5("${local.lambda_dirs["file-upload-complete"]}/Dockerfile")
    pyproject_hash  = filemd5("${local.lambda_dirs["file-upload-complete"]}/pyproject.toml")
    uvlock_hash     = filemd5("${local.lambda_dirs["file-upload-complete"]}/uv.lock")
  }
}

# ============================================================================
# Adjustment File Initialize Lambda
# ============================================================================
module "adjustment_file_initialize" {
  source = "../_shared/modules/localstack-lambda"

  lambda_name       = "adjustment-file-initialize"
  lambda_source_dir = local.lambda_dirs["adjustment-file-initialize"]
  docker_image_tag  = "adjustment-file-initialize"
  timeout           = var.lambda_configs["adjustment-file-initialize"].timeout
  memory_size       = var.lambda_configs["adjustment-file-initialize"].memory_size
  environment       = var.environment

  environment_variables = local.lambda_env_vars["adjustment-file-initialize"]

  iam_policy_arns = [aws_iam_policy.s3_full_access.arn]

  build_triggers = {
    dir_hash        = sha1(join("", [for f in fileset("${local.lambda_dirs["adjustment-file-initialize"]}/src", "**") : filesha1("${local.lambda_dirs["adjustment-file-initialize"]}/src/${f}")]))
    config_hash     = filemd5("${local.lambda_dirs["adjustment-file-initialize"]}/config.py")
    dockerfile_hash = filemd5("${local.lambda_dirs["adjustment-file-initialize"]}/Dockerfile")
    pyproject_hash  = filemd5("${local.lambda_dirs["adjustment-file-initialize"]}/pyproject.toml")
    uvlock_hash     = filemd5("${local.lambda_dirs["adjustment-file-initialize"]}/uv.lock")
  }
}

# ============================================================================
# Adjustment File Prepare Lambda
# ============================================================================
module "adjustment_file_prepare" {
  source = "../_shared/modules/localstack-lambda"

  lambda_name       = "adjustment-file-prepare"
  lambda_source_dir = local.lambda_dirs["adjustment-file-prepare"]
  docker_image_tag  = "adjustment-file-prepare"
  timeout           = var.lambda_configs["adjustment-file-prepare"].timeout
  memory_size       = var.lambda_configs["adjustment-file-prepare"].memory_size
  environment       = var.environment

  environment_variables = local.lambda_env_vars["adjustment-file-prepare"]

  iam_policy_arns = [aws_iam_policy.s3_full_access.arn]

  build_triggers = {
    dir_hash        = sha1(join("", [for f in fileset("${local.lambda_dirs["adjustment-file-prepare"]}/src", "**") : filesha1("${local.lambda_dirs["adjustment-file-prepare"]}/src/${f}")]))
    config_hash     = filemd5("${local.lambda_dirs["adjustment-file-prepare"]}/config.py")
    dockerfile_hash = filemd5("${local.lambda_dirs["adjustment-file-prepare"]}/Dockerfile")
    pyproject_hash  = filemd5("${local.lambda_dirs["adjustment-file-prepare"]}/pyproject.toml")
    uvlock_hash     = filemd5("${local.lambda_dirs["adjustment-file-prepare"]}/uv.lock")
  }
}

# ============================================================================
# Adjustment File Process Batch Lambda
# ============================================================================
module "adjustment_file_process_batch" {
  source = "../_shared/modules/localstack-lambda"

  lambda_name       = "adjustment-file-process-batch"
  lambda_source_dir = local.lambda_dirs["adjustment-file-process-batch"]
  docker_image_tag  = "adjustment-file-process-batch"
  timeout           = var.lambda_configs["adjustment-file-process-batch"].timeout
  memory_size       = var.lambda_configs["adjustment-file-process-batch"].memory_size
  environment       = var.environment

  environment_variables = local.lambda_env_vars["adjustment-file-process-batch"]

  iam_policy_arns = [aws_iam_policy.s3_full_access.arn]

  build_triggers = {
    dir_hash        = sha1(join("", [for f in fileset("${local.lambda_dirs["adjustment-file-process-batch"]}/src", "**") : filesha1("${local.lambda_dirs["adjustment-file-process-batch"]}/src/${f}")]))
    config_hash     = filemd5("${local.lambda_dirs["adjustment-file-process-batch"]}/config.py")
    dockerfile_hash = filemd5("${local.lambda_dirs["adjustment-file-process-batch"]}/Dockerfile")
    pyproject_hash  = filemd5("${local.lambda_dirs["adjustment-file-process-batch"]}/pyproject.toml")
    uvlock_hash     = filemd5("${local.lambda_dirs["adjustment-file-process-batch"]}/uv.lock")
  }
}

# ============================================================================
# Adjustment File Complete Lambda
# ============================================================================
module "adjustment_file_complete" {
  source = "../_shared/modules/localstack-lambda"

  lambda_name       = "adjustment-file-complete"
  lambda_source_dir = local.lambda_dirs["adjustment-file-complete"]
  docker_image_tag  = "adjustment-file-complete"
  timeout           = var.lambda_configs["adjustment-file-complete"].timeout
  memory_size       = var.lambda_configs["adjustment-file-complete"].memory_size
  environment       = var.environment

  environment_variables = local.lambda_env_vars["adjustment-file-complete"]

  iam_policy_arns = [aws_iam_policy.s3_full_access.arn]

  build_triggers = {
    dir_hash        = sha1(join("", [for f in fileset("${local.lambda_dirs["adjustment-file-complete"]}/src", "**") : filesha1("${local.lambda_dirs["adjustment-file-complete"]}/src/${f}")]))
    config_hash     = filemd5("${local.lambda_dirs["adjustment-file-complete"]}/config.py")
    dockerfile_hash = filemd5("${local.lambda_dirs["adjustment-file-complete"]}/Dockerfile")
    pyproject_hash  = filemd5("${local.lambda_dirs["adjustment-file-complete"]}/pyproject.toml")
    uvlock_hash     = filemd5("${local.lambda_dirs["adjustment-file-complete"]}/uv.lock")
  }
}

# ============================================================================
# Outbox Process Lambda
# ============================================================================
module "outbox_process" {
  source = "../_shared/modules/localstack-lambda"

  lambda_name       = "outbox-process"
  lambda_source_dir = local.lambda_dirs["outbox-process"]
  docker_image_tag  = "outbox-process"
  timeout           = var.lambda_configs["outbox-process"].timeout
  memory_size       = var.lambda_configs["outbox-process"].memory_size
  environment       = var.environment

  environment_variables = local.lambda_env_vars["outbox-process"]

  build_triggers = {
    dir_hash        = sha1(join("", [for f in fileset("${local.lambda_dirs["outbox-process"]}/src", "**") : filesha1("${local.lambda_dirs["outbox-process"]}/src/${f}")]))
    config_hash     = filemd5("${local.lambda_dirs["outbox-process"]}/config.py")
    dockerfile_hash = filemd5("${local.lambda_dirs["outbox-process"]}/Dockerfile")
    pyproject_hash  = filemd5("${local.lambda_dirs["outbox-process"]}/pyproject.toml")
    uvlock_hash     = filemd5("${local.lambda_dirs["outbox-process"]}/uv.lock")
  }
}

# ============================================================================
# Outputs
# ============================================================================
output "function_name" {
  value = module.file_upload_complete.lambda_function_name
}

output "function_arn" {
  value = module.file_upload_complete.lambda_function_arn
}

output "all_lambda_functions" {
  description = "All Lambda function names"
  value = {
    file_upload_complete          = module.file_upload_complete.lambda_function_name
    adjustment_file_initialize    = module.adjustment_file_initialize.lambda_function_name
    adjustment_file_prepare       = module.adjustment_file_prepare.lambda_function_name
    adjustment_file_process_batch = module.adjustment_file_process_batch.lambda_function_name
    adjustment_file_complete      = module.adjustment_file_complete.lambda_function_name
    outbox_process                = module.outbox_process.lambda_function_name
  }
}

output "outbox_process_function_name" {
  description = "Outbox Process Lambda function name"
  value       = module.outbox_process.lambda_function_name
}

output "outbox_process_function_arn" {
  description = "Outbox Process Lambda function ARN"
  value       = module.outbox_process.lambda_function_arn
}

output "outbox_process_role_name" {
  description = "Outbox Process Lambda IAM role name"
  value       = module.outbox_process.lambda_role_name
}
