package controllers

import (
	"net/http"
	"strings"

	"git.kirsle.net/apps/gophertype/pkg/console"
	"git.kirsle.net/apps/gophertype/pkg/models"
	"git.kirsle.net/apps/gophertype/pkg/responses"
)

// CatchAllHandler handles the "/" and wildcard routes that are not
// picked up by any other controllers. It serves static files and Go
// templates from the builtin web root or the user root.
func CatchAllHandler(w http.ResponseWriter, r *http.Request) {
	path := r.URL.Path

	// Is it a blog fragment?
	if _, err := models.Posts.LoadFragment(path); err == nil {
		PostFragment(w, r)
		return
	}

	// No dot-files allowed.
	if strings.Contains(path, "/.") {
		console.Error("Path '%s' contains a dotfile; forbidden", path)
		responses.Forbidden(w, r, "You're not supposed to be here.")
		return
	}

	// Resolve the target path.
	filepath, err := responses.ResolveFile(path)
	if err != nil {
		responses.NotFound(w, r)
		return
	}

	// Files under /_builtin can only be taken literally.
	if strings.HasPrefix(filepath, "_builtin/") {
		responses.SendFile(w, r, filepath)
		return
	}

	// Is it a Go template?
	if strings.HasSuffix(filepath, ".gohtml") {
		responses.RenderTemplate(w, r, filepath, nil)
		return
	} else if strings.HasSuffix(filepath, ".md") {
		responses.RenderMarkdown(w, r, filepath)
		return
	}

	responses.SendFile(w, r, filepath)
}
