// main
package main

import (
	"flag"
	"fmt"
	"log"
	"net/http"
	"officeHours/config"
	"officeHours/controllers"
	"officeHours/repositories"
	"officeHours/sqldb"
	"officeHours/templating"
	"os"
)

func main() {
	configFile := flag.String(
		"config",
		"config/config.json",
		"File path to the configuration file")
	flag.Parse()
	if *configFile == "" {
		flag.Usage()
		os.Exit(1)
	}
	var conf config.Config
	err := config.ReadConfigFile(*configFile, &conf)
	if err != nil {
		log.Fatalf("%s: %s", "Reading JSON config file into config structure", err)
	}

	// serve static files
	staticHandler := http.FileServer(http.Dir("./static"))
	// parse templates
	if err = templating.InitTemplates(); err != nil {
		log.Fatal(err.Error())
	}
	// database connection
	db, err := sqldb.Connect(conf)
	if err != nil {
		log.Fatal(err.Error())
	}
	// Create repos
	roomRepo := repositories.NewRoomRepo(db)
	courseRepo := repositories.NewCourseRepo(db)
	tutorRepo := repositories.NewTutorRepo(db)
	officeHourRepo := repositories.NewOfficeHourRepo(db, roomRepo, tutorRepo, courseRepo, conf)
	requestRepo := repositories.NewRequestRepo(db, officeHourRepo, conf)
	h := controllers.NewBaseHandler(roomRepo, officeHourRepo, courseRepo, tutorRepo, requestRepo, conf)

	http.HandleFunc("/getByRoom", h.GetByRoomHandler)
	http.HandleFunc("/getByCourse", h.GetByCourseHandler)
	http.HandleFunc("/addOfficeHour", h.AddOfficeHourHandler)
	http.HandleFunc("/confirmRequest", h.ConfirmRequestHandler)
	http.HandleFunc("/deleteOfficeHour", h.DeleteOfficeHourHandler)
	http.HandleFunc("/", h.RootHandler)
	http.Handle("/static/", http.StripPrefix("/static/", staticHandler))

	err = http.ListenAndServe(fmt.Sprintf("%s:%d", conf.Server.ListenAddress, conf.Server.ListenPort), nil)
	log.Fatal(err.Error())
}
