package main

import (
	"log"
	"os"
	"os/signal"
	"syscall"

	"git.ar21.de/yolokube/go-traefik-certmanager/internal/cmd"
	"git.ar21.de/yolokube/go-traefik-certmanager/pkg/certmanager"
	"git.ar21.de/yolokube/go-traefik-certmanager/pkg/ingressroute"
	"k8s.io/client-go/dynamic"
	"k8s.io/client-go/rest"
)

func main() {
	cli := cmd.CLI{}
	appSettings := cli.Parse()

	config, err := rest.InClusterConfig()
	if err != nil {
		log.Fatal(err)
	}

	client, err := dynamic.NewForConfig(config)
	if err != nil {
		log.Fatal(err)
	}

	cmClient := certmanager.NewClient(
		*client,
		certmanager.WithCertIssuerKind(appSettings.CertIssuerKind),
		certmanager.WithCertIssuerName(appSettings.CertIssuerName),
	)

	options := []ingressroute.ClientOption{}
	if appSettings.CertCleanup {
		options = append(options, ingressroute.WithCertCleanup())
	}

	irClient := ingressroute.NewClient(
		*client,
		cmClient,
		options...,
	)

	stopCh := make(chan struct{})
	defer close(stopCh)

	go irClient.IngressRoutes.Watch(stopCh)

	signalCh := make(chan os.Signal, 1)
	signal.Notify(signalCh, syscall.SIGINT, syscall.SIGTERM)
	<-signalCh
	log.Print("Shutting down gracefully")
}