package main

import (
	"context"
	"flag"
	"fmt"
	"os"
	"os/user"
	"path/filepath"

	"github.com/osbuild/images/pkg/container"
)

func main() {
	var filename string
	var destination string
	var username string
	var password string
	var tag string
	var ignoreTLS bool

	flag.StringVar(&filename, "container", "", "path to the oci-archive to upload (required)")
	flag.StringVar(&destination, "destination", "", "destination to upload to (required)")
	flag.StringVar(&tag, "tag", "", "destination tag to use for the container")
	flag.StringVar(&username, "username", "", "username to use for registry")
	flag.StringVar(&password, "password", "", "password to use for registry")
	flag.BoolVar(&ignoreTLS, "ignore-tls", false, "ignore tls verification for destination")
	flag.Parse()

	if filename == "" || destination == "" {
		flag.Usage()
		os.Exit(1)
	}

	absPath, err := filepath.Abs(filename)
	if err != nil {
		fmt.Fprintln(os.Stderr, err.Error())
		return
	}

	fmt.Println("Container to upload is:", filename)

	client, err := container.NewClient(destination)

	if err != nil {
		fmt.Fprintf(os.Stderr, "error creating the upload client: %v\n", err)
		os.Exit(1)
	}

	if password != "" {
		if username == "" {
			u, err := user.Current()
			if err != nil {
				fmt.Fprintf(os.Stderr, "error looking up current user: %v\n", err)
				os.Exit(1)
			}
			username = u.Username
		}
		client.SetCredentials(username, password)
	}

	if ignoreTLS {
		client.SkipTLSVerify()
	}

	ctx := context.Background()

	from := fmt.Sprintf("oci-archive://%s", absPath)

	digest, err := client.UploadImage(ctx, from, tag)

	if err != nil {
		fmt.Fprintf(os.Stderr, "error uploading: %v\n", err)
		os.Exit(1)
	}

	fmt.Printf("upload done; destination manifest: %s\n", digest.String())
}
