provider "aws" {
  region = var.aws_region
}

# Terraform backends cannot contain interpolations
terraform {
  backend "s3" {
    bucket  = "orcd-terraform-state"
    key     = "prod/auth0/dashboards/terraform.tfstate"
    region  = "us-east-1"
    encrypt = "true"
  }
}

resource "datadog_dashboard" "auth0_dashboard" {
  description  = "Auth0 Dashboard"
  layout_type  = "ordered"
  reflow_type  = "auto"
  title        = "Auth0 Dashboard"

  template_variable {
    name     = "tenant"
    prefix   = "tenant"
    defaults = ["workstation"]
    available_values = [
      "dev-orchard",
      "prod-dns-apps",
      "qa-orchard",
      "workstation"
    ]
  }

  widget {
    group_definition {
      layout_type = "ordered"
      title       = "Logins"

      widget {
        query_value_definition {
          autoscale = "true"
          precision = "2"

          request {
            query {
              event_query {
                compute {
                  aggregation = "count"
                  interval    = "0"
                }

                data_source = "logs"
                indexes     = ["main"]
                name        = "query1"

                search {
                  query = "source:auth0 $tenant @evt.name:failed_login*"
                }
              }
            }
          }

          title = "Failed Logins (Count)"
        }
      }

      widget {
        query_value_definition {
          autoscale = "true"
          precision = "2"

          request {
            query {
              event_query {
                compute {
                  aggregation = "count"
                  interval    = "0"
                }

                data_source = "logs"
                indexes     = ["main"]
                name        = "query1"

                search {
                  query = "source:auth0 $tenant @evt.name:success_login*"
                }
              }
            }
          }

          title = "Successful Logins (Count)"
        }
      }

      widget {
        toplist_definition {
          request {
            formula {
              formula_expression = "query1"

              limit {
                count = "100"
                order = "desc"
              }
            }

            query {
              event_query {
                compute {
                  aggregation = "count"
                  interval    = "0"
                }

                data_source = "logs"

                group_by {
                  facet = "@data.connection"
                  limit = "100"

                  sort {
                    aggregation = "count"
                    order       = "desc"
                  }
                }

                indexes = ["main"]
                name    = "query1"

                search {
                  query = "source:auth0 $tenant @evt.name:success_login"
                }
              }
            }
          }

          title = "Logins By Connection"
        }
      }

      widget {
        timeseries_definition {
          legend_layout = "auto"
          legend_size   = "0"

          request {
            display_type   = "bars"
            on_right_yaxis = "false"

            query {
              event_query {
                compute {
                  aggregation = "count"
                  interval    = "0"
                }

                data_source = "logs"

                group_by {
                  facet = "@evt.name"
                  limit = "100"
                }

                indexes = ["main"]
                name    = "query1"

                search {
                  query = "source:auth0 $tenant @evt.name:failed_login*"
                }
              }
            }

            style {
              line_type  = "solid"
              line_width = "normal"
              palette    = "warm"
            }
          }

          show_legend = "true"
          title       = "Failed Logins"
        }
      }

      widget {
        timeseries_definition {
          legend_layout = "auto"
          legend_size   = "0"

          request {
            display_type   = "bars"
            on_right_yaxis = "false"

            query {
              event_query {
                compute {
                  aggregation = "count"
                  interval    = "0"
                }

                data_source = "logs"

                indexes = ["main"]
                name    = "query1"

                search {
                  query = "source:auth0 $tenant @evt.name:success_login*"
                }
              }
            }

            style {
              line_type  = "solid"
              line_width = "normal"
              palette    = "dog_classic"
            }
          }

          show_legend = "true"
          title       = "Successful Logins"
        }
      }

      widget {
        timeseries_definition {
          legend_layout = "auto"
          legend_size   = "0"

          request {
            display_type   = "bars"
            on_right_yaxis = "false"

            query {
              event_query {
                compute {
                  aggregation = "count"
                  interval    = "0"
                }

                data_source = "logs"

                group_by {
                  facet = "@evt.name"
                  limit = "100"
                }

                indexes = ["main"]
                name    = "query1"

                search {
                  query = "source:auth0 $tenant @evt.name:*logout"
                }
              }
            }

            style {
              line_type  = "solid"
              line_width = "normal"
              palette    = "warm"
            }
          }

          show_legend = "true"
          title       = "Failed/Successful Logouts"
        }
      }

      widget {
        timeseries_definition {
          legend_layout = "auto"
          legend_size   = "0"

          request {
            display_type   = "bars"
            on_right_yaxis = "false"

            query {
              event_query {
                compute {
                  aggregation = "cardinality"
                  interval    = "0"
                  metric      = "@usr.name"
                }

                data_source = "logs"

                group_by {
                  facet = "@data.client_name"
                  limit = "100"

                  sort {
                    aggregation = "cardinality"
                    metric      = "@usr.name"
                    order       = "desc"
                  }
                }

                indexes = ["main"]
                name    = "query1"

                search {
                  query = "source:auth0 $tenant @evt.name:failed_login*"
                }
              }
            }

            style {
              line_type  = "solid"
              line_width = "normal"
              palette    = "warm"
            }
          }

          show_legend = "true"
          title       = "Failed Logins By App"

          yaxis {
            include_zero = "true"
            max          = "auto"
            min          = "auto"
            scale        = "linear"
          }
        }
      }

      widget {
        timeseries_definition {
          legend_layout = "auto"
          legend_size   = "0"

          request {
            display_type   = "bars"
            on_right_yaxis = "false"

            query {
              event_query {
                compute {
                  aggregation = "count"
                  interval    = "0"
                }

                data_source = "logs"

                group_by {
                  facet = "@data.client_name"
                  limit = "100"

                  sort {
                    aggregation = "count"
                    order       = "desc"
                  }
                }

                indexes = ["main"]
                name    = "query1"

                search {
                  query = "source:auth0 $tenant @evt.name:success_login*"
                }
              }
            }

            style {
              line_type  = "solid"
              line_width = "normal"
              palette    = "dog_classic"
            }
          }

          show_legend = "true"
          title       = "Successful Logins Per App"

          yaxis {
            include_zero = "true"
            max          = "auto"
            min          = "auto"
            scale        = "linear"
          }
        }
      }

    }
  }

  widget {
    group_definition {
      layout_type = "ordered"
      title       = "Signups"

      widget {
        query_value_definition {
          autoscale = "true"
          precision = "2"

          request {
            query {
              event_query {
                compute {
                  aggregation = "count"
                  interval    = "0"
                }

                data_source = "logs"
                indexes     = ["main"]
                name        = "query1"

                search {
                  query = "source:auth0 $tenant @evt.name:success_signup"
                }
              }
            }
          }

          title = "Signup Successes (Count)"
        }
      }

      widget {
        query_value_definition {
          autoscale = "true"
          precision = "2"

          request {
            query {
              event_query {
                compute {
                  aggregation = "count"
                  interval    = "0"
                }

                data_source = "logs"
                indexes     = ["main"]
                name        = "query1"

                search {
                  query = "source:auth0 $tenant @evt.name:failed_signup"
                }
              }
            }
          }

          title = "Signup Failures (Count)"
        }
      }

      widget {
        timeseries_definition {
          legend_layout = "auto"
          legend_size   = "0"

          request {
            display_type   = "bars"
            on_right_yaxis = "false"

            query {
              event_query {
                compute {
                  aggregation = "count"
                  interval    = "0"
                }

                data_source = "logs"

                indexes = ["main"]
                name    = "query1"

                search {
                  query = "source:auth0 $tenant @evt.name:success_signup"
                }
              }
            }

            style {
              line_type  = "solid"
              line_width = "normal"
              palette    = "dog_classic"
            }
          }

          show_legend = "true"
          title       = "Signup Successes"
        }
      }

      widget {
        timeseries_definition {
          legend_layout = "auto"
          legend_size   = "0"

          request {
            display_type   = "bars"
            on_right_yaxis = "false"

            query {
              event_query {
                compute {
                  aggregation = "count"
                  interval    = "0"
                }

                data_source = "logs"

                indexes = ["main"]
                name    = "query1"

                search {
                  query = "source:auth0 $tenant @evt.name:failed_signup"
                }
              }
            }

            style {
              line_type  = "solid"
              line_width = "normal"
              palette    = "dog_classic"
            }
          }

          show_legend = "true"
          title       = "Signup Failures"
        }
      }
    }
  }

  widget {
    group_definition {
      layout_type = "ordered"
      title       = "Email Change and Verification"

      widget {
        timeseries_definition {
          request {
            display_type = "bars"

            formula {
              formula_expression = "query1"
            }

            on_right_yaxis = "false"

            query {
              event_query {
                compute {
                  aggregation = "count"
                  interval    = "0"
                }

                data_source = "logs"

                group_by {
                  facet = "@evt.name"
                  limit = "100"

                  sort {
                    aggregation = "count"
                    order       = "desc"
                  }
                }

                indexes = ["main"]
                name    = "query1"

                search {
                  query = "source:auth0 $tenant @evt.name:*_change_email"
                }
              }
            }

            style {
              palette = "dog_classic"
            }
          }

          title = "Failed/Successful Email Changes"
        }
      }

      widget {
        timeseries_definition {
          request {
            display_type = "bars"

            formula {
              formula_expression = "query1"
            }

            on_right_yaxis = "false"

            query {
              event_query {
                compute {
                  aggregation = "count"
                  interval    = "0"
                }

                data_source = "logs"

                group_by {
                  facet = "@evt.name"
                  limit = "100"

                  sort {
                    aggregation = "count"
                    order       = "desc"
                  }
                }

                indexes = ["main"]
                name    = "query1"

                search {
                  query = "source:auth0 $tenant @evt.name:*_verification_email"
                }
              }
            }

            style {
              palette = "dog_classic"
            }
          }

          title = "Failed/Successful Email Verifications"
        }
      }

      widget {
        timeseries_definition {
          request {
            display_type = "bars"

            formula {
              formula_expression = "query1"
            }

            on_right_yaxis = "false"

            query {
              event_query {
                compute {
                  aggregation = "count"
                  interval    = "0"
                }

                data_source = "logs"

                group_by {
                  facet = "@evt.name"
                  limit = "100"

                  sort {
                    aggregation = "count"
                    order       = "desc"
                  }
                }

                indexes = ["main"]
                name    = "query1"

                search {
                  query = "source:auth0 $tenant @evt.name:*_verification_email_request"
                }
              }
            }

            style {
              palette = "dog_classic"
            }
          }

          title = "Failed/Successful Email Verification Requests"
        }
      }
    }
  }

  widget {
    group_definition {
      layout_type = "ordered"
      title       = "MFA"

      widget {
        query_value_definition {
          autoscale = "true"
          precision = "2"

          request {
            query {
              event_query {
                compute {
                  aggregation = "count"
                  interval    = "0"
                }

                data_source = "logs"
                indexes     = ["main"]
                name        = "query1"

                search {
                  query = "source:auth0 $tenant @evt.name:multifactor_enrollment_complete"
                }
              }
            }
          }

          title = "MFA Enrollment Complete (Count)"
        }
      }

       widget {
        timeseries_definition {
          legend_layout = "auto"
          legend_size   = "0"

          request {
            display_type   = "bars"
            on_right_yaxis = "false"

            query {
              event_query {
                compute {
                  aggregation = "count"
                  interval    = "0"
                }

                data_source = "logs"

                indexes = ["main"]
                name    = "query1"

                search {
                  query = "source:auth0 $tenant @evt.name:multifactor_enrollment_complete"
                }
              }
            }

            style {
              line_type  = "solid"
              line_width = "normal"
              palette    = "dog_classic"
            }
          }

          show_legend = "true"
          title       = "MFA Enrollment Complete"
        }
      }
      
      widget {
        timeseries_definition {
          legend_layout = "auto"
          legend_size   = "0"

          request {
            display_type   = "bars"
            on_right_yaxis = "false"

            query {
              event_query {
                compute {
                  aggregation = "count"
                  interval    = "0"
                }

                data_source = "logs"

                group_by {
                  facet = "@data.description"
                  limit = "100"
                }

                indexes = ["main"]
                name    = "query1"

                search {
                  query = "source:auth0 $tenant @evt.name:multifactor_enroll_started"
                }
              }
            }

            style {
              line_type  = "solid"
              line_width = "normal"
              palette    = "dog_classic"
            }
          }

          show_legend = "true"
          title       = "MFA Enrollment Started"
        }
      }

      widget {
        query_value_definition {
          autoscale = "true"
          precision = "2"

          request {
            query {
              event_query {
                compute {
                  aggregation = "count"
                  interval    = "0"
                }

                data_source = "logs"
                indexes     = ["main"]
                name        = "query1"

                search {
                  query = "source:auth0 $tenant @evt.name:multifactor_recovery_success"
                }
              }
            }
          }

          title = "MFA Recovery Successes"
        }
      }
      
      widget {
        timeseries_definition {
          request {
            display_type = "bars"

            formula {
              formula_expression = "query1"
            }

            on_right_yaxis = "false"

            query {
              event_query {
                compute {
                  aggregation = "count"
                  interval    = "0"
                }

                data_source = "logs"

                group_by {
                  facet = "@evt.name"
                  limit = "100"

                  sort {
                    aggregation = "count"
                    order       = "desc"
                  }
                }

                indexes = ["main"]
                name    = "query1"

                search {
                  query = "source:auth0 $tenant @evt.name:multifactor_*_device_account"
                }
              }
            }

            style {
              palette = "dog_classic"
            }
          }

          title = "MFA Device Updates and Unenrollment"
        }
      }

      widget {
        timeseries_definition {
          request {
            display_type = "bars"

            formula {
              formula_expression = "query1"
            }

            on_right_yaxis = "false"

            query {
              event_query {
                compute {
                  aggregation = "count"
                  interval    = "0"
                }

                data_source = "logs"

                group_by {
                  facet = "@evt.name"
                  limit = "100"

                  sort {
                    aggregation = "count"
                    order       = "desc"
                  }
                }

                indexes = ["main"]
                name    = "query1"

                search {
                  query = "source:auth0 $tenant @evt.name:(multifactor_auth_*)"
                }
              }
            }

            style {
              palette = "dog_classic"
            }
          }

          title = "MFA Failed/Successful Auth"
        }
      }
    }
  }

  widget {
    group_definition {
      layout_type = "ordered"
      title       = "Blocks and Breached Credentials"

      widget {
        timeseries_definition {
          request {
            display_type = "bars"

            formula {
              formula_expression = "query1"
            }

            on_right_yaxis = "false"

            query {
              event_query {
                compute {
                  aggregation = "count"
                  interval    = "0"
                }

                data_source = "logs"

                group_by {
                  facet = "@data.description"
                  limit = "100"

                  sort {
                    aggregation = "count"
                    order       = "desc"
                  }
                }

                indexes = ["main"]
                name    = "query1"

                search {
                  query = "source:auth0 $tenant @evt.name:blocked_account"
                }
              }
            }

            style {
              palette = "dog_classic"
            }
          }

          title = "Blocked Accounts"
        }
      }

      widget {
        timeseries_definition {
          request {
            display_type = "bars"

            formula {
              formula_expression = "query1"
            }

            on_right_yaxis = "false"

            query {
              event_query {
                compute {
                  aggregation = "count"
                  interval    = "0"
                }

                data_source = "logs"

                group_by {
                  facet = "@data.description"
                  limit = "100"

                  sort {
                    aggregation = "count"
                    order       = "desc"
                  }
                }

                indexes = ["main"]
                name    = "query1"

                search {
                  query = "source:auth0 $tenant @evt.name:breached_password"
                }
              }
            }

            style {
              palette = "dog_classic"
            }
          }

          title = "Breached Passwords"
        }
      }
    }
  }

  widget {
    log_stream_definition {
      query               = "source:auth0 $tenant"
      columns             = ["tenant", "@network.client.ip", "@data.client_name", "@evt.name", "content"]
      show_date_column    = true
      show_message_column = true
      title               = "Log Events"
    }
  }
}
