package web

import (
	"encoding/gob"

	"git.jonasfranz.software/JonasFranzDEV/gitea-github-migrator/web/auth"
	"git.jonasfranz.software/JonasFranzDEV/gitea-github-migrator/web/context"
	"git.jonasfranz.software/JonasFranzDEV/gitea-github-migrator/web/migration"
	"github.com/go-macaron/binding"
	"github.com/go-macaron/session"
	"github.com/gobuffalo/packr"
	"gopkg.in/macaron.v1"
)

// InitRoutes initiates the gin routes and loads values from config
func InitRoutes() *macaron.Macaron {
	gob.Register(&context.User{})
	m := macaron.Classic()
	auth.InitGitHubOAuthConfig()
	tmplBox := packr.NewBox("templates")
	publicBox := packr.NewBox("public")
	m.Use(macaron.Recovery())
	m.Use(session.Sessioner(session.Options{
		Provider:       "file",
		ProviderConfig: "data/sessions",
	}))
	m.Use(macaron.Renderer(macaron.RenderOptions{
		TemplateFileSystem: &BundledFS{tmplBox},
	}))
	m.Use(macaron.Statics(macaron.StaticOptions{
		Prefix:     "static",
		FileSystem: publicBox,
	}, ""))
	m.Use(context.Contexter())

	// BEGIN: Router
	m.Get("/", func(ctx *context.Context) {
		if ctx.User != nil {
			if ctx.GiteaUser == nil {
				ctx.HTML(200, "login_gitea")
				return
			}
			ctx.HTML(200, "dashboard")
			return
		}
		ctx.HTML(200, "login_github") // 200 is the response code.
	})
	m.Get("/logout", func(c *macaron.Context, sess session.Store) {
		sess.Destory(c)
		c.Redirect("/")
	})
	m.Group("/github", func() {
		m.Get("/", auth.RedirectToGitHub)
		m.Get("/callback", auth.CallbackFromGitHub)
	})
	m.Group("/gitea", func() {
		m.Post("/", binding.BindIgnErr(auth.GiteaLoginForm{}), auth.LoginToGitea)
	})
	m.Combo("/repos", reqSignIn).Get(migration.ListRepos).Post(migration.ListReposPost)
	m.Get("/status", reqSignIn, migration.StatusReport)
	return m
}

func reqSignIn(ctx *context.Context) {
	if ctx.User == nil || ctx.GiteaUser == nil {
		ctx.Redirect("/")
	}
}