package cmd

import (
	"fmt"
	"strings"

	"code.gitea.io/sdk/gitea"
	"github.com/spf13/cobra"

	"git.mfocko.xyz/mfocko/frag-review/core"
)

var (
	openMilestone string

	openCmd = &cobra.Command{
		Use:    "open",
		Short:  "Opens pull requests for review.",
		PreRun: InitializeConfig,
		Run: func(cmd *cobra.Command, args []string) {
			client, err := gitea.NewClient(config.Gitea.InstanceURL, gitea.SetToken(config.Gitea.Token))
			core.ExitOnError("Couldn't create gitea client", err)

			milestone, _, err := client.GetMilestoneByName(config.Gitea.Owner, config.Gitea.Repository, openMilestone)
			core.ExitOnError("Couldn't find the milestone", err)

			fmt.Printf("Milestone found %s (deadline %s)\n", milestone.Title, milestone.Deadline)

			branches, _, err := client.ListRepoBranches(config.Gitea.Owner, config.Gitea.Repository, gitea.ListRepoBranchesOptions{})
			core.ExitOnError("Couldn't list all the branches", err)

			ProcessBranches(client, milestone, branches)
		},
	}
)

func init() {
	openCmd.Flags().StringVarP(&openMilestone, "milestone", "m", "", "specifies milestone, i.e. the task")
}

func ProcessBranches(client *gitea.Client, milestone *gitea.Milestone, branches []*gitea.Branch) {
	for _, branch := range branches {
		if !strings.HasPrefix(branch.Name, milestone.Title) {
			continue
		}

		fmt.Printf("- Processing %s\n", branch.Name)
		pr, _, err := client.CreatePullRequest(config.Gitea.Owner, config.Gitea.Repository, gitea.CreatePullRequestOption{
			Head: branch.Name,
			Base: "main",
			Title: branch.Name,
			Milestone: milestone.ID,
		})
		core.ExitOnError("Couldn't create PR", err)

		fmt.Printf("Created PR #%s\n", pr.ID)
	}
}