locals {
  snowflake_common_env = {
    ENVIRONMENT                      = var.environment
    SNOWFLAKE_ACCOUNT                = var.snowflake_account
    SNOWFLAKE_USER                   = var.snowflake_user
    SNOWFLAKE_ROLE                   = var.snowflake_role
    SNOWFLAKE_WAREHOUSE              = var.snowflake_warehouse
    SNOWFLAKE_DATABASE               = var.snowflake_database
    SNOWFLAKE_SCHEMA                 = var.snowflake_schema
    SNOWFLAKE_PRIVATE_KEY_SECRET_ARN = module.snowflake_private_key.secret_arn
  }
}

# ── connect-shopify-stores ────────────────────────────────────────────────────
# Triggered hourly by EventBridge. Queries ARTIST_STORES and pushes new stores
# to the SQS onboarding queue.

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

  lambda_name        = "lambda-d2c-connect-shopify-stores"
  lambda_description = "Queries ARTIST_STORES for new Shopify stores and enqueues them for onboarding"
  environment        = var.environment
  application_family = var.application_family

  use_container_image      = true
  datadog_advanced_enabled = true

  lambda_function_timeout     = 300
  lambda_function_memory_size = 256
  cloudwatch_event_enabled  = var.eventbridge_schedule_enabled
  cloudwatch_event_schedule = "rate(1 hour)"

  vpc_enabled    = true
  vpc_id         = module.vpc_info.vpc_id
  vpc_subnet_ids = module.vpc_info.default_private_subnet_ids

  lambda_function_environment_variables = merge(local.snowflake_common_env, {
    SQS_QUEUE_URL = module.sqs.queue_url
  })

  iam_managed_policy_attachments = [
    aws_iam_policy.snowflake_secret.arn,
    aws_iam_policy.sqs_send.arn,
  ]

  ows_machine_to_machine_enabled = false
  splitio_enabled                = false
}

# ── onboard-shopify-stores ────────────────────────────────────────────────────
# SQS consumer (batch ≤ 20, max concurrency 2). Creates a Fivetran connector
# and Connect Card per store, writes pending_oauth state to Snowflake.

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

  lambda_name        = "lambda-d2c-onboard-shopify-stores"
  lambda_description = "Creates Fivetran connectors and Connect Cards for new Shopify stores"
  environment        = var.environment
  application_family = var.application_family

  use_container_image      = true
  datadog_advanced_enabled = true

  lambda_function_timeout                        = 300
  lambda_function_memory_size                    = 256
  lambda_function_reserved_concurrent_executions = 2 # intentional: avoids overwhelming Fivetran API during bulk onboarding

  sqs_event_enabled                 = true
  event_source_mapping_queue_name   = module.sqs.queue_name
  event_source_mapping_batch_size   = 20
  event_source_mapping_batch_window = 30

  vpc_enabled    = true
  vpc_id         = module.vpc_info.vpc_id
  vpc_subnet_ids = module.vpc_info.default_private_subnet_ids

  lambda_function_environment_variables = merge(local.snowflake_common_env, {
    FIVETRAN_CREDENTIALS_SECRET_ARN = module.fivetran_credentials.secret_arn
    FIVETRAN_GROUP_ID               = var.fivetran_group_id
    SES_FROM_ADDRESS                = "noreply-ecommerce@sonymusic.com"
    SES_SOURCE_ARN                  = "arn:aws:ses:us-east-1:437795906767:identity/sonymusic.com"
  })

  iam_managed_policy_attachments = [
    aws_iam_policy.snowflake_secret.arn,
    aws_iam_policy.fivetran_secret.arn,
    aws_iam_policy.ses_send.arn,
  ]

  ows_machine_to_machine_enabled = false
  splitio_enabled                = false
}

# ── sync-shopify-data-connectors ──────────────────────────────────────────────
# Triggered every 15 minutes by EventBridge. Sweeps all in-flight connectors,
# advances onboarding state, refreshes expired Connect Cards, upserts registry.

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

  lambda_name        = "lambda-d2c-sync-shopify-data-connectors"
  lambda_description = "Advances Fivetran connector state and upserts the store registry"
  environment        = var.environment
  application_family = var.application_family

  use_container_image      = true
  datadog_advanced_enabled = true

  lambda_function_timeout     = 900
  lambda_function_memory_size = 256
  cloudwatch_event_enabled  = var.eventbridge_schedule_enabled
  cloudwatch_event_schedule = "rate(15 minutes)"

  vpc_enabled    = true
  vpc_id         = module.vpc_info.vpc_id
  vpc_subnet_ids = module.vpc_info.default_private_subnet_ids

  lambda_function_environment_variables = merge(local.snowflake_common_env, {
    FIVETRAN_CREDENTIALS_SECRET_ARN = module.fivetran_credentials.secret_arn
    FIVETRAN_GROUP_ID               = var.fivetran_group_id
  })

  iam_managed_policy_attachments = [
    aws_iam_policy.snowflake_secret.arn,
    aws_iam_policy.fivetran_secret.arn,
  ]

  ows_machine_to_machine_enabled = false
  splitio_enabled                = false
}
