package main

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

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

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

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

	// Настройка маршрутов
	router := setupRoutes(app)

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

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

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

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

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

	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))
}