package upstream

import (
	"context"
	"fmt"

	"github.com/docker/docker/api/types"
	"github.com/docker/docker/client"
	"github.com/sirupsen/logrus"
)

// RunServiceScale scales a service (useful for restart action)
func RunServiceScale(ctx context.Context, cl *client.Client, serviceID string, scale uint64) error {
	service, _, err := cl.ServiceInspectWithRaw(ctx, serviceID, types.ServiceInspectOptions{})
	if err != nil {
		return err
	}

	serviceMode := &service.Spec.Mode
	if serviceMode.Replicated != nil {
		serviceMode.Replicated.Replicas = &scale
	} else if serviceMode.ReplicatedJob != nil {
		serviceMode.ReplicatedJob.TotalCompletions = &scale
	} else {
		return fmt.Errorf("scale can only be used with replicated or replicated-job mode")
	}

	response, err := cl.ServiceUpdate(
		ctx,
		service.ID,
		service.Version,
		service.Spec,
		types.ServiceUpdateOptions{},
	)
	if err != nil {
		return err
	}

	for _, warning := range response.Warnings {
		logrus.Warn(warning)
	}

	return nil
}