package main

import (
	"dbackup/detail"
	log "dbackup/logging"
	"flag"
	"github.com/BurntSushi/toml"
	"github.com/kardianos/service"
	"github.com/robfig/cron"
	"os"
	"path/filepath"
)

func main() {
	svcFlag := flag.String("service", "", "Control the system service.")
	flag.Parse()
	detail.InitLogger()

	p := &detail.Task{
		Ch: make(chan struct{}),
		Cron: cron.New(),
	}

	addTask(p)

	s, e := service.New(p, &service.Config{
		Name:        "dbackup",
		DisplayName: "dbackup service",
		Description: "cron job for database backup",
	})

	if e != nil {
		log.Fatal("%s", e)
	}

	errs := make(chan error, 5)
	lgg, e := s.Logger(errs)
	if e != nil {
		log.Fatal("%s", e)
	}

	go func() {
		for {
			err := <-errs
			if err != nil {
				log.Fatal("%s", err)
			}
		}
	}()

	if len(*svcFlag) != 0 {
		err := service.Control(s, *svcFlag)
		if err != nil {
			log.Fatal("valid actions: %q\n", service.ControlAction)
			log.Fatal("%s", err)
		}
		return
	}

	e = s.Run()

	if e != nil {
		lgg.Error(e)
	}
}

func addTask(t *detail.Task) {
	tmp, err := filepath.Abs(filepath.Dir(os.Args[0]))
	if err != nil {
		log.Fatal("can't get current work directory: %s", err)
	}

	cfg := filepath.Join(tmp, "conf.toml")

	var pg detail.Postgres
	if _, err := toml.DecodeFile(cfg, &pg); err != nil {
		log.Fatal("%s", err)
	}

	if err := pg.AddTask(t); err != nil {
		log.Fatal("%s", err)
	}
}