package main

import (
	"fmt"
	"log"
	"net/http"
	"os"
	"time"

	"github.com/gorilla/handlers"
	"github.com/jinzhu/gorm"

	"gogs.carducci-dante.gov.it/karmen/config"
	"gogs.carducci-dante.gov.it/karmen/core/handlers"
	"gogs.carducci-dante.gov.it/karmen/core/orm"
)

const (
	MaxNumRetries     = 20
	RetryTimeInterval = 2
)

func main() {

	var (
		db  *gorm.DB
		err error
	)

	log.Println("Loading config file...")
	err = config.ReadFile("config/config.yaml", config.Config)
	if err != nil {
		panic(err)
	}

	log.Println("Starting karmen and waiting for the DB...")

	count := MaxNumRetries
	wait := true

	for wait && count > 0 {
		db, err = orm.New(fmt.Sprintf("%s?%s", config.Config.Orm.Connection, config.Config.Orm.Options))
		if err != nil {
			count--
			log.Println(err)
			log.Printf("Remaining retries: %d", count)
			time.Sleep(time.Second * RetryTimeInterval)
			continue
		}
		wait = false
	}

	orm.Use(db)

	if config.Config.Orm.Reset {
		log.Print("Resetting the DB...")
		orm.Reset()
	}

	if config.Config.Orm.AutoMigrate {
		log.Print("Automigrating...")
		orm.AutoMigrate()
	}

	log.Println("karmen is listening to port 3000...")
	if err := http.ListenAndServe(":3000", handlers.LoggingHandler(os.Stdout, api.Handlers())); err != nil {
		panic(err)
	}
}
