package entities

import (
	"net/url"

	"github.com/containers/common/pkg/ssh"
)

// ScpTransferImageOptions provide options for securely copying images to and from a remote host
type ScpTransferImageOptions struct {
	// Remote determines if this entity is operating on a remote machine
	Remote bool `json:"remote,omitempty"`
	// File is the input/output file for the save and load Operation
	File string `json:"file,omitempty"`
	// Quiet Determines if the save and load operation will be done quietly
	Quiet bool `json:"quiet,omitempty"`
	// Image is the image the user is providing to save and load
	Image string `json:"image,omitempty"`
	// User is used in conjunction with Transfer to determine if a valid user was given to save from/load into
	User string `json:"user,omitempty"`
	// Tag is the name to be used for the image on the destination
	Tag string `json:"tag,omitempty"`
}

type ScpLoadReport = ImageLoadReport

type ScpExecuteTransferOptions struct {
	// ParentFlags are the arguments to apply to the parent podman command when called via ssh
	ParentFlags []string
	// Quiet Determines if the save and load operation will be done quietly
	Quiet bool
	// SSHMode is the specified ssh.EngineMode which should be used
	SSHMode ssh.EngineMode
}

type ScpExecuteTransferReport struct {
	// LoadReport provides results from calling podman load
	LoadReport *ScpLoadReport
	// Source contains data relating to the source of the image to transfer
	Source *ScpTransferImageOptions
	// Dest contains data relating to the destination of the image to transfer
	Dest *ScpTransferImageOptions
	// ParentFlags are the arguments to apply to the parent podman command when called via ssh
	ParentFlags []string
}

type ScpTransferOptions struct {
	// ParentFlags are the arguments to apply to the parent podman command when called.
	ParentFlags []string
}

type ScpTransferReport struct{}

type ScpLoadToRemoteOptions struct {
	// Dest contains data relating to the destination of the image to transfer
	Dest ScpTransferImageOptions
	// LocalFile is a path to a local file containing saved image data to transfer
	LocalFile string
	// Tag is the name of the tag to be given to the loaded image (unused)
	Tag string
	// URL points to the remote location for loading to
	URL *url.URL
	// Iden is a path to an optional identity file with ssh key
	Iden string
	// SSHMode is the specified ssh.EngineMode which should be used
	SSHMode ssh.EngineMode
}

type ScpLoadToRemoteReport struct {
	// Response contains any additional information from the executed load command
	Response string
	// ID is the identifier of the loaded image
	ID string
}

type ScpSaveToRemoteOptions struct {
	Image string
	// LocalFile is a path to a local file to copy the saved image to
	LocalFile string
	// Tag is the name of the tag to be given to the saved image (unused)
	Tag string
	// URL points to the remote location for saving from
	URL *url.URL
	// Iden is a path to an optional identity file with ssh key
	Iden string
	// SSHMode is the specified ssh.EngineMode which should be used
	SSHMode ssh.EngineMode
}

type ScpSaveToRemoteReport struct{}

type ScpCreateCommandsOptions struct {
	// ParentFlags are the arguments to apply to the parent podman command when called via ssh
	ParentFlags []string
	// Podman is the path to the local podman executable
	Podman string
}
