package main

import (
	"fmt"
	"log"
	"main/mvc/controllers"
	"main/mvc/controllers/controllers_pages"
	"main/mvc/models"
	"main/mvc/models/models_pages"
	"main/tools"
	"net/http"
)

func main() {
	var app *models.App
	var err error

	// Инициализация приложения
	if app, err = models.AppInit(); err != nil {
		log.Fatal(err)
	}

	// Добавление префикса в виде домена сервера к записям в лог
	log.SetPrefix(fmt.Sprintf("%s | ", models.Cfg.ServerDomain))

	// Настройка маршрутов и запуск
	if setupRoutesAndRun(app) != nil {
		log.Fatal(err)
	}
}

func setupRoutesAndRun(a *models.App) error {
	// Настройка маршрутов
	router := setupRoutes(a)

	// Запуск сервера
	if ok, err := tools.IsIPInUse(models.Cfg.ServerIP); err != nil {
		return err
	} else if ok {
		runServer(models.Cfg.ServerIP, models.Cfg.ServerPort, router)
	} else {
		runServer(models.Cfg.LocalIP, models.Cfg.LocalPort, router)
	}

	return nil
}

// Настраивает маршруты
func setupRoutes(a *models.App) *http.ServeMux {
	router := http.NewServeMux()

	// Цепочка обработчиков, которые сработают до отдачи страницы юзеру
	m := controllers.MiddlewaresChain

	// Обработка статических файлов
	router.Handle(models.Cfg.AssetsDir, m(controllers.StaticHandler()))

	// Главные странички
	{
		// Обработка главной страницы (русская версия)
		router.Handle("/ru/", m(controllers_pages.MainRuPageHandler(a)))
		// Обработка главной страницы
		router.Handle("/", m(controllers_pages.MainPageHandler(a)))
		// Обработка страницы со списком постов
		router.Handle("/posts/", m(controllers_pages.PostsPageHandler(a)))
		// Обработка страничек постов
		for key := range models_pages.GetPosts() {
			postLink := string(key)
			router.Handle(postLink, m(controllers_pages.PostPageHandler(a)))
		}
	}

	return router
}

// Запускает сервер на указанном IP, PORT
func runServer(ip, port string, router http.Handler) {
	addr := ip + port
	log.Println("Run on", addr)
	log.Fatal(http.ListenAndServe(addr, router))
}