package main

import (
	"fmt"
	"os"
	"strings"
	"time"

	"gitlab.com/cinnamon/voiceagent/icsconf"
	"gitlab.com/cinnamon/voiceagent/icserror"
	"gitlab.com/cinnamon/voiceagent/icslog"
	"gitlab.com/cinnamon/voiceagent/icsutil"
)

func main() {
	var homeDir string

	//get Voice Agent home dir
	isStop := false

	for _, e := range os.Environ() {
		s := strings.SplitN(e, "=", 2)
		if strings.Compare(s[0], "ICSVB_ROOT") == 0 {
			homeDir = s[1]
			//service.SetHomeDir(s[1])
			isStop = true
			break
		}
	}
	if !isStop {
		icserror.ICSERRNotFoundHome.PrintWithCaller(1)
		return
	}

	//configuration
	configFile := fmt.Sprintf("%s/config/icsbot.xml", homeDir)
	//configFile := fmt.Sprintf("%s/config/icsvc.xml", service.GetHomeDir())
	//fmt.Println("Config file:", configFile)
	conf, confErr := icsconf.OpenConfig(configFile, homeDir)
	if confErr != nil {
		confErr.PrintWithCaller(0)
		return
	}

	icsLog, lerr := icslog.NewIcsLog(
		&conf.LogConfig,
		icslog.GetLogLevelID(conf.LogConfig.Level),
		icslog.GetLogOutputID(conf.LogConfig.Output),
		conf.LogConfig.Path,
		conf.LogConfig.Disklimit,
	)

	for {
		// log file name change
		y1, m1, d1 := icsLog.CurrentDate.Date()
		y2, m2, d2 := time.Now().Date()

		if d1 != d2 || y1 != y2 || m1 != m2 {
			icsLog.M.Lock()
			icsLog.LogFileName = fmt.Sprintf("%s/icsva.log-%d%02d%02d", icsLog.Path, y2, m2, d2) // file name change
			var oerr error
			icsLog.LogFile, oerr = os.OpenFile(icsLog.LogFileName, os.O_RDWR|os.O_CREATE|os.O_APPEND, 0666)
			if oerr != nil {
				icserror.ICSERRFileOpen.SetError(oerr)
				icsLog.M.Unlock()
			}
			icsLog.M.Unlock()
		}

		if icsutil.CheckPID() {
		} else {
			icsLog.Print(icslog.LOG_LEVEL_INFO, -1, "Voice Agent Death - reloading...")

			if lerr != nil {
				lerr.PrintWithCaller(0)
			}

			icsLog.Print(icslog.LOG_LEVEL_INFO, -1, "Started Voice Agent Loader")

			//deamonize
			pid, derr := icsutil.Deamonize()
			if derr != nil {
				icserror.ICSERRDeamonize.SetError(derr)
				icsLog.Printf(icslog.LOG_LEVEL_ERROR, -1, "voiceagent: %s", icserror.ICSERRDeamonize.GetError())
				os.Exit(0)
			}

			icsLog.Printf(icslog.LOG_LEVEL_INFO, -1, "Loaded Voice Agent[%d]", pid)
		}
		time.Sleep(time.Second * 15)
	}
}