package main

import (
	"database/sql"
	"net/http"
	"strings"

	"golang-fave/engine/backend"
	"golang-fave/engine/frontend"
	"golang-fave/engine/wrapper"

	templates "golang-fave/engine/wrapper/resources/templates"
	utils "golang-fave/engine/wrapper/utils"
)

func handlerPage(wrapper *wrapper.Wrapper) bool {
	mysql_conf_exists := utils.IsMySqlConfigExists(wrapper.DirVHostHome)

	is_front_end := true
	if wrapper.R.URL.Path == "/cp" || strings.HasPrefix(wrapper.R.URL.Path, "/cp/") {
		is_front_end = false
	}

	if is_front_end {
		// Front-end
		if !mysql_conf_exists {
			(*wrapper.W).Header().Set("Cache-Control", "no-cache, no-store, must-revalidate")
			http.Redirect(*wrapper.W, wrapper.R, wrapper.R.URL.Scheme+"://"+wrapper.R.Host+"/cp/", 302)
			return true
		}
	} else {
		// Back-end
		if !mysql_conf_exists {
			return wrapper.TmplBackEnd(templates.CpMySQL, nil)
		}
	}

	// Connect to database or show error
	mc, err := utils.MySqlConfigRead(wrapper.DirVHostHome)
	if wrapper.EngineErrMsgOnError(err) {
		return true
	}
	db, err := sql.Open("mysql", mc.User+":"+mc.Password+"@tcp("+mc.Host+":"+mc.Port+")/"+mc.Name)
	if wrapper.EngineErrMsgOnError(err) {
		return true
	}
	defer db.Close()
	err = db.Ping()
	if wrapper.EngineErrMsgOnError(err) {
		return true
	}

	// Parse url params
	url_args := utils.UrlToArray(wrapper.R.URL.Path)

	// Run WebSite or CP
	if is_front_end {
		// Front-end
		return frontend.New(wrapper, db, &url_args).Run()
	} else {
		// Back-end
		return backend.New(wrapper, db, &url_args).Run()
	}
}