resource "datadog_dashboard" "gds_msk" {
  title       = "GDS MSK (Enhanced)"
  description = "GDS MSK dashboard aligned with AMEBA observability model"
  layout_type = "free"
  tags        = ["team:ameba-team"]

  # -------- LAG SECTION --------

  widget {
    timeseries_definition {
      title = "Max Offset Lag"
      request {
        formula { formula_expression = "max_offset_lag" }
        query {
          metric_query {
            data_source = "metrics"
            name        = "max_offset_lag"
            query       = "max:aws.kafka.max_offset_lag{$cluster_name,$consumer_group,!consumer_group:rdx-simo*,!consumer_group:amazon*} by {consumer_group,topic}"
          }
        }
      }
    }
    widget_layout {
      x      = 20
      y      = 0
      width  = 36
      height = 15
    }
  }

  widget {
    timeseries_definition {
      title = "Sum Offset Lag"
      request {
        formula { formula_expression = "sum_offset_lag" }
        query {
          metric_query {
            data_source = "metrics"
            name        = "sum_offset_lag"
            query       = "max:aws.kafka.sum_offset_lag{$cluster_name,!consumer_group:rdx-simo*,!consumer_group:amazon*} by {consumer_group,topic}"
          }
        }
      }
    }
    widget_layout {
      x      = 57
      y      = 0
      width  = 36
      height = 15
    }
  }

  widget {
    timeseries_definition {
      title = "Lag Time"
      request {
        formula { formula_expression = "lag_time" }
        query {
          metric_query {
            data_source = "metrics"
            name        = "lag_time"
            query       = "max:aws.kafka.estimated_max_time_lag{$cluster_name,!consumer_group:rdx-simo*} by {consumer_group,topic}"
          }
        }
      }
    }
    widget_layout {
      x      = 94
      y      = 0
      width  = 36
      height = 15
    }
  }

  # -------- TRAFFIC --------

  widget {
    sunburst_definition {
      title = "Messages In"
      request {
        formula { formula_expression = "messages_in" }
        query {
          metric_query {
            data_source = "metrics"
            name        = "messages_in"
            query       = "avg:aws.kafka.messages_in_per_sec{$cluster_name,!topic:_amazon*,!consumer_group:rdx-simo*} by {topic}"
          }
        }
      }
    }
    widget_layout {
      x      = 20
      y      = 16
      width  = 35
      height = 30
    }
  }

  widget {
    sunburst_definition {
      title = "Consumer Lag Distribution"
      request {
        formula { formula_expression = "consumer_lag" }
        query {
          metric_query {
            data_source = "metrics"
            name        = "consumer_lag"
            query       = "sum:aws.kafka.sum_offset_lag{$cluster_name,!consumer_group:rdx-simo*} by {topic,consumer_group}"
          }
        }
      }
    }
    widget_layout {
      x      = 57
      y      = 16
      width  = 35
      height = 30
    }
  }

  widget {
    toplist_definition {
      title = "Top Lagging Consumers"
      request {
        formula { formula_expression = "top_lag" }
        query {
          metric_query {
            data_source = "metrics"
            name        = "top_lag"
            query       = "avg:aws.kafka.sum_offset_lag{$cluster_name,!consumer_group:rdx-simo*} by {consumer_group,topic}"
          }
        }
      }
    }
    widget_layout {
      x      = 94
      y      = 16
      width  = 40
      height = 30
    }
  }

  # -------- INFRA --------

  widget {
    timeseries_definition {
      title = "CPU User"
      request {
        formula { formula_expression = "cpu_user" }
        query {
          metric_query {
            data_source = "metrics"
            name        = "cpu_user"
            query       = "avg:aws.kafka.cpu_user{$cluster_name} by {broker_id}"
          }
        }
      }
    }
    widget_layout {
      x      = 20
      y      = 48
      width  = 30
      height = 15
    }
  }

  widget {
    timeseries_definition {
      title = "CPU System"
      request {
        formula { formula_expression = "cpu_system" }
        query {
          metric_query {
            data_source = "metrics"
            name        = "cpu_system"
            query       = "avg:aws.kafka.cpu_system{$cluster_name} by {broker_id}"
          }
        }
      }
    }
    widget_layout {
      x      = 51
      y      = 48
      width  = 30
      height = 15
    }
  }

  widget {
    timeseries_definition {
      title = "Free Memory"
      request {
        formula { formula_expression = "mem_free" }
        query {
          metric_query {
            data_source = "metrics"
            name        = "mem_free"
            query       = "sum:aws.kafka.memory_free{$cluster_name} by {broker_id}"
          }
        }
      }
    }
    widget_layout {
      x      = 82
      y      = 48
      width  = 30
      height = 15
    }
  }

  widget {
    timeseries_definition {
      title = "Used Memory"
      request {
        formula { formula_expression = "mem_used" }
        query {
          metric_query {
            data_source = "metrics"
            name        = "mem_used"
            query       = "sum:aws.kafka.memory_used{$cluster_name} by {broker_id}"
          }
        }
      }
    }
    widget_layout {
      x      = 20
      y      = 64
      width  = 30
      height = 15
    }
  }

  widget {
    timeseries_definition {
      title = "Disk Used (Data)"
      request {
        formula { formula_expression = "disk_data" }
        query {
          metric_query {
            data_source = "metrics"
            name        = "disk_data"
            query       = "sum:aws.kafka.kafka_data_logs_disk_used{$cluster_name} by {broker_id}"
          }
        }
      }
    }
    widget_layout {
      x      = 51
      y      = 64
      width  = 30
      height = 15
    }
  }

  widget {
    timeseries_definition {
      title = "Disk Used (App)"
      request {
        formula { formula_expression = "disk_app" }
        query {
          metric_query {
            data_source = "metrics"
            name        = "disk_app"
            query       = "sum:aws.kafka.kafka_app_logs_disk_used{$cluster_name} by {broker_id}"
          }
        }
      }
    }
    widget_layout {
      x      = 82
      y      = 64
      width  = 30
      height = 15
    }
  }

  # -------- CONNECTIONS --------

  widget {
    sunburst_definition {
      title = "Client Connections"
      request {
        formula { formula_expression = "connections" }
        query {
          metric_query {
            data_source = "metrics"
            name        = "connections"
            query       = "sum:aws.kafka.client_connection_count{$cluster_name} by {client_authentication}"
          }
        }
      }
    }
    widget_layout {
      x      = 0
      y      = 48
      width  = 18
      height = 20
    }
  }

  widget {
    sunburst_definition {
      title = "Traffic Bytes"
      request {
        formula { formula_expression = "traffic" }
        query {
          metric_query {
            data_source = "metrics"
            name        = "traffic"
            query       = "sum:aws.kafka.traffic_bytes{$cluster_name} by {client_authentication}"
          }
        }
      }
    }
    widget_layout {
      x      = 0
      y      = 70
      width  = 18
      height = 20
    }
  }

  template_variable {
    name     = "cluster_name"
    prefix   = "cluster_name"
    defaults = [var.gds_msk_cluster_name]
  }
  template_variable {
    name     = "topic"
    prefix   = "topic"
    defaults = ["*"]
  }
  template_variable {
    name     = "consumer_group"
    prefix   = "consumer_group"
    defaults = ["*"]
  }
  template_variable {
    name     = "service"
    prefix   = "kube_service"
    defaults = ["*"]
  }
  template_variable {
    name     = "node"
    prefix   = "node"
    defaults = ["*"]
  }
  template_variable {
    name     = "label"
    prefix   = "label"
    defaults = ["*"]
  }
}

resource "datadog_dashboard" "gds_eks" {
  title       = "GDS EKS"
  description = "GDS Kubernetes dashboard aligned with AMEBA observability model"
  layout_type = "free"
  tags        = ["team:ameba-team"]

  # ------------------ OVERVIEW ------------------

  widget {
    query_value_definition {
      title = "Running Pods"
      request {
        formula { formula_expression = "pods_running" }
        query {
          metric_query {
            data_source = "metrics"
            name        = "pods_running"
            query       = "sum:kubernetes.pods.running{$cluster_name}"
          }
        }
      }
    }
    widget_layout {
      x      = 0
      y      = 0
      width  = 15
      height = 8
    }
  }

  widget {
    query_value_definition {
      title = "Nodes"
      request {
        formula { formula_expression = "node_count" }
        query {
          metric_query {
            data_source = "metrics"
            name        = "node_count"
            query       = "sum:kubernetes_state.node.count{$cluster_name}"
          }
        }
      }
    }
    widget_layout {
      x      = 16
      y      = 0
      width  = 15
      height = 8
    }
  }

  widget {
    query_value_definition {
      title = "Deployments"
      request {
        formula { formula_expression = "count_nonzero(deployments)" }
        query {
          metric_query {
            data_source = "metrics"
            name        = "deployments"
            query       = "avg:kubernetes_state.deployment.replicas{$cluster_name} by {kube_deployment}"
          }
        }
      }
    }
    widget_layout {
      x      = 32
      y      = 0
      width  = 15
      height = 8
    }
  }

  # ------------------ POD HEALTH ------------------

  widget {
    timeseries_definition {
      title = "Pods Running per Namespace"
      request {
        display_type = "area"
        formula { formula_expression = "pods_running" }
        query {
          metric_query {
            data_source = "metrics"
            name        = "pods_running"
            query       = "sum:kubernetes.pods.running{$cluster_name} by {kube_namespace}"
          }
        }
      }
    }
    widget_layout {
      x      = 0
      y      = 10
      width  = 30
      height = 15
    }
  }

  widget {
    toplist_definition {
      title = "Pods in bad state"
      request {
        formula { formula_expression = "pods_bad_state" }
        query {
          metric_query {
            data_source = "metrics"
            name        = "pods_bad_state"
            query       = "sum:kubernetes_state.pod.status_phase{$cluster_name,!phase:running,!phase:succeeded} by {kube_namespace,phase}"
          }
        }
      }
    }
    widget_layout {
      x      = 31
      y      = 10
      width  = 30
      height = 15
    }
  }

  widget {
    timeseries_definition {
      title = "CrashLoopBackOff"
      request {
        display_type = "bars"
        formula { formula_expression = "crashloop" }
        query {
          metric_query {
            data_source = "metrics"
            name        = "crashloop"
            query       = "sum:kubernetes_state.container.waiting{$cluster_name,reason:crashloopbackoff} by {pod_name}"
          }
        }
      }
    }
    widget_layout {
      x      = 62
      y      = 10
      width  = 30
      height = 15
    }
  }

  # ------------------ CPU / MEMORY ------------------

  widget {
    toplist_definition {
      title = "Top CPU Pods"
      request {
        formula { formula_expression = "cpu_usage" }
        query {
          metric_query {
            data_source = "metrics"
            name        = "cpu_usage"
            query       = "sum:kubernetes.cpu.usage.total{$cluster_name} by {pod_name}"
          }
        }
      }
    }
    widget_layout {
      x      = 0
      y      = 26
      width  = 30
      height = 15
    }
  }

  widget {
    toplist_definition {
      title = "Top Memory Pods"
      request {
        formula { formula_expression = "mem_usage" }
        query {
          metric_query {
            data_source = "metrics"
            name        = "mem_usage"
            query       = "sum:kubernetes.memory.usage{$cluster_name} by {pod_name}"
          }
        }
      }
    }
    widget_layout {
      x      = 31
      y      = 26
      width  = 30
      height = 15
    }
  }

  widget {
    timeseries_definition {
      title = "CPU vs Requests"
      request {
        formula { formula_expression = "cpu_usage" }
        formula { formula_expression = "cpu_requests" }
        query {
          metric_query {
            data_source = "metrics"
            name        = "cpu_usage"
            query       = "sum:kubernetes.cpu.usage.total{$cluster_name} by {host}"
          }
        }
        query {
          metric_query {
            data_source = "metrics"
            name        = "cpu_requests"
            query       = "sum:kubernetes.cpu.requests{$cluster_name} by {host}"
          }
        }
      }
    }
    widget_layout {
      x      = 62
      y      = 26
      width  = 30
      height = 15
    }
  }

  # ------------------ NODE INFRA ------------------

  widget {
    hostmap_definition {
      title = "CPU per node"
      request {
        fill {
          q = "sum:kubernetes.cpu.usage.total{$cluster_name} by {host}"
        }
      }
    }
    widget_layout {
      x      = 0
      y      = 42
      width  = 30
      height = 15
    }
  }

  widget {
    hostmap_definition {
      title = "Memory per node"
      request {
        fill {
          q = "sum:kubernetes.memory.usage{$cluster_name} by {host}"
        }
      }
    }
    widget_layout {
      x      = 31
      y      = 42
      width  = 30
      height = 15
    }
  }

  # ------------------ NETWORK ------------------

  widget {
    timeseries_definition {
      title = "Network Errors"
      request {
        display_type = "bars"
        formula { formula_expression = "net_errors" }
        query {
          metric_query {
            data_source = "metrics"
            name        = "net_errors"
            query       = "sum:kubernetes.network_errors{$cluster_name} by {host}"
          }
        }
      }
    }
    widget_layout {
      x      = 62
      y      = 42
      width  = 30
      height = 15
    }
  }

  widget {
    timeseries_definition {
      title = "Network In"
      request {
        formula { formula_expression = "net_rx" }
        query {
          metric_query {
            data_source = "metrics"
            name        = "net_rx"
            query       = "sum:kubernetes.network.rx_bytes{$cluster_name} by {host}"
          }
        }
      }
    }
    widget_layout {
      x      = 0
      y      = 58
      width  = 45
      height = 15
    }
  }

  widget {
    timeseries_definition {
      title = "Network Out"
      request {
        formula { formula_expression = "net_tx" }
        query {
          metric_query {
            data_source = "metrics"
            name        = "net_tx"
            query       = "sum:kubernetes.network.tx_bytes{$cluster_name} by {host}"
          }
        }
      }
    }
    widget_layout {
      x      = 46
      y      = 58
      width  = 45
      height = 15
    }
  }

  template_variable {
    name     = "cluster_name"
    prefix   = "kube_cluster_name"
    defaults = [var.gds_eks_cluster_name]
  }
  template_variable {
    name     = "namespace"
    prefix   = "kube_namespace"
    defaults = [var.gds_eks_namespace]
  }
  template_variable {
    name     = "deployment"
    prefix   = "kube_deployment"
    defaults = ["*"]
  }
  template_variable {
    name     = "daemonset"
    prefix   = "kube_daemon_set"
    defaults = ["*"]
  }
  template_variable {
    name     = "service"
    prefix   = "kube_service"
    defaults = ["*"]
  }
  template_variable {
    name     = "node"
    prefix   = "node"
    defaults = ["*"]
  }
  template_variable {
    name     = "label"
    prefix   = "label"
    defaults = ["*"]
  }
  template_variable {
    name     = "scope"
    defaults = ["*"]
  }
}
