//go:build (linux && !android) || freebsd

package dns

import (
	"context"
	"fmt"
	"time"

	"github.com/godbus/dbus/v5"
	log "github.com/sirupsen/logrus"
)

const dbusDefaultFlag = 0

func isDbusListenerRunning(dest string, path dbus.ObjectPath) bool {
	obj, closeConn, err := getDbusObject(dest, path)
	if err != nil {
		log.Tracef("error getting dbus object: %s", err)
		return false
	}
	defer closeConn()

	ctx, cancel := context.WithTimeout(context.TODO(), 5*time.Second)
	defer cancel()

	if err = obj.CallWithContext(ctx, "org.freedesktop.DBus.Peer.Ping", 0).Store(); err != nil {
		log.Tracef("error calling dbus: %s", err)
		return false
	}

	return true
}

func getDbusObject(dest string, path dbus.ObjectPath) (dbus.BusObject, func(), error) {
	conn, err := dbus.SystemBus()
	if err != nil {
		return nil, nil, fmt.Errorf("get dbus: %w", err)
	}
	obj := conn.Object(dest, path)

	closeFunc := func() {
		closeErr := conn.Close()
		if closeErr != nil {
			log.Warnf("got an error closing dbus connection, err: %s", closeErr)
		}
	}

	return obj, closeFunc, nil
}