// SPDX-License-Identifier: MIT

package cmd

import (
	"context"
	"errors"
	"fmt"
	"log"

	actions_model "code.gitea.io/gitea/models/actions"
	"code.gitea.io/gitea/modules/setting"
	"code.gitea.io/gitea/modules/util"

	"github.com/urfave/cli"
)

// CmdActions represents the available actions sub-command.
var CmdActions = cli.Command{
	Name:        "actions",
	Usage:       "Actions",
	Description: "Actions",
	Action:      runActions,
	Flags: []cli.Flag{
		cli.BoolFlag{
			Name:  "registration-token-admin",
			Usage: "Show the runner registration admin token",
		},
	},
}

func maybeInitDB(stdCtx context.Context) error {
	if setting.Database.Type == "" {
		if err := initDB(stdCtx); err != nil {
			return err
		}
	}
	return nil
}

func runActions(ctx *cli.Context) error {
	stdCtx := context.Background()

	if err := maybeInitDB(stdCtx); err != nil {
		log.Fatalf("maybeInitDB %v", err)
	}

	if ctx.Bool("registration-token-admin") {
		// ownid=0,repo_id=0,means this token is used for global
		return runActionsRegistrationToken(stdCtx, 0, 0)
	}
	return nil
}

func runActionsRegistrationToken(stdCtx context.Context, ownerID, repoID int64) error {
	var token *actions_model.ActionRunnerToken
	token, err := actions_model.GetUnactivatedRunnerToken(stdCtx, ownerID, repoID)
	if errors.Is(err, util.ErrNotExist) {
		token, err = actions_model.NewRunnerToken(stdCtx, ownerID, repoID)
		if err != nil {
			log.Fatalf("CreateRunnerToken %v", err)
		}
	} else if err != nil {
		log.Fatalf("GetUnactivatedRunnerToken %v", err)
	}
	fmt.Print(token.Token)
	return nil
}