package main

import (
	"log"
	"sync"

	"github.com/prologic/go-gopher"
	"github.com/spf13/viper"
)

func main() {
	viper.SetConfigName("config")
	viper.AddConfigPath("/etc/secretshop/")
	viper.AddConfigPath(".")
	err := viper.ReadInConfig()
	if err != nil {
		log.Fatalf("Fatal error config file: %v \n", err)
	}
	viper.SetConfigType("yaml")

	//Load configs
	active_capsules := viper.GetStringSlice("active_capsules")
	active_holes := viper.GetStringSlice("active_holes")
	port := viper.GetString("port")
	capsule_list := make([]GeminiConfig, len(active_capsules))
	hole_list := make([]GopherConfig, len(active_holes))
	for i, c := range active_capsules {
		viper.UnmarshalKey(c, &(capsule_list[i]))
		log.Printf("Loading capsule %v %v", i, capsule_list[i].Hostname)
	}
	for i, h := range active_holes {
		viper.UnmarshalKey(h, &(hole_list[i]))
		log.Printf("Loading hole %v %v", i, hole_list[i].Hostname)
	}
	if len(capsule_list) < 1 && len(hole_list) < 1 {
		log.Println("No capsules or gopherholes loaded. Shutting down.")
		return
	}
	log.Printf("%v capsules loaded, %v gopherholes loaded", len(capsule_list), len(hole_list))
	// Intialize servers
	wg := new(sync.WaitGroup)
	wg.Add(1 + len(hole_list))

	go func(c interface{}) {
		log.Fatal(ListenAndServeTLS(port, c.([]GeminiConfig)))
		wg.Done()
	}(capsule_list)

	for _, h := range hole_list {
		go func(h interface{}) {
			hole := h.(GopherConfig)
			gopher.Handle("/", index(gopher.Dir(hole.RootDir)))
			server := &gopher.Server{Addr: "0.0.0.0:" + hole.Port, Hostname: hole.Hostname, Handler: nil}
			log.Fatal(server.ListenAndServe())
			wg.Done()
		}(h)
	}

	log.Println("Loaded SecretShop " + SECRETSHOP_VERSION)
	log.Println("Ho ho! You found me!")
	wg.Wait()
}
