# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
# Static resources
# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

GET     /assets/*file                                controllers.Assets.versioned(path="/public", file: Asset)
->      /webjars                                     webjars.Routes
GET     /favicon.ico                                 controllers.Assets.at(path="/public", file="/images/favicon.png")

# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
# Landing area
# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

GET     /signup                                      controllers.landing.SignupController.showSignupForm
POST    /signup                                      controllers.landing.SignupController.processSignup
GET     /login                                       controllers.landing.LoginLogoutController.showLoginForm(destination: Option[String] ?= None)
POST    /login                                       controllers.landing.LoginLogoutController.processLogin
GET     /login/confirm-announcment                   controllers.landing.LoginLogoutController.confirmServiceAnnouncement(id: java.util.UUID, response: String, destination: Option[String] ?= None)
GET     /logout                                      controllers.landing.LoginLogoutController.logout
GET     /reset_password                              controllers.landing.ResetPasswordController.showResetForm
POST    /reset_password                              controllers.landing.ResetPasswordController.resetPassword
GET     /status                                      controllers.landing.StatusController.index

# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
# Help area
# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

GET     /help/about                                  controllers.help.HelpController.about
GET     /help/faq                                    controllers.help.HelpController.faq
GET     /help/privacy                                controllers.help.HelpController.privacy
GET     /help/relations                              controllers.help.HelpController.relations
GET     /help/sharing-links                          controllers.help.HelpController.sharingLinks
GET     /help/terms                                  controllers.help.HelpController.terms
GET     /help/tutorial                               controllers.help.HelpController.tutorial
GET     /help/:lang/tutorial                         controllers.help.HelpController.localizedTutorial(lang: String)
GET     /help                                        controllers.help.HelpController.index

# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
# Administration area
# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

GET     /admin/gazetteers                            controllers.admin.gazetteers.GazetteerAdminController.index
POST    /admin/gazetteers                            controllers.admin.gazetteers.GazetteerAdminController.importGazetteer
DELETE  /admin/gazetteers/:name                      controllers.admin.gazetteers.GazetteerAdminController.deleteGazetteer(name: String)

GET     /admin/users.json                            controllers.admin.users.UserAdminController.listUsers(offset: Int ?= 0, size: Int ?= 100, sortBy: Option[String] ?= None, sortOrder: Option[String] ?= None)
GET     /admin/idle-users.json                       controllers.admin.users.UserAdminController.listIdleUsers(since: String, offset: Int ?= 0, size: Int ?= 100)
DELETE  /admin/user/:username                        controllers.admin.users.UserAdminController.deleteAccount(username: String)
GET     /admin/users                                 controllers.admin.users.UserAdminController.index

GET     /admin/backup                                controllers.admin.backup.BackupAdminController.index
POST    /admin/restore                               controllers.admin.backup.BackupAdminController.restore
GET     /admin/run-migration                         controllers.admin.backup.BackupAdminController.runMigration

GET     /admin/visits/export                         controllers.admin.backup.BackupAdminController.exportVisits
GET     /admin/visits/purge                          controllers.admin.backup.BackupAdminController.deleteVisitsOlderThan(date: Option[String])

GET     /admin/maintenance                           controllers.admin.maintenance.MaintenanceController.index
DELETE  /admin/maintenance/uploads                   controllers.admin.maintenance.MaintenanceController.deleteAllPending
DELETE  /admin/maintenance/uploads/:id               controllers.admin.maintenance.MaintenanceController.deletePending(id: Int)
GET     /admin/maintenance/broadcast                 controllers.admin.maintenance.MaintenanceController.insertBroadcast
GET     /admin/maintenance/broadcast/_deleteAll      controllers.admin.maintenance.MaintenanceController.deleteAllServiceAnnouncements


GET     /admin/stats.json                            controllers.admin.AdminController.getStats
GET     /admin                                       controllers.admin.AdminController.index

# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
# Document views
# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

GET     /document/:id/part/:seqNo/edit               controllers.document.annotation.AnnotationController.showAnnotationView(id: String, seqNo: Int)

GET     /document/:id/map                            controllers.document.map.MapController.showMap(id: String)

GET     /document/:id/stats                          controllers.document.stats.StatsController.showDocumentStats(id: String, tab: Option[String])
GET     /document/:id/stats/tags.json                controllers.document.stats.StatsController.getTagsAsJSON(id: String)
GET     /document/:id/stats/tags.csv                 controllers.document.stats.StatsController.getTagsAsCSV(id: String)

GET     /document/:id/downloads                      controllers.document.downloads.DownloadsController.showDownloadOptions(id: String)
GET     /document/:id/downloads/annotations/csv      controllers.document.downloads.DownloadsController.downloadCSV(id: String, export_tables: Boolean ?= false)
GET     /document/:id/downloads/annotations/ttl      controllers.document.downloads.DownloadsController.downloadTTL(id: String)
GET     /document/:id/downloads/annotations/rdf      controllers.document.downloads.DownloadsController.downloadRDFXML(id: String)
GET     /document/:id/downloads/annotations/jsonld   controllers.document.downloads.DownloadsController.downloadJSONLD(id: String)
GET     /document/:id/downloads/places/geojson       controllers.document.downloads.DownloadsController.downloadGeoJSON(id: String, as_gazetteer: Boolean ?= false)
POST    /document/:id/downloads/places/geojson       controllers.document.downloads.DownloadsController.downloadGeoJSON(id: String, as_gazetteer: Boolean ?= false)
GET     /document/:id/downloads/relations/node-csv   controllers.document.downloads.DownloadsController.downloadGephiNodes(id: String)
GET     /document/:id/downloads/relations/edge-csv   controllers.document.downloads.DownloadsController.downloadGephiEdges(id: String)
GET     /document/:id/downloads/merged/tei           controllers.document.downloads.DownloadsController.downloadTEI(id: String)

GET     /document/:id/discussion                     controllers.document.discussion.DiscussionController.showDiscussionBoard(id: String)

PUT     /document/:id/settings/sortorder             controllers.document.settings.SettingsController.setSortOrder(id: String)
GET     /document/:id/settings                       controllers.document.settings.SettingsController.showDocumentSettings(id: String, tab: Option[String])
POST    /document/:id/settings/metadata              controllers.document.settings.SettingsController.updateDocumentMetadata(id: String)
POST    /document/:id/settings/metadata/part/:ptId   controllers.document.settings.SettingsController.updateFilepartMetadata(id: String, ptId: java.util.UUID)
PUT     /document/:id/settings/visibility            controllers.document.settings.SettingsController.setPublicVisibility(id: String, visibility: String)
PUT     /document/:id/settings/accesslevel           controllers.document.settings.SettingsController.setPublicAccessLevel(id: String, accessLevel: String)
PUT     /document/:id/settings/collaborator          controllers.document.settings.SettingsController.addCollaborator(id: String)
DELETE  /document/:id/settings/collaborator/:user    controllers.document.settings.SettingsController.removeCollaborator(id: String, user: String)
GET     /document/:id/settings/collaborator/search   controllers.document.settings.SettingsController.searchUsers(id: String, q: String)
GET     /document/:id/settings/history.json          controllers.document.settings.SettingsController.getContributionHistory(id: String, offset: Int ?= 0, size: Int ?= 100)
POST    /document/:id/settings/rollback              controllers.document.settings.SettingsController.rollbackByTime(id: String, contributionId: String)
GET     /document/:id/settings/zip-export            controllers.document.settings.SettingsController.exportAsZip(id: String)
DELETE  /document/:id/settings/delete                controllers.document.settings.SettingsController.deleteDocument(id: String)
DELETE  /document/:id/settings/delete-annotations    controllers.document.settings.SettingsController.deleteAnnotations(id: String)

# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
# Document content
# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

GET     /document/:id/part/:partNo/manifest          controllers.document.DocumentController.getImageManifest(id: String, partNo: Int)
GET     /document/:id/part/:partNo/tiles/*path       controllers.document.DocumentController.getImageTile(id: String, partNo: Int, path: String)
GET     /document/:id/part/:partNo/thumb.jpg         controllers.document.DocumentController.getThumbnail(id: String, partNo: Int)
GET     /document/:id/part/:partNo/raw               controllers.document.DocumentController.getRaw(id: String, partNo: Int, lines: Option[Int] ?= None)

# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
# Document base path
# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

GET     /document/:id                                controllers.document.DocumentController.initialDocumentView(id: String)

# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
# Annotation view resolver service
# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

GET     /annotation/:id                              controllers.document.annotation.AnnotationController.resolveFromAnnotation(id: java.util.UUID)
GET     /part/:id                                    controllers.document.annotation.AnnotationController.resolveFromPart(id: java.util.UUID)

# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
# JSON API
# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

POST    /api/annotation                              controllers.api.AnnotationAPIController.createAnnotation
GET     /api/annotation/:id.jpg                      controllers.api.AnnotationAPIController.getImage(id: java.util.UUID)
GET     /api/annotation/:id                          controllers.api.AnnotationAPIController.getAnnotation(id: java.util.UUID, context: Boolean ?= false)
DELETE  /api/annotation/:id                          controllers.api.AnnotationAPIController.deleteAnnotation(id: java.util.UUID)

POST    /api/annotation/bulk                         controllers.api.AnnotationAPIController.bulkUpsert

GET     /api/document/:id/annotations                controllers.api.AnnotationAPIController.listAnnotationsInDocument(id: String)
GET     /api/document/:id/part/:part/annotations     controllers.api.AnnotationAPIController.listAnnotationsInPart(id: String, part: Int)

GET     /api/document/:id/places/search              controllers.api.PlaceAPIController.searchPlacesInDocument(q: String, id: String, offset: Int ?= 0, size: Int ?= 20)
GET     /api/document/:id/places                     controllers.api.PlaceAPIController.listPlacesInDocument(id: String, offset: Int ?= 0, size: Int ?= 0)

GET     /api/place/search                            controllers.api.PlaceAPIController.searchPlaces(q: String, offset: Int ?= 0, size: Int ?= 20, latlng: Option[String] ?= None)
GET     /api/place/:uri                              controllers.api.PlaceAPIController.findPlaceByURI(uri: String)

POST    /api/task                                    controllers.api.TaskAPIController.spawnTask
GET     /api/task                                    controllers.api.TaskAPIController.progressByDocument(id: String)

# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
# Personal space - settings
# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

GET     /settings/account                            controllers.my.settings.AccountSettingsController.index
POST    /settings/account                            controllers.my.settings.AccountSettingsController.updateAccountSettings
DELETE  /settings/account                            controllers.my.settings.AccountSettingsController.deleteAccount
GET     /settings/password                           controllers.my.settings.PasswordSettingsController.index
POST    /settings/password                           controllers.my.settings.PasswordSettingsController.updatePassword
GET     /settings/restore                            controllers.my.settings.RestoreController.index
POST    /settings/restore                            controllers.my.settings.RestoreController.restore

# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
# Personal space - upload
# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

POST    /:username/upload/step-1                     controllers.my.UploadController.storeDocumentMetadata(username: String)
GET     /:username/upload/step-1                     controllers.my.UploadController.showStep1(username: String)
GET     /:username/upload/step-2                     controllers.my.UploadController.showStep2(username: String)
POST    /:username/upload/step-2                     controllers.my.UploadController.storeFilepart(username: String)
DELETE  /:username/upload/step-2/:filename           controllers.my.UploadController.deleteFilepart(username: String, filename: String)
GET     /:username/upload/step-3                     controllers.my.UploadController.showStep3(username: String)
POST    /:username/upload/step-3                     controllers.my.UploadController.showStep3(username: String)
GET     /:username/upload/cancel                     controllers.my.UploadController.cancelUploadWizard(username: String)
GET     /:username/upload/progress/:docId            controllers.my.UploadController.queryTaskProgress(username: String, docId: String)

# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
# Application root
# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

GET     /stats.json                                  controllers.landing.LandingController.getStats()
GET     /                                            controllers.landing.LandingController.index

# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
# Personal space root
# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

GET     /my                                          controllers.my.MyRecogitoController.my
GET     /:username                                   controllers.my.MyRecogitoController.index(username: String, tab: Option[String], p: Option[Int], sortby: Option[String], order: Option[String], size: Option[Int])
