// This file is part of the happyDomain (R) project.
// Copyright (c) 2020-2024 happyDomain
// Authors: Pierre-Olivier Mercier, et al.
//
// This program is offered under a commercial and under the AGPL license.
// For commercial licensing, contact us at <contact@happydomain.org>.
//
// For AGPL licensing:
// This program is free software: you can redistribute it and/or modify
// it under the terms of the GNU Affero General Public License as published by
// the Free Software Foundation, either version 3 of the License, or
// (at your option) any later version.
//
// This program is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
// GNU Affero General Public License for more details.
//
// You should have received a copy of the GNU Affero General Public License
// along with this program.  If not, see <https://www.gnu.org/licenses/>.

package route

import (
	"github.com/gin-gonic/gin"

	api "git.happydns.org/happyDomain/internal/api/route"
	checkerUC "git.happydns.org/happyDomain/internal/usecase/checker"
	happydns "git.happydns.org/happyDomain/model"
)

// Dependencies holds all use cases required to register the admin API routes.
type Dependencies struct {
	AdminAuthUser         happydns.AdminAuthUserUsecase
	AdminDomain           happydns.AdminDomainUsecase
	AdminProvider         happydns.AdminProviderUsecase
	AdminSession          happydns.AdminSessionUsecase
	AdminUser             happydns.AdminUserUsecase
	AuthUser              happydns.AuthUserUsecase
	Backup                happydns.BackupUsecase
	Domain                happydns.DomainUsecase
	Provider              happydns.ProviderUsecase
	RemoteZoneImporter    happydns.RemoteZoneImporterUsecase
	Service               happydns.ServiceUsecase
	User                  happydns.UserUsecase
	Zone                  happydns.ZoneUsecase
	ZoneCorrectionApplier happydns.ZoneCorrectionApplierUsecase
	ZoneImporter          happydns.ZoneImporterUsecase
	ZoneService           happydns.ZoneServiceUsecase
	CheckerOptionsUC      *checkerUC.CheckerOptionsUsecase
	CheckScheduler        *checkerUC.Scheduler
	TidyUp                happydns.TidyUpUseCase
}

func DeclareRoutes(cfg *happydns.Options, router *gin.Engine, dep Dependencies) {
	apiRoutes := router.Group("/api")

	declareBackupRoutes(apiRoutes, dep)
	declareCheckersRoutes(apiRoutes, dep)
	declareDomainRoutes(apiRoutes, dep)
	declareProviderRoutes(apiRoutes, dep)
	declareSchedulerRoutes(apiRoutes, dep)
	declareSessionsRoutes(cfg, apiRoutes, dep)
	declareUserAuthsRoutes(apiRoutes, dep)
	declareUsersRoutes(apiRoutes, dep)
	declareTidyRoutes(apiRoutes, dep)
	api.DeclareVersionRoutes(apiRoutes)
}
