package common

import (
	"time"

	"cloud.o-forge.io/core/oc-lib/models/common/pricing"
	"cloud.o-forge.io/core/oc-lib/tools"
)

func GetPlannerNearestStart(start time.Time, planned map[tools.DataType]map[string]pricing.PricedItemITF) float64 {
	near := float64(-1)             // unset sentinel
	for _, items := range planned { // loop through the planned items
		for _, priced := range items { // loop through the priced items
			if priced.GetLocationStart() == nil { // if the start is nil,
				continue // skip the iteration
			}
			newS := priced.GetLocationStart() // get the start
			diff := newS.Sub(start).Seconds() // get the difference
			if near < 0 || diff < near {      // if the difference is less than the nearest start
				near = diff
			}
		}
	}
	if near < 0 {
		return 0 // no items found, start at the given start time
	}
	return near
}

// GetPlannerLongestTime returns the sum of all processing+service durations.
// Returns -1 if any item is open-ended (no deadline).
func GetPlannerLongestTime(planned map[tools.DataType]map[string]pricing.PricedItemITF) float64 {
	longestTime := float64(0)
	for _, dt := range []tools.DataType{tools.PROCESSING_RESOURCE, tools.SERVICE_RESOURCE} {
		for _, priced := range planned[dt] {
			d := priced.GetExplicitDurationInS()
			if d < 0 {
				return -1
			}
			longestTime += d
		}
	}
	return longestTime
}
