package bot

import (
	"errors"
	"fmt"
	"strings"

	"git.front.kjuulh.io/kjuulh/contractor/internal/models"
	"git.front.kjuulh.io/kjuulh/contractor/internal/providers"
)

type BotHandler struct {
	giteaClient  *providers.GiteaClient
	githubClient *providers.GitHubClient
}

func NewBotHandler(gitea *providers.GiteaClient, github *providers.GitHubClient) *BotHandler {
	return &BotHandler{giteaClient: gitea, githubClient: github}
}

func (b *BotHandler) Handle(input string) (output string, err error) {
	innerHandle := func(input string) (output string, err error) {
		if strings.HasPrefix(input, "help") {
			return b.Help(), nil
		}

		if strings.HasPrefix(input, "refresh") {
			return `
<h3>Contractor triggered renovate refresh on this repository</h3>
This comment will be updated with status

<!-- Status update start -->
<!-- Status update end -->
`, nil
		}

		return b.Help(), errors.New("could not recognize command")
	}

	output, err = innerHandle(input)
	output = fmt.Sprintf(
		"%s\n<small>This comment was generated by <a href='https://git.front.kjuulh.io/kjuulh/contractor'>Contractor</a></small>",
		output,
	)
	return output, err
}

func (b *BotHandler) Help() string {
	return `<details open>
	<summary><h3>/contractor [command]</h3></summary>

<strong>Commands:</strong>

* /contractor help
  *  triggers the help menu
* /contractor refresh
  *  triggers renovate to refresh the current pull request
</details>`
}

func (b *BotHandler) AppendComment(
	owner string,
	repository string,
	pullRequest int,
	comment string,
	backend models.SupportedBackend,
) (*models.AddCommentResponse, error) {
	switch backend {
	case models.SupportedBackendGitHub:
		return b.githubClient.AddComment(owner, repository, pullRequest, comment)
	case models.SupportedBackendGitea:
		return b.giteaClient.AddComment(owner, repository, pullRequest, comment)
	default:
		panic("backend chosen was not a valid option")
	}
}