package manage

import (
	"fmt"
	"time"

	"github.com/tidbcloud/AgentTeam/internal/store/schedule"
)

func nextOccurrenceAfter(def definitionRecord, after time.Time) (*time.Time, error) {
	switch def.TimeMode {
	case TimeModeInterval:
		if def.AnchorAt == nil {
			return nil, fmt.Errorf("interval trigger %q is missing anchor_at", def.ID)
		}
		if def.IntervalSeconds == nil {
			return nil, fmt.Errorf("interval trigger %q is missing interval_seconds", def.ID)
		}
		next, err := schedule.NextIntervalOccurrence(*def.AnchorAt, *def.IntervalSeconds, after)
		if err != nil {
			return nil, normalizeIntervalOccurrenceError(err)
		}
		return &next, nil
	case TimeModeCron:
		next, err := schedule.NextCronOccurrenceAfter(def.CronExpression, def.Timezone, after)
		if err != nil {
			return nil, err
		}
		return &next, nil
	case TimeModeOneShotAbsolute, TimeModeOneShotRelative:
		return nil, nil
	default:
		return nil, fmt.Errorf("unsupported time mode %q", def.TimeMode)
	}
}

func normalizeIntervalOccurrenceError(err error) error {
	if err == nil {
		return nil
	}
	switch err.Error() {
	case "intervalSeconds must be positive":
		return fmt.Errorf("interval_seconds must be positive")
	case "intervalSeconds is too large":
		return fmt.Errorf("interval_seconds is too large")
	default:
		return err
	}
}
