package events

import (
	"strconv"

	"github.com/runatlantis/atlantis/server/events/models"
	"github.com/runatlantis/atlantis/server/logging"
	"github.com/runatlantis/atlantis/server/metrics"
	"github.com/uber-go/tally"
)

type InstrumentedPullClosedExecutor struct {
	scope   tally.Scope
	log     logging.SimpleLogging
	cleaner PullCleaner
}

func NewInstrumentedPullClosedExecutor(
	scope tally.Scope, log logging.SimpleLogging, cleaner PullCleaner,
) PullCleaner {

	return &InstrumentedPullClosedExecutor{
		scope:   scope.SubScope("pullclosed.cleanup"),
		log:     log,
		cleaner: cleaner,
	}
}

func (e *InstrumentedPullClosedExecutor) CleanUpPull(repo models.Repo, pull models.PullRequest) error {
	log := e.log.With(
		"repository", repo.FullName,
		"pull-num", strconv.Itoa(pull.Num),
	)

	executionSuccess := e.scope.Counter(metrics.ExecutionSuccessMetric)
	executionError := e.scope.Counter(metrics.ExecutionErrorMetric)
	executionTime := e.scope.Timer(metrics.ExecutionTimeMetric).Start()
	defer executionTime.Stop()

	log.Info("Initiating cleanup of pull data.")

	err := e.cleaner.CleanUpPull(repo, pull)

	if err != nil {
		executionError.Inc(1)
		log.Err("error during cleanup of pull data", err)
		return err
	}

	executionSuccess.Inc(1)

	return nil
}
