package actions

import (
	"context"
	_ "embed"
	"fmt"
	"path/filepath"
	"time"

	"cos.googlesource.com/cos/tools.git/src/pkg/utils"
	"cos.googlesource.com/cos/tools.git/src/pkg/kernel"
	"github.com/spf13/cobra"
)

func deployKernelToGcpInstance(ctx context.Context, path string, gcloudArgs []string) error {
	opts := utils.RetryOptions {
		Attempts: 5,
		Delay: 10 * time.Second,
		ShouldRetry: ShouldRetryGcloudComputeSsh,
	}

	copyCtx, cancel := context.WithTimeout(ctx, 2 * time.Minute)
	defer cancel()

	_, tarballName := filepath.Split(path)
	remotePath := filepath.Join("/tmp", tarballName)
	fmt.Printf("Copying kernel tarball %s to remote path %s on instance\n", path, remotePath)
	err := utils.Retry(copyCtx, func(ctx context.Context) error {
		return kernel.CopyFileToGcpInstance(ctx, path, remotePath, gcloudArgs)
	}, opts)
	if err != nil {
		return fmt.Errorf("failed to copy kernel tarball %s to GCP instance: %v", path, err)
	}

	deployCtx, cancel := context.WithTimeout(ctx, 2 * time.Minute)
	defer cancel()

	fmt.Printf("Deploying kernel tarball from remote path %s on instance\n", remotePath)
	return utils.Retry(deployCtx, func(ctx context.Context) error {
		return kernel.DeployKernelToGcpInstance(ctx, remotePath, gcloudArgs)
	}, opts)
}

var deployCmd = &cobra.Command{
	Use:   "deploy",
	Short: "Deploys a kernel to a local instance or a remote GCP instance",
	Long: `Deploys a kernel from a tarball to a local instance or a remote GCP instance.
	The instance may reboot up to twice in the process; once when it is unlocked, and once
	when the new kernel is deployed. If the instance is already unlocked, the first reboot
	is skipped.`,
	RunE: func(cmd *cobra.Command, args []string) error {
		if len(args) == 0 {
			return fmt.Errorf("must provide a path to a kernel tarball")
		} else if len(args) == 1 {
			fmt.Println("Unlocking instance")
			if err := kernel.UnlockLocalInstance(); err != nil {
				return err
			}

			fmt.Printf("Deploying kernel from path %s on instance\n", args[0])
			return kernel.DeployKernelToLocalInstance(args[0])
		} else {
			fmt.Println("Unlocking instance")
			if err := unlockGCPInstance(cmd.Context(), args[1:]); err != nil {
				return err
			}

			return deployKernelToGcpInstance(cmd.Context(), args[0], args[1:])
		}
	},
}

func init() {
	rootCmd.AddCommand(deployCmd)
}
