package main

import (
	"fmt"
	"time"

	gps "hnyfkj.com.cn/rtu/bxs-sy/air530z"
	modem "hnyfkj.com.cn/rtu/bxs-sy/air720u"
	"hnyfkj.com.cn/rtu/bxs-sy/baseapp"
	mcu "hnyfkj.com.cn/rtu/bxs-sy/mcu_ctrl_board"
	takephoto "hnyfkj.com.cn/rtu/bxs-sy/mvs_takephoto"
	"hnyfkj.com.cn/rtu/bxs-sy/netmgr"
	"hnyfkj.com.cn/rtu/bxs-sy/reporter"
)

func main() {
	if baseapp.IsArgsParam("-h") {
		help()
		return
	}

	if baseapp.IsArgsParam("-v") {
		fmt.Println("程序版本:", baseapp.Version, "\n构建时间:", baseapp.BuildTime)
		return
	}

	baseapp.ModuleInit()
	baseapp.SingleInstanceRun() // 异步非阻塞
	baseapp.Logger.Infof("程序版本: %s 构建时间: %s\n程序开始运行...",
		baseapp.Version, baseapp.BuildTime)

	// 01, 初始化卫星定位模块
	gps.ModuleInit()

	// 02, 初始化4G调制解调器
	if !modem.ModuleInit(false) {
		goto end_p
	}

	// 03, 初始化网络管理模块
	netmgr.ModuleInit()
	netmgr.WaitAllOK(time.Duration(10) * time.Second) // 等待联网成功和NTP时间同步成功

	// 04, 初始化相机拍照模块
	if !takephoto.ModuleInit() {
		goto end_p
	}

	// 05, 初始化单片机控制板
	if !mcu.ModuleInit() {
		goto end_p
	}

	// 06, 后台服务器业务交互
	if !reporter.ModuleInit() {
		goto end_p
	}

	// 07, 阻塞等待退出信号量
	select {
	case <-baseapp.IsExit2():
	case <-mcu.NotifyPwrWillOff():
	}

	// 08, 退出程序并释放资源
end_p:
	reporter.ModuleExit()
	mcu.ModuleExit()
	modem.ModuleExit()
	gps.ModuleExit()

	baseapp.Logger.Info("程序退出")
	baseapp.ExitLogger() // 安全的关闭日志模块
	baseapp.SafeExit()   // 安全的关闭退出程序
}

func help() {
	h := `
-h 显示帮助提示
-v 当前程序版本
`

	fmt.Println(h)
}
