package api

import (
	"context"
	"fmt"
	"time"

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

type CreateMaintenanceParam struct {
	ProjectID   uint64
	Description string
	Deadline    time.Time
	ClusterIDs  []uint64
}

func (l CreateMaintenanceParam) Normalize() (CreateMaintenanceParam, error) {
	if l.ProjectID == 0 {
		return l, fmt.Errorf("project id is required")
	}
	if l.Description == "" {
		return l, fmt.Errorf("description is required")
	}
	if l.Deadline.IsZero() {
		return l, fmt.Errorf("deadline is required")
	}
	if len(l.ClusterIDs) == 0 {
		return l, fmt.Errorf("cluster ids is required")
	}

	return l, nil
}

type GetMaintenanceParam struct {
	WithExecutions bool
}

func (l GetMaintenanceParam) Normalize() (GetMaintenanceParam, error) {
	return l, nil
}

type ListMaintenanceParam struct {
	GetMaintenanceParam

	ProjectIDs []uint64
	Statues    []maintent.ClusterMaintenanceTaskStatus

	Page    int64
	PerPage int64
}

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

	return l, nil
}

type ClusterMaintenanceServiceAPI interface {
	ListMaintenances(ctx context.Context, param ListMaintenanceParam) ([]*maintent.ClusterMaintenance, int64, error)
	GetMaintenance(ctx context.Context, id uint64, param GetMaintenanceParam) (*maintent.ClusterMaintenance, error)
	CreateMaintenance(ctx context.Context, param CreateMaintenanceParam) (*uint64, error)
	CloseMaintenance(ctx context.Context, id uint64) error

	StartMaintenanceExecution(ctx context.Context, id uint64, execID uint64) error
	FinishMaintenanceExecution(ctx context.Context, id uint64, execID uint64) error
	CancelMaintenanceExecution(ctx context.Context, id uint64, execID uint64) error
}
