// Copyright (C) NHR@FAU, University Erlangen-Nuremberg.
// All rights reserved. This file is part of cc-backend.
// Use of this source code is governed by a MIT-style
// license that can be found in the LICENSE file.
package metricdispatch

import (
	"math"

	"github.com/ClusterCockpit/cc-backend/internal/config"
)

type ResamplePolicy string

const (
	ResamplePolicyLow    ResamplePolicy = "low"
	ResamplePolicyMedium ResamplePolicy = "medium"
	ResamplePolicyHigh   ResamplePolicy = "high"
)

// TargetPointsForPolicy returns the target number of data points for a given
// policy. The table lives in the config package so that the requested
// resolution and the resampler's MinimumRequiredPoints threshold can never
// diverge.
func TargetPointsForPolicy(policy ResamplePolicy) int {
	return config.TargetPointsForPolicy(string(policy))
}

// ComputeResolution computes the resampling resolution in seconds for a given
// job duration, metric frequency, and target point count. Returns 0 if the
// total number of data points is already at or below targetPoints (no resampling needed).
func ComputeResolution(duration int64, frequency int64, targetPoints int) int {
	if frequency <= 0 || targetPoints <= 0 || duration <= 0 {
		return 0
	}

	totalPoints := duration / frequency
	if totalPoints <= int64(targetPoints) {
		return 0
	}

	targetRes := math.Ceil(float64(duration) / float64(targetPoints))
	// Round up to nearest multiple of frequency
	resolution := int(math.Ceil(targetRes/float64(frequency))) * int(frequency)

	return resolution
}
