// Copyright 2023 Harness, Inc.
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
//     http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.

package services

import (
	"github.com/harness/gitness/app/services/cleanup"
	"github.com/harness/gitness/app/services/keywordsearch"
	"github.com/harness/gitness/app/services/metric"
	"github.com/harness/gitness/app/services/notification"
	"github.com/harness/gitness/app/services/pullreq"
	"github.com/harness/gitness/app/services/repo"
	"github.com/harness/gitness/app/services/trigger"
	"github.com/harness/gitness/app/services/webhook"
	"github.com/harness/gitness/job"

	"github.com/google/wire"
)

var WireSet = wire.NewSet(
	ProvideServices,
)

type Services struct {
	Webhook            *webhook.Service
	PullReq            *pullreq.Service
	Trigger            *trigger.Service
	JobScheduler       *job.Scheduler
	MetricCollector    *metric.Collector
	RepoSizeCalculator *repo.SizeCalculator
	Repo               *repo.Service
	Cleanup            *cleanup.Service
	Notification       *notification.Service
	Keywordsearch      *keywordsearch.Service
}

func ProvideServices(
	webhooksSvc *webhook.Service,
	pullReqSvc *pullreq.Service,
	triggerSvc *trigger.Service,
	jobScheduler *job.Scheduler,
	metricCollector *metric.Collector,
	repoSizeCalculator *repo.SizeCalculator,
	repo *repo.Service,
	cleanupSvc *cleanup.Service,
	notificationSvc *notification.Service,
	keywordsearchSvc *keywordsearch.Service,
) Services {
	return Services{
		Webhook:            webhooksSvc,
		PullReq:            pullReqSvc,
		Trigger:            triggerSvc,
		JobScheduler:       jobScheduler,
		MetricCollector:    metricCollector,
		RepoSizeCalculator: repoSizeCalculator,
		Repo:               repo,
		Cleanup:            cleanupSvc,
		Notification:       notificationSvc,
		Keywordsearch:      keywordsearchSvc,
	}
}
