package routes

import (
	"github.com/labstack/echo"
	"github.com/labstack/echo/middleware"

	"git.mowie.cc/konrad/Library/models"
	apiv1 "git.mowie.cc/konrad/Library/routes/api/v1"
)

// NewEcho registers a new Echo instance
func NewEcho() *echo.Echo {
	e := echo.New()

	// Logger
	e.Use(middleware.LoggerWithConfig(middleware.LoggerConfig{
		Format: "${time_rfc3339}: ${remote_ip} ${method} ${status} ${uri} ${latency_human} - ${user_agent}\n",
	}))

	// Static Content
	e.Static("/assets", "assets")

	return e
}

// RegisterRoutes registers all routes for the application
func RegisterRoutes(e *echo.Echo) {

	e.Use(func(next echo.HandlerFunc) echo.HandlerFunc {
		return func(c echo.Context) error {
			res := c.Response()
			res.Header().Set("Access-Control-Allow-Origin", "*")
			res.Header().Set("Access-Control-Allow-Methods", "GET, POST, PUT, DELETE")
			res.Header().Set("Access-Control-Allow-Headers", "authorization,content-type")
			res.Header().Set("Access-Control-Expose-Headers", "authorization,content-type")
			return next(c)
		}
	})

	// Basic Route
	e.Static("/", "frontend/dist/")

	// Login Route
	e.POST("/login", Login)

	// API Routes
	a := e.Group("/api/v1")

	// CORS_SHIT
	a.OPTIONS("/books", SetCORSHeader)
	a.OPTIONS("/books/:id", SetCORSHeader)
	a.OPTIONS("/login", SetCORSHeader)
	a.OPTIONS("/authors", SetCORSHeader)
	a.OPTIONS("/authors/:id", SetCORSHeader)
	a.OPTIONS("/publishers", SetCORSHeader)
	a.OPTIONS("/publishers/:id", SetCORSHeader)
	a.OPTIONS("/status", SetCORSHeader)
	a.OPTIONS("/status/:id", SetCORSHeader)
	a.OPTIONS("/items", SetCORSHeader)
	a.OPTIONS("/items/:id", SetCORSHeader)

	a.POST("/login", Login)

	// Lookup Books
	a.GET("/books", apiv1.BookList)
	a.GET("/books/:id", apiv1.BookShow)

	// Lookup Authors
	a.GET("/authors", apiv1.AuthorsList)
	a.GET("/authors/:id", apiv1.AuthorShow)

	// Lookup Publishers
	a.GET("/publishers", apiv1.PublishersList)
	a.GET("/publishers/:id", apiv1.PublisherShow)

	// Lookup Items
	a.GET("/items", apiv1.ItemsList)
	a.GET("/items/:id", apiv1.ItemShow)

	// Lookup Status
	a.GET("/status", apiv1.StatusListShow)
	a.GET("/status/:id", apiv1.StatusByIDShow)

	// ===== Routes with Authetification =====
	// Authetification
	a.Use(middleware.JWT(models.Config.JWTLoginSecret))
	a.POST("/tokenTest", apiv1.CheckToken)

	// Manage Books
	a.PUT("/books", apiv1.BookAddOrUpdate)
	a.DELETE("/books/:id", apiv1.BookDelete)
	a.POST("/books/:id", apiv1.BookAddOrUpdate)

	// Manage Authors
	a.PUT("/authors", apiv1.AuthorAddOrUpdate)
	a.DELETE("/authors/:id", apiv1.AuthorDelete)
	a.POST("/authors/:id", apiv1.AuthorAddOrUpdate)

	// Manage Publishers
	a.PUT("/publishers", apiv1.PublisherAddOrUpdate)
	a.DELETE("/publishers/:id", apiv1.PublisherDelete)
	a.POST("/publishers/:id", apiv1.PublisherAddOrUpdate)

	// Manage Items
	a.PUT("/items", apiv1.ItemAddOrUpdate)
	a.DELETE("/items/:id", apiv1.ItemDelete)
	a.POST("/items/:id", apiv1.ItemAddOrUpdate)

	// Manage Users

	/*
		Alles nur mit Api machen, davor dann einen onepager mit vue.js.

		(Alles mit | benötigt Authentifizierung)

		Routes:
		GET    / 					   - entweder übersicht anzeigen (wenn der nutzer eingeloggt ist) oder auf /login weiterleiten
		POST   /login 				   - ✔ Einloggen
		POST   /logout				   - ausloggen

		GET    /books/:id			   - ✔ Buch anzeigen
		POST   /books/:id	           - ✔ |Buch bearbeiten (inkl mengen)
		DELETE /books/:id	     	   - ✔ |Buch löschen (+alle einträge in authors_books löschen dessen Bush dazu gehört)
		GET    /books/search?s=se      - ✔ Suchen
		GET    /books/list			   - ✔ Auflisten
		PUT    /books/add			   - ✔ |Hinzufügen

		GET    /authors/:id		       - ✔ Autor anzeigen
		POST   /authors/:id       	   - ✔ |Autor bearbeiten
		DELETE /authors/:id			   - ✔ |Autor löschen (auch mit allem in books_author)
		GET    /authors/list		   - ✔ Autoren auflisten
		GET    /authors/search?s=d     - ✔ Autoren suchen
		PUT    /authors/add		  	   - ✔ |Hinzufügen

		GET    /publishers/:id		   - ✔ Verlag anzeigen
		POST   /publishers/:id		   - ✔ |Verlag bearbeiten
		DELETE /publishers/:id		   - ✔ |Verlag löschen (bei büchern Verlag auf 0 setzen)
		GET    /publishers/list	       - ✔ Verlage auflisten
		GET    /publishers/search?s=   - ✔ Verlage suchen
		PUT    /publishers/add		   - ✔ |Hinzufügen

		GET    /settings			   - |Nutzereinstellungen (Passwort, name etc)
		POST   /settings			   - |Nutzereinstellungen (Passwort, name etc)
		GET    /user 				   - Nutzer anzeigen
		PUT    /user 			  	   - |neue Nutzer anlegen
		DELETE /user/:id 			   - |nutzer löschen
		POST   /user/:id	 		   - |nutzer bearbeiten
	*/
}
