//go:build !no_extra_providers

package cli

import (
	"context"
	"os"

	"github.com/alecthomas/kingpin/v2"

	"github.com/kopia/kopia/repo/blob"
	"github.com/kopia/kopia/repo/blob/webdav"
)

type storageWebDAVFlags struct {
	options     webdav.Options
	connectFlat bool
}

func (c *storageWebDAVFlags) Setup(svc StorageProviderServices, cmd *kingpin.CmdClause) {
	cmd.Flag("url", "URL of WebDAV server").Required().StringVar(&c.options.URL)
	cmd.Flag("flat", "Use flat directory structure").BoolVar(&c.connectFlat)
	cmd.Flag("webdav-username", "WebDAV username").Envar(svc.EnvName("KOPIA_WEBDAV_USERNAME")).StringVar(&c.options.Username)
	cmd.Flag("webdav-password", "WebDAV password").Envar(svc.EnvName("KOPIA_WEBDAV_PASSWORD")).StringVar(&c.options.Password)
	cmd.Flag("list-parallelism", "Set list parallelism").Hidden().IntVar(&c.options.ListParallelism)
	cmd.Flag("atomic-writes", "Assume WebDAV provider implements atomic writes").BoolVar(&c.options.AtomicWrites)

	commonThrottlingFlags(cmd, &c.options.Limits)
}

func (c *storageWebDAVFlags) Connect(ctx context.Context, isCreate bool, formatVersion int) (blob.Storage, error) {
	wo := c.options

	if wo.Username != "" && wo.Password == "" {
		pass, err := askPass(os.Stdout, "Enter WebDAV password: ")
		if err != nil {
			return nil, err
		}

		wo.Password = pass
	}

	wo.DirectoryShards = initialDirectoryShards(c.connectFlat, formatVersion)

	//nolint:wrapcheck
	return webdav.New(ctx, &wo, isCreate)
}

func init() {
	mustRegisterStorageProvider(
		"webdav",
		"a WebDAV storage",
		func() StorageFlags { return &storageWebDAVFlags{} },
	)
}
