//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 main

import (
	"github.com/pocketbase/pocketbase"
	"github.com/pocketbase/pocketbase/plugins/migratecmd"
	_ "htwkalender/data-manager/migrations"
	"htwkalender/data-manager/model/serviceModel"
	"htwkalender/data-manager/service"
	"htwkalender/data-manager/service/events"
	"htwkalender/data-manager/service/grpc"
	"log/slog"
	"os"
	"strings"
)

func setupApp() *pocketbase.PocketBase {
	app := pocketbase.New()
	courseService := events.NewPocketBaseCourseService(app)
	eventService := events.NewPocketBaseEventService(app)

	services := serviceModel.Service{
		CourseService: courseService,
		EventService:  eventService,
		App:           app,
	}

	// loosely check if it was executed using "go run"
	isGoRun := strings.HasPrefix(os.Args[0], os.TempDir())

	//start grpc server
	go grpc.StartGRPCServer(app)

	migratecmd.MustRegister(app, app.RootCmd, migratecmd.Config{
		// enable auto creation of migration files when making collection changes in the Admin UI
		// (the isGoRun check is to enable it only during development)
		Automigrate: isGoRun,
	})
	service.AddRoutes(services)
	service.AddSchedules(services)

	return app
}

func main() {
	app := setupApp()
	if err := app.Start(); err != nil {
		slog.Error("Failed to start app: ", "error", err)
	}
}
