//Calendar implementation for the HTWK Leipzig timetable. Evaluation and display of the individual dates in iCal format.
//Copyright (C) 2024 HTWKalender support@htwkalender.de

//This program is free software: you can redistribute it and/or modify
//it under the terms of the GNU Affero General Public License as published by
//the Free Software Foundation, either version 3 of the License, or
//(at your option) any later version.

//This program is distributed in the hope that it will be useful,
//but WITHOUT ANY WARRANTY; without even the implied warranty of
//MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
//GNU Affero General Public License for more details.

//You should have received a copy of the GNU Affero General Public License
//along with this program.  If not, see <https://www.gnu.org/licenses/>.

package v2

import (
	"github.com/pocketbase/pocketbase/tools/types"
	"golang.org/x/net/html"
	"htwkalender/data-manager/model"
	"htwkalender/data-manager/service/date"
	"htwkalender/data-manager/service/functions"
	"strings"
)

func toEvents(tables [][]*html.Node, days []string) []model.Event {
	var events []model.Event

	for tableIndex, table := range tables {
		day := days[tableIndex]

		for _, row := range table {
			tableData := findTableData(row)
			if len(tableData) == 0 {
				continue
			}
			events = append(events, createEventsFromTableData(tableData, day)...)
		}
	}
	return events
}

func createEventsFromTableData(tableData []*html.Node, day string) []model.Event {
	var events []model.Event

	start, _ := types.ParseDateTime(date.CreateTimeFromHourAndMinuteString(getTextContent(tableData[1])))
	end, _ := types.ParseDateTime(date.CreateTimeFromHourAndMinuteString(getTextContent(tableData[2])))
	name := getTextContent(tableData[3])
	if functions.OnlyWhitespace(name) {
		name = "Sonderveranstaltung"
	}

	courses := getTextContent(tableData[7])
	if len(courses) > 0 {
		for _, course := range strings.Split(courses, " ") {
			events = append(events, model.Event{
				Day:       day,
				Week:      getTextContent(tableData[0]),
				Start:     start,
				End:       end,
				Name:      name,
				EventType: getTextContent(tableData[4]),
				Notes:     getTextContent(tableData[5]),
				Prof:      getTextContent(tableData[6]),
				Rooms:     getTextContent(tableData[8]),
				BookedAt:  getTextContent(tableData[10]),
				Course:    strings.TrimSpace(course),
			})
		}
	}

	return events
}
