package events

import (
	"encoding/hex"
	"fmt"
	"log"
	"os"

	"github.com/denisbrodbeck/machineid"
	"gopkg.in/ini.v1"
	"libvirt.org/go/libvirt"
)

func Config() (*ini.File, error) {
	return ini.Load("/etc/deevirt/config.ini")
}

var ClusterID = func() string {
	config, _ := Config()
	return config.Section("").Key("id").String()
}

var MachineID = func() string {
	id, err := machineid.ID()
	if err != nil {
		log.Fatal(err)
	}
	u, _ := hex.DecodeString(id)
	return fmt.Sprintf("%x-%x-%x-%x-%x\n", u[:4], u[4:6], u[6:8], u[8:10], u[10:])
}

func agentLifecycle(c *libvirt.Connect, d *libvirt.Domain, event *libvirt.DomainEventAgentLifecycle) {
	println(event.State)
	println(event.Reason)

}

func graphics(c *libvirt.Connect, d *libvirt.Domain, event *libvirt.DomainEventGraphics) {
	println(event.String())
}

func reboot(c *libvirt.Connect, d *libvirt.Domain) {

}

func watchdog(c *libvirt.Connect, d *libvirt.Domain, event *libvirt.DomainEventWatchdog) {
	println(event.String())
}

func Server() {
	err := libvirt.EventRegisterDefaultImpl()
	if err != nil {
		log.Fatalf("Échec d'EventRegisterDefaultImpl: %v", err)
		os.Exit(0)
	}

	conn, err := libvirt.NewConnect("qemu:///system")
	if err != nil {
		log.Println("Connexion Error")
	}
	defer conn.Close()

	conn.SetKeepAlive(5, 3)

	conn.DomainEventAgentLifecycleRegister(nil, agentLifecycle)
	conn.DomainEventGraphicsRegister(nil, graphics)
	conn.DomainEventLifecycleRegister(nil, Lifecyle)
	conn.DomainEventRebootRegister(nil, reboot)
	conn.DomainEventWatchdogRegister(nil, watchdog)

	for {
		libvirt.EventRunDefaultImpl()
	}
}