package repository

import (
	"context"
	"time"

	"go.buf.build/protocolbuffers/go/linuxgit/tidbcloud/base"

	tidbmgmtservicev1 "github.com/tidbcloud/tidb-management-service/api/spec/tidb_mgmt_service/v1"
	"github.com/tidbcloud/tidb-management-service/tidb-mgmt-service/domain/entity"
	"github.com/tidbcloud/tidb-management-service/utilities/bizerr"
)

type MaintenanceWindowRepo interface {
	Save(ctx context.Context, maintenanceWindow *entity.MaintenanceWindow) bizerr.BizError
	LoadByProjectID(ctx context.Context, projectID uint64) (*entity.MaintenanceWindow, bizerr.BizError)
}

type MaintenanceTaskRepo interface {
	Save(ctx context.Context, maintenanceTask *entity.MaintenanceTask) bizerr.BizError
	// Query returns a list of maintenance tasks that meet the filter criteria and total count regardless of pagination.
	Query(
		ctx context.Context,
		filter *tidbmgmtservicev1.MaintenanceTaskFilter,
		applyTimeRangeStartInclusive, applyTimeRangeEndExclusive, applyTimeEqual *time.Time,
		excludeNotificationPhases []entity.NotificationScene,
		pager *base.Pager,
		sorters []*base.Sorter,
	) ([]*entity.MaintenanceTask, int64, bizerr.BizError)
	Load(ctx context.Context, id uint64) (*entity.MaintenanceTask, bizerr.BizError)
}

type MaintenanceTaskExecutionRepo interface {
	Load(ctx context.Context, id uint64) (*entity.MaintenanceTaskExecution, bizerr.BizError)
	Query(
		ctx context.Context,
		filter *tidbmgmtservicev1.QueryMaintenanceTaskExecutionsRequest_Filter,
		cancellationReasons []tidbmgmtservicev1.MaintenanceTaskExecution_CancellationReason,
	) ([]*entity.MaintenanceTaskExecution, bizerr.BizError)
	Save(ctx context.Context, maintenanceTaskExecution *entity.MaintenanceTaskExecution) bizerr.BizError
}
