package main

//go:generate mockgen -source=pr_processor.go -destination=mock/pr_processor.go -typed

import (
	"fmt"

	"src.opensuse.org/autogits/common"
)

type PullRequestProcessor interface {
	Process(req *common.PullRequestWebhookEvent, git common.Git, config *common.AutogitConfig) error
}

type RequestProcessor struct {
	Opened, Synced, Closed, Review PullRequestProcessor

	configuredRepos map[string][]*common.AutogitConfig
	git             common.GitHandlerGenerator
}

func (w *RequestProcessor) ProcessFunc(request *common.Request) error {
	req, ok := request.Data.(*common.PullRequestWebhookEvent)
	if !ok {
		return fmt.Errorf("*** Invalid data format for PR processing.")
	}

	configs := w.configuredRepos[req.Repository.Owner.Username]
	if len(configs) < 1 {
		// ignoring pull request against unconfigured project (could be just regular sources?)
		return nil
	}

	var config *common.AutogitConfig
	for _, c := range configs {
		if c.GitProjectName == req.Pull_Request.Base.Repo.Name ||
			c.Branch == req.Pull_Request.Base.Ref {

			config = c
			break
		}
	}
	if config == nil {
		return fmt.Errorf("Cannot find config for branch '%s'", req.Pull_Request.Base.Ref)
	}

	git, err := w.git.CreateGitHandler(GitAuthor, GitEmail, AppName)
	if err != nil {
		return fmt.Errorf("Error allocating GitHandler. Err: %w", err)
	}

	switch req.Action {
	case "opened", "reopened":
		return w.Opened.Process(req, git, config)
	case "synchronized":
		return w.Synced.Process(req, git, config)
	case "edited":
		// not need to be handled??
		return nil
	case "closed":
		return w.Closed.Process(req, git, config)
	case "reviewed":
		return w.Review.Process(req, git, config)
	}

	return fmt.Errorf("Unhandled pull request action: %s", req.Action)
}
