package controllers

import (
	"html/template"
	"log"
	"net/http"
	"officeHours/models"
	"officeHours/templating"
	"strconv"
)

func (b *BaseHandler) RootHandler(w http.ResponseWriter, req *http.Request) {
	SendSecurityHeaders(w, req)
	b.writeTimetablePage(w, req, template.HTML(""))
}

func (b *BaseHandler) GetByRoomHandler(w http.ResponseWriter, req *http.Request) {
	SendSecurityHeaders(w, req)
	roomId, _ := strconv.Atoi(req.FormValue("raum"))
	room, err := b.roomRepo.FindById(roomId)
	if err != nil {
		b.RootHandler(w, req)
		return
	}
	officeHours, err := b.officeHourRepo.FindByRoom(room, true)
	if err != nil {
		log.Printf("Error getting office hours for room %s: %s", room.Name, err.Error())
	}
	timetable, slots := b.GetTimetable(officeHours)
	b.writeTimetablePage(w, req, b.printTimetable(timetable, slots, false))
}

func (b *BaseHandler) GetByCourseHandler(w http.ResponseWriter, req *http.Request) {
	SendSecurityHeaders(w, req)
	courseid, err := strconv.Atoi(req.FormValue("veranstaltung"))
	if err != nil {
		b.RootHandler(w, req)
		return
	}
	course, err := b.courseRepo.FindById(courseid)
	if err != nil {
		b.RootHandler(w, req)
		return
	}
	officeHours, err := b.officeHourRepo.FindByCourse(course, true)
	if err != nil {
		log.Printf("Error getting office hours for course %s: %s", course.Name, err.Error())
	}
	timetable, slots := b.GetTimetable(officeHours)
	b.writeTimetablePage(w, req, b.printTimetable(timetable, slots, false))
}

func (b *BaseHandler) writeTimetablePage(w http.ResponseWriter, req *http.Request, timetable template.HTML) {
	courses, _ := b.courseRepo.GetAll()
	rooms, _ := b.roomRepo.GetAll()
	selectedRoom, _ := strconv.Atoi(req.FormValue("raum"))
	selectedCourse, _ := strconv.Atoi(req.FormValue("veranstaltung"))
	data := struct {
		Courses        []models.Course
		Rooms          []models.Room
		Timetable      template.HTML
		SelectedRoom   int
		SelectedCourse int
	}{courses, rooms, timetable, selectedRoom, selectedCourse}
	templating.ServeTemplate(w, "index", data)
}