package main

import (
	"fmt"
	"net/http"
	"os"
	"os/signal"
	"syscall"
	"time"
)

func main() {

	if err := initLogger("lte_alarm.log"); err != nil {
		fmt.Printf("Failed to initialize logger: %v\n", err)
		os.Exit(1)
	}
	defer closeLogger()

	logInfo("--------------------------------------")
	logInfo(" LTE Alarm System : Version 2.0.0")
	logInfo("--------------------------------------")

	if err := loadConfig(); err != nil {
		logError(fmt.Sprintf("Error loading config: %v\n", err))
		os.Exit(1)
	}

	fmt.Println(config)

	// 프로그램 종료 시 GPIO 리셋을 위한 defer 추가
	defer resetAllGPIO()

	// 시그널 핸들러 설정
	setupSignalHandler()

	// HTTP 서버 설정
	http.HandleFunc("/update-phone", updatePhoneNumberHandler)
	go func() {
		fmt.Println("Starting HTTP server on :5119")
		if err := http.ListenAndServe(":5119", nil); err != nil {
			logError(fmt.Sprintf("HTTP server error: %v\n", err))
		}
	}()

	// 장치 정보 가져오기 및 네트워크 설정
	maxRetries := 5
	for i := 0; i < maxRetries; i++ {
		deviceInfo, err := getDeviceInfo(config.CallNo)
		if err != nil {
			logError(fmt.Sprintf("Error getting device info: %v\n", err))
			if i == maxRetries-1 {
				rebootSystem()
			}
			time.Sleep(1 * time.Minute)
			continue
		}

		setServerGPIO()

		err = setNetworkConfig(deviceInfo)
		if err != nil {
			logError(fmt.Sprintf("Error setting network config: %v\n", err))
			if i == maxRetries-1 {
				rebootSystem()
			}
			time.Sleep(1 * time.Minute)
			continue
		}

		config.ServerAddress = deviceInfo.RecIP + ":20000"
		break
	}

	for {
		if err := runClient(); err != nil {
			fmt.Printf("Error: %v\n", err)
			time.Sleep(time.Duration(config.ReconnectInterval) * time.Second)
		}
	}
}

func setupSignalHandler() {
	c := make(chan os.Signal, 1)
	signal.Notify(c, os.Interrupt, syscall.SIGTERM)
	go func() {
		<-c
		logError("\nReceived interrupt signal. Cleaning up...")
		resetAllGPIO()
		os.Exit(0)
	}()
}
func rebootSystem() {
	logInfo("Rebooting system...")
	// 실제 시스템 재부팅 코드를 여기에 추가하세요
	err := syscall.Reboot(syscall.LINUX_REBOOT_CMD_RESTART)

	if err != nil {
		logError(fmt.Sprintf("failed to reboot: %v", err))
	}
	os.Exit(0)
}
