provider "aws" {
  region = var.aws_region
}

terraform {
  backend "s3" {
    bucket  = "prod-global-ds-terraform-state"
    key     = "prod/fivetran/terraform.tfstate"
    region  = "eu-central-1"
    encrypt = "true"
  }
}

resource "fivetran_group" "group" {
  name = "${upper(var.environment)}_GLOBAL_DS"
}

data "aws_db_instance" "instance" {
  db_instance_identifier = "gateway-prod-rds-01"
}

resource "fivetran_connector" "connector" {
  group_id = fivetran_group.group.id
  service  = "postgres_rds"

  destination_schema {
    prefix = "global_ds"
  }

  config {
    host             = data.aws_db_instance.instance.endpoint
    port             = data.aws_db_instance.instance.port
    user             = "fivetran"
    database         = "rel_mgr"
    tunnel_host      = "fivetran-proxy-a5c8abbb14d9fe20.elb.eu-central-1.amazonaws.com"
    tunnel_port      = "2222"
    tunnel_user      = "fivetran"
    update_method    = "WAL_PGOUTPUT"
    replication_slot = "snowflake_fivetran"
    publication_name = "pub_tables_for_snowflake"
  }
}

resource "fivetran_connector_schedule" "connector_schedule" {
  connector_id   = fivetran_connector.connector.id
  sync_frequency = 60
}

resource "fivetran_connector_schema_config" "schema" {
  connector_id           = fivetran_connector.connector.id
  schema_change_handling = "ALLOW_COLUMNS"

  schemas = {
    "rel_mgr" = {
      tables = { for table_name in var.rel_mgr_enabled_tables : table_name => {
        enabled   = true
        sync_mode = "SOFT_DELETE"
      } }
      enabled = true
    }
  }
}

resource "fivetran_destination" "destination" {
  group_id         = fivetran_group.group.id
  service          = "snowflake"
  time_zone_offset = "0"
  region           = "AWS_EU_CENTRAL_1"
  run_setup_tests  = "true"

  config {
    auth            = "KEY_PAIR"
    host            = "sme-delphi.snowflakecomputing.com"
    port            = 443
    user            = "PROD_FIVETRAN_GLOBAL_DS"
    database        = "GLOBAL_DS_APP_REPORTING"
    connection_type = "Directly"
    private_key     = "dummy"
  }

  lifecycle {
    ignore_changes = [
      config.private_key
    ]
  }
}
