resource "snowflake_warehouse" "warehouse" {
  name           = var.name
  warehouse_size = var.size

  auto_resume                         = var.auto_resume
  auto_suspend                        = var.auto_suspend
  enable_query_acceleration           = var.enable_query_acceleration
  max_cluster_count                   = var.max_cluster_count
  min_cluster_count                   = var.min_cluster_count
  max_concurrency_level               = var.max_concurrency_level
  scaling_policy                      = var.scaling_policy
  query_acceleration_max_scale_factor = var.query_acceleration_max_scale_factor
  statement_timeout_in_seconds        = var.statement_timeout_in_seconds
  statement_queued_timeout_in_seconds = var.statement_queued_timeout_in_seconds
  comment                             = var.comment
  resource_monitor                    = var.resource_monitor_enabled ? snowflake_resource_monitor.monitor[0].name : null
  warehouse_type                      = var.warehouse_type
  generation                          = var.generation
  resource_constraint                 = var.resource_constraint

  lifecycle {
    ignore_changes = [
      resource_monitor,
    ]
  }
}

resource "snowflake_resource_monitor" "monitor" {
  count = var.resource_monitor_enabled ? 1 : 0

  name = "${var.resource_monitor_frequency}_USAGE_${var.name}"

  credit_quota    = var.resource_monitor_quota
  frequency       = var.resource_monitor_frequency
  start_timestamp = var.resource_monitor_start_timestamp
}

# Create access role which can in turn be granted to functional roles.
resource "snowflake_account_role" "access_role" {
  name    = "${snowflake_warehouse.warehouse.name}_WAREHOUSE_ACCESS"
  comment = "Managed by Terraform"
}

resource "snowflake_grant_ownership" "access_role_ownership" {
  account_role_name   = "USERADMIN"
  outbound_privileges = "COPY"

  on {
    object_type = "ROLE"
    object_name = snowflake_account_role.access_role.name
  }
}

resource "snowflake_grant_privileges_to_account_role" "warehouse" {
  privileges        = ["MONITOR", "OPERATE", "USAGE"]
  account_role_name = snowflake_account_role.access_role.name

  on_account_object {
    object_type = "WAREHOUSE"
    object_name = snowflake_warehouse.warehouse.name
  }
}

# Create monitor role which can in turn be granted to functional roles.
resource "snowflake_account_role" "monitor_role" {
  name    = "${snowflake_warehouse.warehouse.name}_WAREHOUSE_MONITOR"
  comment = "Managed by Terraform"
}

resource "snowflake_grant_ownership" "monitor_role_ownership" {
  account_role_name   = "USERADMIN"
  outbound_privileges = "COPY"

  on {
    object_type = "ROLE"
    object_name = snowflake_account_role.monitor_role.name
  }
}

resource "snowflake_grant_privileges_to_account_role" "monitor_warehouse" {
  privileges        = ["MONITOR"]
  account_role_name = snowflake_account_role.monitor_role.name

  on_account_object {
    object_type = "WAREHOUSE"
    object_name = snowflake_warehouse.warehouse.name
  }
}

resource "snowflake_grant_account_role" "monitor_warehouse_to_all_warehouse_monitor_role" {
  role_name        = snowflake_account_role.monitor_role.name
  parent_role_name = "ALL_WAREHOUSE_MONITOR"
}

# assign team tag
resource "snowflake_tag_association" "team_warehouse_association" {
  count = var.team != "" ? 1 : 0

  object_identifiers = [snowflake_warehouse.warehouse.name] # list of warehouses
  object_type        = "WAREHOUSE"
  tag_id             = var.team_tag_name
  tag_value          = var.team # team name
}
