// Copyright 2024 The Gitea Authors. All rights reserved.
// SPDX-License-Identifier: MIT

package secrets

import (
	stdctx "context"
	"fmt"

	gitea "gitea.dev/sdk"

	"gitea.dev/tea/cmd/flags"
	"gitea.dev/tea/modules/context"
	"gitea.dev/tea/modules/utils"
	"github.com/urfave/cli/v3"
)

// CmdSecretsCreate represents a sub command to create action secrets
var CmdSecretsCreate = cli.Command{
	Name:        "create",
	Aliases:     []string{"add", "set"},
	Usage:       "Create an action secret",
	Description: "Create a secret for use in repository actions and workflows",
	ArgsUsage:   "<secret-name> [secret-value]",
	Action:      runSecretsCreate,
	Flags: append([]cli.Flag{
		&cli.StringFlag{
			Name:  "file",
			Usage: "read secret value from file",
		},
		&cli.BoolFlag{
			Name:  "stdin",
			Usage: "read secret value from stdin",
		},
	}, flags.AllDefaultFlags...),
}

func runSecretsCreate(ctx stdctx.Context, cmd *cli.Command) error {
	if cmd.Args().Len() == 0 {
		return fmt.Errorf("secret name is required")
	}

	c, err := context.InitCommand(cmd)
	if err != nil {
		return err
	}
	if err := c.Ensure(context.CtxRequirement{RemoteRepo: true}); err != nil {
		return err
	}
	client := c.Login.Client()

	secretName := cmd.Args().First()

	// Read secret value using the utility
	secretValue, err := utils.ReadValue(cmd, utils.ReadValueOptions{
		ResourceName: "secret",
		PromptMsg:    fmt.Sprintf("Enter secret value for '%s'", secretName),
		Hidden:       true,
		AllowEmpty:   false,
	})
	if err != nil {
		return err
	}

	_, err = client.Actions.CreateRepoSecret(ctx, c.Owner, c.Repo, secretName, gitea.CreateOrUpdateSecretOption{
		Data: secretValue,
	})
	if err != nil {
		return err
	}

	fmt.Printf("Secret '%s' created successfully\n", secretName)
	return nil
}
