// Package public contains browser bootstrap and public-site API routes.
package public

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

	"github.com/tidbcloud/AgentTeam/internal/api"
	"github.com/tidbcloud/AgentTeam/internal/coredb"
)

// AuthStore is the shared browser-app auth middleware port.
type AuthStore interface {
	api.SessionAuthenticator
}

// Dependencies contains collaborators and config for public app routes.
type Dependencies struct {
	AuthStore          AuthStore
	MessageSearchStore MessageSearchSupportStore
	ContentReports     ContentReportStore
	MigrationInspector MigrationStateInspector
	CoreDB             coredb.AdminDB

	Environment                  string
	PingCAPAuthEnabled           bool
	PasswordAuthDisabled         bool
	OpenRegistration             bool
	RegistrationMode             string
	TeamsEnabled                 bool
	AgentToolsSettingsEnabled    bool
	OrganizationDirectoryEnabled bool
	OrganizationBYOKEnabled      bool
	BillingEnabled               bool
	DaemonConnectBaseURL         string
	MeshXEnabled                 bool
	MeshXKnowledgeBasesEnabled   bool
	MeshXWorkflowsEnabled        bool
	MeshXMiniappPairingEnabled   bool
	MeshXRolesEnabled            bool
	MeshXBaseURL                 string
}

// RegisterRoutes mounts public browser-facing routes.
func RegisterRoutes(router gin.IRouter, dependencies Dependencies) {
	if router == nil {
		return
	}
	apiGroup := router.Group("/api/v1")
	handler := &PublicConfigHandler{
		store:                        dependencies.MessageSearchStore,
		migrationInspector:           dependencies.MigrationInspector,
		coreDB:                       dependencies.CoreDB,
		environment:                  dependencies.Environment,
		pingCAPAuthEnabled:           dependencies.PingCAPAuthEnabled,
		passwordAuthDisabled:         dependencies.PasswordAuthDisabled,
		openRegistration:             dependencies.OpenRegistration,
		registrationMode:             dependencies.RegistrationMode,
		teamsEnabled:                 dependencies.TeamsEnabled,
		agentToolsSettingsEnabled:    dependencies.AgentToolsSettingsEnabled,
		organizationDirectoryEnabled: dependencies.OrganizationDirectoryEnabled,
		organizationBYOKEnabled:      dependencies.OrganizationBYOKEnabled,
		billingEnabled:               dependencies.BillingEnabled,
		daemonConnectBaseURL:         dependencies.DaemonConnectBaseURL,
		meshXEnabled:                 dependencies.MeshXEnabled,
		meshXKnowledgeBasesEnabled:   dependencies.MeshXKnowledgeBasesEnabled,
		meshXWorkflowsEnabled:        dependencies.MeshXWorkflowsEnabled,
		meshXMiniappPairingEnabled:   dependencies.MeshXMiniappPairingEnabled,
		meshXRolesEnabled:            dependencies.MeshXRolesEnabled,
		meshXBaseURL:                 dependencies.MeshXBaseURL,
	}
	contentReports := &ContentReportHandler{store: dependencies.ContentReports}
	apiGroup.GET("/public/config", handler.Get)
	apiGroup.POST(
		"/public/content-reports",
		api.RequireAuthenticatedUser(dependencies.AuthStore),
		contentReports.Create,
	)
}
