package containers

import (
	"context"
	"net/http"

	"github.com/containers/podman/v4/pkg/bindings"
)

// Mount mounts an existing container to the filesystem. It returns the path
// of the mounted container in string format.
func Mount(ctx context.Context, nameOrID string, options *MountOptions) (string, error) {
	if options == nil {
		options = new(MountOptions)
	}
	_ = options
	conn, err := bindings.GetClient(ctx)
	if err != nil {
		return "", err
	}
	var (
		path string
	)
	response, err := conn.DoRequest(ctx, nil, http.MethodPost, "/containers/%s/mount", nil, nil, nameOrID)
	if err != nil {
		return path, err
	}
	defer response.Body.Close()

	return path, response.Process(&path)
}

// Unmount unmounts a container from the filesystem.  The container must not be running
// or the unmount will fail.
func Unmount(ctx context.Context, nameOrID string, options *UnmountOptions) error {
	if options == nil {
		options = new(UnmountOptions)
	}
	_ = options
	conn, err := bindings.GetClient(ctx)
	if err != nil {
		return err
	}
	response, err := conn.DoRequest(ctx, nil, http.MethodPost, "/containers/%s/unmount", nil, nil, nameOrID)
	if err != nil {
		return err
	}
	defer response.Body.Close()

	return response.Process(nil)
}

// GetMountedContainerPaths returns a map of mounted containers and their mount locations.
func GetMountedContainerPaths(ctx context.Context, options *MountedContainerPathsOptions) (map[string]string, error) {
	if options == nil {
		options = new(MountedContainerPathsOptions)
	}
	_ = options
	conn, err := bindings.GetClient(ctx)
	if err != nil {
		return nil, err
	}
	mounts := make(map[string]string)
	response, err := conn.DoRequest(ctx, nil, http.MethodGet, "/containers/showmounted", nil, nil)
	if err != nil {
		return mounts, err
	}
	defer response.Body.Close()

	return mounts, response.Process(&mounts)
}
