package main

import (
	"net/http"

	"coffey.dad/ui"

	"github.com/julienschmidt/httprouter"
	"github.com/justinas/alice"
)

func (app *application) routes() http.Handler {
	router := httprouter.New()

	router.NotFound = http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
		app.notFound(w, r)
	})

	fileServer := http.FileServer(http.FS(ui.Files))
	router.Handler(http.MethodGet, "/static/*filepath", fileServer)

	uploadServer := http.FileServer(http.Dir("./uploads"))
	router.Handler(http.MethodGet, "/uploads/*filepath", http.StripPrefix("/uploads", uploadServer))

	dynamic := alice.New(app.sessionManager.LoadAndSave, noSurf, app.authenticate)

	router.Handler(http.MethodGet, "/", dynamic.ThenFunc(app.home))
	router.Handler(http.MethodGet, "/blog", dynamic.ThenFunc(app.postList))
	router.Handler(http.MethodGet, "/blog/post/:id", dynamic.ThenFunc(app.postView))
	router.Handler(http.MethodGet, "/login", dynamic.ThenFunc(app.login))
	router.Handler(http.MethodPost, "/login", dynamic.ThenFunc(app.loginSubmit))
	router.Handler(http.MethodGet, "/repos", dynamic.ThenFunc(app.repoList))
	router.Handler(http.MethodGet, "/repo/:name", dynamic.ThenFunc(app.repoView))
	router.Handler(http.MethodGet, "/repo/:name/:type/:branch", dynamic.ThenFunc(app.repoView))
	router.Handler(http.MethodGet, "/repo/:name/:type/:branch/*path", dynamic.ThenFunc(app.repoView))

	protected := dynamic.Append(app.requireAuthentication)

	router.Handler(http.MethodPost, "/logout", protected.ThenFunc(app.logoutSubmit))
	router.Handler(http.MethodGet, "/blog/new", protected.ThenFunc(app.newPost))
	router.Handler(http.MethodPost, "/blog/new", protected.ThenFunc(app.newPostSubmit))
	router.Handler(http.MethodGet, "/blog/edit/:id", protected.ThenFunc(app.editPost))
	router.Handler(http.MethodPost, "/blog/edit/:id", protected.ThenFunc(app.editPostSubmit))
	router.Handler(http.MethodGet, "/upload", protected.ThenFunc(app.upload))
	router.Handler(http.MethodPost, "/upload", protected.ThenFunc(app.uploadPost))
	router.Handler(http.MethodGet, "/choose-image", protected.ThenFunc(app.imagePicker))
	router.Handler(http.MethodGet, "/choose-header-image", protected.ThenFunc(app.headerImagePicker))
	router.Handler(http.MethodGet, "/blog/drafts", protected.ThenFunc(app.draftList))
	router.Handler(http.MethodGet, "/blog/drafts/edit/:id", protected.ThenFunc(app.editPost))
	router.Handler(http.MethodPost, "/blog/drafts/edit/:id", protected.ThenFunc(app.editPostSubmit))
	router.Handler(http.MethodGet, "/repos/new", protected.ThenFunc(app.addRepo))
	router.Handler(http.MethodPost, "/repos/new", protected.ThenFunc(app.addRepoPost))

	standard := alice.New(app.recoverPanic, app.logRequest, secureHeaders)

	return standard.Then(router)
}