// lastlogin_consolidate
package main

import (
	"flag"
	"fmt"
	"log"
	"os"
	"sync"
	"time"

	"github.com/mikif70/pidlib"
)

const (
	_VERSION = "v1.4.0"
	_tformat = "2006-01-02"
	_24h     = (time.Hour * 23) + (time.Minute * 59) + (time.Second * 59) + (time.Millisecond * 999)
	_10m     = (time.Minute * 10)
	_15m     = (time.Minute * 15)
)

var (
	opts = Options{
		MongoSrc:  "mongodb://127.0.0.1:27018",
		LogFile:   "log/llconsolidate.log",
		StartDate: time.Now().Add(-24 * time.Hour).Format(_tformat),
		Duration:  _24h,
		Interval:  _15m,
		Batch:     10000,
		DstDB:     "dovecot",
	}

	wg sync.WaitGroup

	dbs = Dbs{}

	idb *InfluxdbOutput
)

func main() {

	flag.Usage = usage
	flag.Parse()

	if opts.Version {
		fmt.Println(os.Args[0], _VERSION)
		os.Exit(0)
	}

	if opts.Hostname == "" {
		var err error
		opts.Hostname, err = os.Hostname()
		if err != nil {
			fmt.Println("Hostname error: ", err.Error())
		}
	}

	setTerm()

	fs, err := os.OpenFile(opts.LogFile, os.O_WRONLY|os.O_APPEND|os.O_CREATE, 0666)
	if err != nil {
		fmt.Println("Log file error: ", err.Error())
		os.Exit(-4)
	}

	log.SetOutput(fs)

	pid := pidlib.New()
	pid.Write()
	defer pid.Remove()

	start := time.Now()
	fmt.Printf("Start: %+v\n", opts)
	log.Printf("Start: %+v\n", opts)

	y, err := time.Parse(_tformat, opts.StartDate)
	if err != nil {
		log.Println("Date Error: ", err)
		os.Exit(-1)
	}
	var ys time.Time
	var ye time.Time

	ys = time.Date(y.Year(), y.Month(), y.Day(), 0, 0, 0, 0, time.UTC)
	ye = ys.Add(opts.Duration)
	idb = Influxdb(start, ys)

	connectMongo(ys.Format("0601"))
	defer dbs.mdbSrc.Close()
	defer dbs.mdbDst.Close()

	// DEBUG
	if opts.Debug {
		fmt.Printf("Start: %+v, Stop: %+v\n\r", ys, ye)
	}

	pStart := time.Now()

	agg := Consolidate(ys, ye)
	agg.Start()

	fmt.Printf("Stop %s: %s\n", ys, time.Since(pStart))
	log.Printf("Stop %s: %s\n", ys, time.Since(pStart))

	idb.Stop = time.Since(start)

	idb.InsUsers = agg.Verify()

	fmt.Printf("Stop: OK: %d - TOT: %d - Time: %s\n\r", idb.InsUsers, idb.TotUsers, idb.Stop)
	log.Printf("Stop: OK: %d - TOT: %d - Time: %s\n\r", idb.InsUsers, idb.TotUsers, idb.Stop)

	if opts.Influxdb != "" {
		idb.writeStats()
	}
}