package promql

import (
	"github.com/VictoriaMetrics/metricsql"
)

// IsRollup verifies whether s is a rollup with non-empty window.
//
// It returns the wrapped query with the corresponding window, step and offset.
func IsRollup(s string) (childQuery string, window, step, offset *metricsql.DurationExpr) {
	expr, err := parsePromQLWithCache(s)
	if err != nil {
		return
	}
	re, ok := expr.(*metricsql.RollupExpr)
	if !ok || re.Window == nil {
		return
	}
	wrappedQuery := re.Expr.AppendString(nil)
	return string(wrappedQuery), re.Window, re.Step, re.Offset
}

// IsMetricSelectorWithRollup verifies whether s contains PromQL metric selector
// wrapped into rollup.
//
// It returns the wrapped query with the corresponding window with offset.
func IsMetricSelectorWithRollup(s string) (childQuery string, window, offset *metricsql.DurationExpr) {
	expr, err := parsePromQLWithCache(s)
	if err != nil {
		return
	}
	re, ok := expr.(*metricsql.RollupExpr)
	if !ok || re.Window == nil || re.Step != nil {
		return
	}
	me, ok := re.Expr.(*metricsql.MetricExpr)
	if !ok || len(me.LabelFilters) == 0 {
		return
	}
	wrappedQuery := me.AppendString(nil)
	return string(wrappedQuery), re.Window, re.Offset
}