package validation

import (
	"fmt"
	"strings"
	"time"

	"github.com/robfig/cron/v3"
	maintent "github.com/tidbcloud/devops/entity/maintenance"
)

var (
	ClusterMaintenance = clusterMaintenanceValidator{}
)

type clusterMaintenanceValidator struct{}

func (v clusterMaintenanceValidator) ClusterOpsMaintenanceWindows(windows []maintent.ClusterOpsMaintenanceWindowSlot) error {
	if len(windows) == 0 {
		return fmt.Errorf("windows is required")
	}

	for i, window := range windows {
		if strings.TrimSpace(window.StartCronSpec) == "" {
			return fmt.Errorf("windows[%d].start_cron_spec is required", i)
		}
		if _, err := cron.ParseStandard(window.StartCronSpec); err != nil {
			return fmt.Errorf("windows[%d].start_cron_spec invalid: %w", i, err)
		}
		if strings.TrimSpace(window.Duration) == "" {
			return fmt.Errorf("windows[%d].duration is required", i)
		}
		d, err := time.ParseDuration(window.Duration)
		if err != nil {
			return fmt.Errorf("windows[%d].duration invalid: %w", i, err)
		}
		if d <= 0 {
			return fmt.Errorf("windows[%d].duration must be greater than 0", i)
		}
	}

	return nil
}

func (v clusterMaintenanceValidator) OpsExecutionWindow(window *maintent.OpsExecutionWindow) error {
	if window.StartAt == 0 {
		return fmt.Errorf("start_at must not be 0")
	}
	if window.EndAt == 0 {
		return fmt.Errorf("end_at must not be 0")
	}
	if window.StartAt >= window.EndAt {
		return fmt.Errorf("start_at must be before end_at")
	}

	return nil
}
