package router

import (
	"bookhoard/internal/handlers"
)

func registerSyncRoutes(cfg *Config) {
	e := cfg.Echo

	// JWT middleware for protected routes
	jwtMiddleware := createJWTMiddleware(cfg)

	protected := e.Group("/api", jwtMiddleware)

	// Create handler for sync-specific routes
	h := handlers.NewHandler(cfg.Queries, cfg.ConnManager, cfg.QueueProcessor, cfg.Cfg)

	// Book matching and unlinked book resolution routes
	sync := protected.Group("/sync")
	sync.POST("/bulk-link-books", h.BulkLinkBooks)
	sync.POST("/auto-link-books", h.AutoLinkBooks)
	sync.GET("/unlinked-books/:id/suggestions", h.GetUnlinkedBookSuggestions)

	// KOReader sync routes (device authentication required)
	koreaderSync := e.Group("/api/sync/koreader")
	koreaderSync.POST("/progress", cfg.DeviceAuthMiddleware.Authenticate(cfg.KOReaderHandler.SyncProgress))
	koreaderSync.GET("/metadata/:uuid", cfg.DeviceAuthMiddleware.Authenticate(cfg.KOReaderHandler.GetMetadata))
	koreaderSync.GET("/library", cfg.DeviceAuthMiddleware.Authenticate(cfg.KOReaderHandler.GetLibrary))
	koreaderSync.POST("/bookmarks", cfg.DeviceAuthMiddleware.Authenticate(cfg.KOReaderHandler.SyncBookmarks))

	// Kobo sync routes (device authentication required)
	// Kobo devices use URL path: /api/sync/kobo/{token}/markup
	// API clients can use Authorization header: Authorization: Bearer {token}
	koboHandler := handlers.NewKoboHandler(cfg.Queries, cfg.ConnManager)
	koboHandler.SetProgressService(cfg.ProgressService)
	koboHandler.SetAnnotationService(cfg.AnnotationService)
	koboHandler.SetLibraryService(cfg.LibraryService)
	koboSync := e.Group("/api/sync/kobo/:token")
	koboSync.POST("/markup", cfg.DeviceAuthMiddleware.Authenticate(koboHandler.Markup))
	koboSync.POST("/bookmark", cfg.DeviceAuthMiddleware.Authenticate(koboHandler.Bookmark))
	koboSync.POST("/v1/analytics/gettests", cfg.DeviceAuthMiddleware.Authenticate(koboHandler.AnalyticsGettests))
	koboSync.GET("/v1/initialization", cfg.DeviceAuthMiddleware.Authenticate(koboHandler.Initialization))
	koboSync.POST("/sync-from-server", cfg.DeviceAuthMiddleware.Authenticate(koboHandler.SyncFromServer))
}

func registerWebSocketRoutes(cfg *Config) {
	e := cfg.Echo

	wsGroup := e.Group("/ws/sync")
	wsGroup.GET("", cfg.WSHandler.HandleWebSocket)
}
