// This file was generated by https://github.com/grafana/dashboard-spec

{
  new(
    description=null,
    editable=true,
    graphTooltip=0,
    refresh=null,
    schemaVersion=25,
    style='dark',
    tags=[],
    timezone=null,
    title=null,
    uid=null,
  ):: {
    [if description != null then 'description']: description,
    [if editable != null then 'editable']: editable,
    [if graphTooltip != null then 'graphTooltip']: graphTooltip,
    [if refresh != null then 'refresh']: refresh,
    [if schemaVersion != null then 'schemaVersion']: schemaVersion,
    [if style != null then 'style']: style,
    [if tags != null then 'tags']: tags,
    [if timezone != null then 'timezone']: timezone,
    [if title != null then 'title']: title,
    [if uid != null then 'uid']: uid,

    setTime(
      from='now-6h',
      to='now',
    ):: self {}
        + { time+: { [if from != null then 'from']: from } }
        + { time+: { [if to != null then 'to']: to } }
    ,

    setTimepicker(
      refreshIntervals=['5s', '10s', '30s', '1m', '5m', '15m', '30m', '1h', '2h', '1d'],
    ):: self {}
        + { timepicker+: { [if refreshIntervals != null then 'refresh_intervals']: refreshIntervals } }
    ,


    addTemplate(
      template
    ):: self {}
        + { templating+: { list+: [
          template,
        ] } },

    addAnnotation(
      builtIn=0,
      datasource='default',
      enable=true,
      hide=false,
      iconColor=null,
      name=null,
      rawQuery=null,
      showIn=0,
    ):: self {}
        + { annotations+: { list+: [
          {
            [if builtIn != null then 'builtIn']: builtIn,
            [if datasource != null then 'datasource']: datasource,
            [if enable != null then 'enable']: enable,
            [if hide != null then 'hide']: hide,
            [if iconColor != null then 'iconColor']: iconColor,
            [if name != null then 'name']: name,
            [if rawQuery != null then 'rawQuery']: rawQuery,
            [if showIn != null then 'showIn']: showIn,
          },
        ] } },


    panels: [],
    _nextPanelID:: 2,
    addPanel(panel):: self {
      local nextPanelID = super._nextPanelID,
      panels+: [
        panel { id: nextPanelID } +
        if 'panels' in panel then { panels: std.mapWithIndex(function(i, p) p { id: nextPanelID + i + 1 }, panel.panels) } else {},
      ],
      _nextPanelID:: nextPanelID + 1 + (if 'panels' in panel then std.length(panel.panels) else 0),
    },
    addPanels(panels):: std.foldl(function(d, p) d.addPanel(p), panels, self),
  },
}
