provider "snowflake" {
  account_name             = "delphi"
  role                     = "PROD_ATLANTIS"
  preview_features_enabled = ["snowflake_table_resource"]
}

module "database" {
  source = "../../../modules/database"

  database_name         = "TERRAFORM_SNOWFLAKE_TEST"
  enable_account_roles  = false
  enable_database_roles = true

  schemas = [
    {
      name    = "SCHEMA_A"
      managed = false
    },
    {
      name                 = "SCHEMA_B"
      managed              = false
      read_role_name       = "SCHEMA_B_CUSTOM_RO_ROLE_NAME"
      read_write_role_name = "SCHEMA_B_CUSTOM_RW_ROLE_NAME"
    }
  ]
}

resource "snowflake_table" "test_1" {
  database = module.database.database_name
  schema   = "SCHEMA_A"
  name     = "TEST_TABLE_1"

  column {
    name = "id"
    type = "NUMBER(38,0)"
  }

  depends_on = [module.database]
}

resource "snowflake_table" "test_2" {
  database = module.database.database_name
  schema   = "SCHEMA_A"
  name     = "TEST_TABLE_2"

  column {
    name = "id"
    type = "NUMBER(38,0)"
  }

  depends_on = [module.database]
}

resource "snowflake_table" "test_3" {
  database = module.database.database_name
  schema   = "SCHEMA_B"
  name     = "TEST_TABLE_3"

  column {
    name = "id"
    type = "NUMBER(38,0)"
  }

  depends_on = [module.database]
}

resource "snowflake_view" "view_1" {
  database = module.database.database_name
  schema   = "SCHEMA_B"
  name     = "TEST_VIEW_1"

  statement = <<-SQL
    select * from SCHEMA_B.${snowflake_table.test_3.name};
SQL

  depends_on = [module.database]
}

module "objects_access_role" {
  source           = "../../../internal/objects_access_database_role"
  database_name    = module.database.database_name
  role_name_suffix = "TEST_ROLE"

  schema_objects_by_type_and_privileges = [
    {
      schema     = "SCHEMA_A",
      type       = "table",
      objects    = [snowflake_table.test_1.name, snowflake_table.test_2.name],
      privileges = ["SELECT", "INSERT"],
    },
    {
      schema     = "SCHEMA_B",
      type       = "view",
      objects    = [snowflake_view.view_1.name],
      privileges = ["SELECT"],
    },
  ]
}
