/**
 * Copyright 2023 Google LLC
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

variable "data" {
  description = "The data source for DataScan. The source can be either a Dataplex `entity` or a BigQuery `resource`."
  type = object({
    entity   = optional(string)
    resource = optional(string)
  })
  validation {
    condition     = length([for k, v in var.data : v if contains(["resource", "entity"], k) && v != null]) == 1
    error_message = "Datascan data must specify one of 'entity', 'resource'."
  }
}

variable "data_profile_spec" {
  description = "DataProfileScan related setting. Variable descriptions are provided in https://cloud.google.com/dataplex/docs/reference/rest/v1/DataProfileSpec."
  default     = null
  type = object({
    sampling_percent = optional(number)
    row_filter       = optional(string)
  })
}

variable "data_quality_spec" {
  description = "DataQualityScan related setting. Variable descriptions are provided in https://cloud.google.com/dataplex/docs/reference/rest/v1/DataQualitySpec."
  default     = null
  type = object({
    sampling_percent = optional(number)
    row_filter       = optional(string)
    post_scan_actions = optional(object({
      bigquery_export = optional(object({
        results_table = optional(string)
      }))
    }))
    rules = list(object({
      column               = optional(string)
      ignore_null          = optional(bool, null)
      dimension            = string
      threshold            = optional(number)
      non_null_expectation = optional(object({}))
      range_expectation = optional(object({
        min_value          = optional(number)
        max_value          = optional(number)
        strict_min_enabled = optional(bool)
        strict_max_enabled = optional(bool)
      }))
      regex_expectation = optional(object({
        regex = string
      }))
      set_expectation = optional(object({
        values = list(string)
      }))
      uniqueness_expectation = optional(object({}))
      statistic_range_expectation = optional(object({
        statistic          = string
        min_value          = optional(number)
        max_value          = optional(number)
        strict_min_enabled = optional(bool)
        strict_max_enabled = optional(bool)
      }))
      row_condition_expectation = optional(object({
        sql_expression = string
      }))
      table_condition_expectation = optional(object({
        sql_expression = string
      }))
    }))
  })
}

variable "description" {
  description = "Custom description for DataScan."
  default     = null
  type        = string
}

variable "execution_schedule" {
  description = "Schedule DataScan to run periodically based on a cron schedule expression. If not specified, the DataScan is created with `on_demand` schedule, which means it will not run until the user calls `dataScans.run` API."
  type        = string
  default     = null
}

variable "factories_config" {
  description = "Paths to data files and folders that enable factory functionality."
  type = object({
    data_quality_spec = optional(string)
  })
  nullable = false
  default  = {}
}

variable "incremental_field" {
  description = "The unnested field (of type Date or Timestamp) that contains values which monotonically increase over time. If not specified, a data scan will run for all data in the table."
  type        = string
  default     = null
}

variable "labels" {
  description = "Resource labels."
  type        = map(string)
  default     = {}
  nullable    = false
}

variable "name" {
  description = "Name of Dataplex Scan."
  type        = string
}

variable "prefix" {
  description = "Optional prefix used to generate Dataplex DataScan ID."
  type        = string
  default     = null
}

variable "project_id" {
  description = "The ID of the project where the Dataplex DataScan will be created."
  type        = string
}

variable "region" {
  description = "Region for the Dataplex DataScan."
  type        = string
}
