package api

import (
	"context"
	"time"

	maintent "github.com/tidbcloud/devops/entity/maintenance"
)

type ListClusterOpsMaintenanceWindowParam struct {
	ClusterIDs []string

	Page    int64
	PerPage int64
}

func (l ListClusterOpsMaintenanceWindowParam) Normalize() (ListClusterOpsMaintenanceWindowParam, error) {
	if l.Page <= 0 {
		l.Page = 1
	}
	if l.PerPage <= 0 {
		l.PerPage = 100
	}
	if l.PerPage > 100 {
		l.PerPage = 100
	}

	return l, nil
}

type CreateClusterOpsMaintenanceWindowParam struct {
	ClusterID string
	Windows   []maintent.ClusterOpsMaintenanceWindowSlot
	Approvers []string
}

type UpdateClusterOpsMaintenanceWindowParam struct {
	Windows   []maintent.ClusterOpsMaintenanceWindowSlot
	Approvers []string
}

type ClusterOpsMaintenanceServiceAPI interface {
	ListClusterOpsMaintenanceWindows(
		ctx context.Context,
		param ListClusterOpsMaintenanceWindowParam,
	) ([]*maintent.ClusterOpsMaintenanceWindow, int64, error)
	GetClusterOpsMaintenanceWindow(ctx context.Context, clusterID string) (*maintent.ClusterOpsMaintenanceWindow, error)
	CreateClusterOpsMaintenanceWindow(
		ctx context.Context,
		param CreateClusterOpsMaintenanceWindowParam,
	) (*maintent.ClusterOpsMaintenanceWindow, error)
	UpdateClusterOpsMaintenanceWindow(
		ctx context.Context,
		clusterID string,
		param UpdateClusterOpsMaintenanceWindowParam,
	) (*maintent.ClusterOpsMaintenanceWindow, error)
	DeleteClusterOpsMaintenanceWindow(ctx context.Context, clusterID string) error
	// IsInClusterOpsMaintenanceWindow checks if executeTimes are in ops maintenance window, and returns the approvers if it is in maintenance window.
	IsInClusterOpsMaintenanceWindow(ctx context.Context, clusterID string, executeTimes []time.Time) (bool, *maintent.ClusterOpsMaintenanceWindow, error)
}
