package main

import (
	"errors"
	"fmt"
	"log"
	"net/url"
	"os"
	"regexp"
	"strconv"
	"time"

	hguclient "gomodules.avm99963.com/hgu-sipsettings-reverter/client"
)

var (
	obProxyAddrRe = regexp.MustCompile(`oa0 = "([\d\.]*)";`)
	obProxyPortRe = regexp.MustCompile(`op0 = "(\d*)";`)
	ipInterfaceRe = regexp.MustCompile(`var ifn = '([^']*)';`)
)

type OutboundProxySettings struct {
	Address     string
	Port        int
	IpInterface string
}

func GetOutboundProxySettings(client *hguclient.Client) (*OutboundProxySettings, error) {
	loggedIn, err := client.IsLoggedIn()
	if err != nil {
		return nil, err
	}
	if !loggedIn {
		log.Println("Not logged in, logging in...")
		err := client.LogIn()
		if err != nil {
			return nil, err
		}
	}
	body, err := client.Get(hguclient.URL_SIPBASIC, false)
	if err != nil {
		return nil, err
	}
	addrMatches := obProxyAddrRe.FindStringSubmatch(body)
	if len(addrMatches) < 2 {
		return nil, errors.New("Can't find outbound proxy address in settings.")
	}
	addr := addrMatches[1]
	portMatches := obProxyPortRe.FindStringSubmatch(body)
	if len(portMatches) < 2 {
		return nil, errors.New("Can't find oubound proxy port in settings.")
	}
	port, err := strconv.Atoi(portMatches[1])
	if err != nil {
		return nil, err
	}
	ipMatches := ipInterfaceRe.FindStringSubmatch(body)
	if len(ipMatches) < 2 {
		return nil, errors.New("Can't find IP interface in settings.")
	}
	ip := ipMatches[1]
	return &OutboundProxySettings{
		Address:     addr,
		Port:        port,
		IpInterface: ip,
	}, nil
}

func check(client *hguclient.Client, correctSettings *OutboundProxySettings) error {
	currentSettings, err := GetOutboundProxySettings(client)
	if err != nil {
		log.Fatalln(err)
	}
	if *currentSettings == *correctSettings {
    log.Println("Settings are ok.")
		return nil
	}
	log.Println(fmt.Sprintf("Settings are incorrect! Current settings: %v. Correct settings: %v.", currentSettings, correctSettings))
	_, err = client.Get("/voicesipstop.cmd", false)
	if err != nil {
		return errors.New(fmt.Sprintf("Couldn't stop SIP: %v", err))
	}
	eAddr := url.QueryEscape(correctSettings.Address)
	ePort := url.QueryEscape(strconv.Itoa(correctSettings.Port))
	eInt := url.QueryEscape(correctSettings.IpInterface)
	startUrl := "/voicesipstart.cmd?currentview=basic&ifName=" + eInt + "&obProxyAddr0=" + eAddr + "&obProxyPort0=" + ePort
	_, err = client.Get(startUrl, false)
	if err != nil {
		return errors.New(fmt.Sprintf("Couldn't start SIP: %v", err))
	}
	log.Println("Settings have been fixed")
	return nil
}

func mustGetEnv(name string) string {
	env, ok := os.LookupEnv(name)
	if !ok {
		log.Fatalln(fmt.Sprintf("%v environment variable must be set.", name))
	}
	return env
}

func main() {
	log.Println("Starting sip_reverter")

	endpoint := mustGetEnv("SIPREVERTER_HGU_ENDPOINT")
	password := mustGetEnv("SIPREVERTER_HGU_PASSWORD")

	address := mustGetEnv("SIPREVERTER_CONF_ADDRESS")
	portString := mustGetEnv("SIPREVERTER_CONF_PORT")
	port, err := strconv.Atoi(portString)
	if err != nil {
		log.Fatalln(fmt.Sprintf("Can't parse port: %v", err))
	}
	ipInterface := mustGetEnv("SIPREVERTER_CONF_INTERFACE")
	correctObProxySettings := &OutboundProxySettings{
		Address:     address,
		Port:        port,
		IpInterface: ipInterface,
	}

	client, err := hguclient.New(endpoint, password)
	if err != nil {
		log.Fatalln(err)
	}

	for {
		err := check(client, correctObProxySettings)
		if err != nil {
			log.Println(fmt.Sprintf("Error while checking: %v", err))
		}
		time.Sleep(90 * time.Second)
	}
}
