package config

import (
	"context"
	"fmt"

	"github.com/rclone/rclone/fs"
	"github.com/rclone/rclone/fs/config/configmap"
)

// Authorize is for remote authorization of headless machines.
//
// It expects 1, 2 or 3 arguments
//
//	rclone authorize "fs name"
//	rclone authorize "fs name" "base64 encoded JSON blob"
//	rclone authorize "fs name" "client id" "client secret"
func Authorize(ctx context.Context, args []string, noAutoBrowser bool, templateFile string) error {
	ctx = suppressConfirm(ctx)
	ctx = fs.ConfigOAuthOnly(ctx)
	switch len(args) {
	case 1, 2, 3:
	default:
		return fmt.Errorf("invalid number of arguments: %d", len(args))
	}
	Type := args[0] // FIXME could read this from input
	ri, err := fs.Find(Type)
	if err != nil {
		return err
	}
	if ri.Config == nil {
		return fmt.Errorf("can't authorize fs %q", Type)
	}

	// Config map for remote
	inM := configmap.Simple{}

	// Indicate that we are running rclone authorize
	inM[ConfigAuthorize] = "true"
	if noAutoBrowser {
		inM[ConfigAuthNoBrowser] = "true"
	}

	// Indicate if we specified a custom template via a file
	if templateFile != "" {
		inM[ConfigTemplateFile] = templateFile
	}

	// Add extra parameters if supplied
	if len(args) == 2 {
		err := inM.Decode(args[1])
		if err != nil {
			return err
		}
	} else if len(args) == 3 {
		inM[ConfigClientID] = args[1]
		inM[ConfigClientSecret] = args[2]
	}

	// Name used for temporary remote
	name := "**temp-fs**"

	m := fs.ConfigMap(ri.Prefix, ri.Options, name, inM)
	outM := configmap.Simple{}
	m.ClearSetters()
	m.AddSetter(outM)
	m.AddGetter(outM, configmap.PriorityNormal)

	err = PostConfig(ctx, name, m, ri)
	if err != nil {
		return err
	}

	// Print the code for the user to paste
	out := outM["token"]

	// If received a config blob, then return one
	if len(args) == 2 {
		out, err = outM.Encode()
		if err != nil {
			return err
		}
	}
	fmt.Printf("Paste the following into your remote machine --->\n%s\n<---End paste\n", out)

	return nil
}