locals {
  db_read_privileges       = toset(["MONITOR", "USAGE"])
  db_write_privileges      = toset(["CREATE SCHEMA", "MODIFY", ])
  db_read_write_privileges = setunion(local.db_read_privileges, local.db_write_privileges)

  schema_read_privileges = toset(["MONITOR", "USAGE"])
  schema_write_privileges = toset([
    "ADD SEARCH OPTIMIZATION",
    "CREATE CORTEX SEARCH SERVICE",
    "CREATE DYNAMIC TABLE",
    "CREATE EXTERNAL TABLE",
    "CREATE FILE FORMAT",
    "CREATE FUNCTION",
    "CREATE GIT REPOSITORY",
    "CREATE HYBRID TABLE",
    "CREATE MASKING POLICY",
    "CREATE MATERIALIZED VIEW",
    "CREATE MODEL",
    "CREATE NOTEBOOK",
    "CREATE NOTEBOOK PROJECT",
    "CREATE PIPE",
    "CREATE PROCEDURE",
    "CREATE ROW ACCESS POLICY",
    "CREATE SEMANTIC VIEW",
    "CREATE SEQUENCE",
    "CREATE SESSION POLICY",
    "CREATE SNOWFLAKE.ML.CLASSIFICATION",
    "CREATE STAGE",
    "CREATE STREAM",
    "CREATE STREAMLIT",
    "CREATE TABLE",
    "CREATE TASK",
    "CREATE TEMPORARY TABLE",
    "CREATE VIEW",
    "CREATE WORKSPACE",
    "MODIFY",
  ])
  schema_read_write_privileges = setunion(local.schema_read_privileges, local.schema_write_privileges)

  schema_object_privileges = {
    "CORTEX SEARCH SERVICES" = {
      read  = ["USAGE"]
      write = ["OPERATE"]
    }
    "DYNAMIC TABLES" = {
      read  = ["SELECT", "MONITOR"]
      write = ["OPERATE"]
    }
    "FILE FORMATS" = {
      read  = ["USAGE"]
      write = []
    }
    FUNCTIONS = {
      read  = ["USAGE"]
      write = []
    }
    "MATERIALIZED VIEWS" = {
      read  = ["REFERENCES", "SELECT"]
      write = []
    }
    "SEMANTIC VIEWS" = {
      read  = ["REFERENCES", "SELECT"]
      write = []
    }
    PIPES = {
      read  = ["MONITOR"]
      write = ["OPERATE"]
    }
    PROCEDURES = {
      read  = ["USAGE"]
      write = []
    }
    SEQUENCES = {
      read  = ["USAGE"]
      write = []
    }
    STAGES = {
      read  = ["READ"]
      write = ["USAGE", "WRITE"]
    }
    STREAMS = {
      read  = ["SELECT"]
      write = []
    }
    TABLES = {
      read  = ["REFERENCES", "SELECT"]
      write = ["DELETE", "INSERT", "REBUILD", "TRUNCATE", "UPDATE"]
    }
    TASKS = {
      read  = ["MONITOR"]
      write = ["OPERATE"]
    }
    VIEWS = {
      read  = ["REFERENCES", "SELECT"]
      write = []
    }
  }

  schemas_by_name = { for schema in var.schemas : schema.name => schema }
}

resource "snowflake_database" "db" {
  name                        = var.database_name
  comment                     = "Managed by Terraform"
  data_retention_time_in_days = var.db_data_retention_time_in_days
}

resource "snowflake_schema" "schema" {
  for_each = local.schemas_by_name

  with_managed_access         = each.value.is_managed
  database                    = snowflake_database.db.name
  name                        = each.value.name
  comment                     = "Managed by Terraform"
  data_retention_time_in_days = each.value.data_retention_days
  is_transient                = each.value.is_transient
  log_level                   = each.value.log_level
  trace_level                 = each.value.trace_level
}
