// Code generated by winrt-go-gen. DO NOT EDIT.

//go:build windows

//nolint:all
package geolocation

import (
	"syscall"
	"unsafe"

	"git.savin.nyc/alex/go-winrt/windows/foundation"
	"github.com/go-ole/go-ole"
)

const SignatureGeolocator string = "rc(Windows.Devices.Geolocation.Geolocator;{a9c3bf62-4524-4989-8aa9-de019d2e551f})"

type PositionAccuracy int32

const (
	PositionAccuracyDefault PositionAccuracy = 0
	PositionAccuracyHigh    PositionAccuracy = 1
)

type PositionStatus int32

const (
	PositionStatusReady          PositionStatus = 0
	PositionStatusInitializing   PositionStatus = 1
	PositionStatusNoData         PositionStatus = 2
	PositionStatusDisabled       PositionStatus = 3
	PositionStatusNotInitialized PositionStatus = 4
	PositionStatusNotAvailable   PositionStatus = 5
)

type Geolocator struct {
	ole.IUnknown
}

func NewGeolocator() (*Geolocator, error) {
	inspectable, err := ole.RoActivateInstance("Windows.Devices.Geolocation.Geolocator")
	if err != nil {
		return nil, err
	}
	return (*Geolocator)(unsafe.Pointer(inspectable)), nil
}

func (impl *Geolocator) GetDesiredAccuracy() (PositionAccuracy, error) {
	itf := impl.MustQueryInterface(ole.NewGUID(GUIDiGeolocator))
	defer itf.Release()
	v := (*iGeolocator)(unsafe.Pointer(itf))
	return v.GetDesiredAccuracy()
}

func (impl *Geolocator) SetDesiredAccuracy(value PositionAccuracy) error {
	itf := impl.MustQueryInterface(ole.NewGUID(GUIDiGeolocator))
	defer itf.Release()
	v := (*iGeolocator)(unsafe.Pointer(itf))
	return v.SetDesiredAccuracy(value)
}

func (impl *Geolocator) GetMovementThreshold() (float64, error) {
	itf := impl.MustQueryInterface(ole.NewGUID(GUIDiGeolocator))
	defer itf.Release()
	v := (*iGeolocator)(unsafe.Pointer(itf))
	return v.GetMovementThreshold()
}

func (impl *Geolocator) SetMovementThreshold(value float64) error {
	itf := impl.MustQueryInterface(ole.NewGUID(GUIDiGeolocator))
	defer itf.Release()
	v := (*iGeolocator)(unsafe.Pointer(itf))
	return v.SetMovementThreshold(value)
}

func (impl *Geolocator) GetReportInterval() (uint32, error) {
	itf := impl.MustQueryInterface(ole.NewGUID(GUIDiGeolocator))
	defer itf.Release()
	v := (*iGeolocator)(unsafe.Pointer(itf))
	return v.GetReportInterval()
}

func (impl *Geolocator) SetReportInterval(value uint32) error {
	itf := impl.MustQueryInterface(ole.NewGUID(GUIDiGeolocator))
	defer itf.Release()
	v := (*iGeolocator)(unsafe.Pointer(itf))
	return v.SetReportInterval(value)
}

func (impl *Geolocator) GetLocationStatus() (PositionStatus, error) {
	itf := impl.MustQueryInterface(ole.NewGUID(GUIDiGeolocator))
	defer itf.Release()
	v := (*iGeolocator)(unsafe.Pointer(itf))
	return v.GetLocationStatus()
}

func (impl *Geolocator) GetGeopositionAsync() (*foundation.IAsyncOperation, error) {
	itf := impl.MustQueryInterface(ole.NewGUID(GUIDiGeolocator))
	defer itf.Release()
	v := (*iGeolocator)(unsafe.Pointer(itf))
	return v.GetGeopositionAsync()
}

func (impl *Geolocator) GetGeopositionAsyncWithAgeAndTimeout(maximumAge int64, timeout int64) (*foundation.IAsyncOperation, error) {
	itf := impl.MustQueryInterface(ole.NewGUID(GUIDiGeolocator))
	defer itf.Release()
	v := (*iGeolocator)(unsafe.Pointer(itf))
	return v.GetGeopositionAsyncWithAgeAndTimeout(maximumAge, timeout)
}

func (impl *Geolocator) AddPositionChanged(handler *foundation.TypedEventHandler) (foundation.EventRegistrationToken, error) {
	itf := impl.MustQueryInterface(ole.NewGUID(GUIDiGeolocator))
	defer itf.Release()
	v := (*iGeolocator)(unsafe.Pointer(itf))
	return v.AddPositionChanged(handler)
}

func (impl *Geolocator) RemovePositionChanged(token foundation.EventRegistrationToken) error {
	itf := impl.MustQueryInterface(ole.NewGUID(GUIDiGeolocator))
	defer itf.Release()
	v := (*iGeolocator)(unsafe.Pointer(itf))
	return v.RemovePositionChanged(token)
}

func (impl *Geolocator) AddStatusChanged(handler *foundation.TypedEventHandler) (foundation.EventRegistrationToken, error) {
	itf := impl.MustQueryInterface(ole.NewGUID(GUIDiGeolocator))
	defer itf.Release()
	v := (*iGeolocator)(unsafe.Pointer(itf))
	return v.AddStatusChanged(handler)
}

func (impl *Geolocator) RemoveStatusChanged(token foundation.EventRegistrationToken) error {
	itf := impl.MustQueryInterface(ole.NewGUID(GUIDiGeolocator))
	defer itf.Release()
	v := (*iGeolocator)(unsafe.Pointer(itf))
	return v.RemoveStatusChanged(token)
}

func (impl *Geolocator) GetDesiredAccuracyInMeters() (*foundation.IReference, error) {
	itf := impl.MustQueryInterface(ole.NewGUID(GUIDiGeolocatorWithScalarAccuracy))
	defer itf.Release()
	v := (*iGeolocatorWithScalarAccuracy)(unsafe.Pointer(itf))
	return v.GetDesiredAccuracyInMeters()
}

func (impl *Geolocator) SetDesiredAccuracyInMeters(value *foundation.IReference) error {
	itf := impl.MustQueryInterface(ole.NewGUID(GUIDiGeolocatorWithScalarAccuracy))
	defer itf.Release()
	v := (*iGeolocatorWithScalarAccuracy)(unsafe.Pointer(itf))
	return v.SetDesiredAccuracyInMeters(value)
}

func (impl *Geolocator) AllowFallbackToConsentlessPositions() error {
	itf := impl.MustQueryInterface(ole.NewGUID(GUIDiGeolocator2))
	defer itf.Release()
	v := (*iGeolocator2)(unsafe.Pointer(itf))
	return v.AllowFallbackToConsentlessPositions()
}

const GUIDiGeolocator string = "a9c3bf62-4524-4989-8aa9-de019d2e551f"
const SignatureiGeolocator string = "{a9c3bf62-4524-4989-8aa9-de019d2e551f}"

type iGeolocator struct {
	ole.IInspectable
}

type iGeolocatorVtbl struct {
	ole.IInspectableVtbl

	GetDesiredAccuracy                   uintptr
	SetDesiredAccuracy                   uintptr
	GetMovementThreshold                 uintptr
	SetMovementThreshold                 uintptr
	GetReportInterval                    uintptr
	SetReportInterval                    uintptr
	GetLocationStatus                    uintptr
	GetGeopositionAsync                  uintptr
	GetGeopositionAsyncWithAgeAndTimeout uintptr
	AddPositionChanged                   uintptr
	RemovePositionChanged                uintptr
	AddStatusChanged                     uintptr
	RemoveStatusChanged                  uintptr
}

func (v *iGeolocator) VTable() *iGeolocatorVtbl {
	return (*iGeolocatorVtbl)(unsafe.Pointer(v.RawVTable))
}

func (v *iGeolocator) GetDesiredAccuracy() (PositionAccuracy, error) {
	var out PositionAccuracy
	hr, _, _ := syscall.SyscallN(
		v.VTable().GetDesiredAccuracy,
		uintptr(unsafe.Pointer(v)),    // this
		uintptr(unsafe.Pointer(&out)), // out PositionAccuracy
	)

	if hr != 0 {
		return PositionAccuracyDefault, ole.NewError(hr)
	}

	return out, nil
}

func (v *iGeolocator) SetDesiredAccuracy(value PositionAccuracy) error {
	hr, _, _ := syscall.SyscallN(
		v.VTable().SetDesiredAccuracy,
		uintptr(unsafe.Pointer(v)), // this
		uintptr(value),             // in PositionAccuracy
	)

	if hr != 0 {
		return ole.NewError(hr)
	}

	return nil
}

func (v *iGeolocator) GetMovementThreshold() (float64, error) {
	var out float64
	hr, _, _ := syscall.SyscallN(
		v.VTable().GetMovementThreshold,
		uintptr(unsafe.Pointer(v)),    // this
		uintptr(unsafe.Pointer(&out)), // out float64
	)

	if hr != 0 {
		return 0.0, ole.NewError(hr)
	}

	return out, nil
}

func (v *iGeolocator) SetMovementThreshold(value float64) error {
	hr, _, _ := syscall.SyscallN(
		v.VTable().SetMovementThreshold,
		uintptr(unsafe.Pointer(v)), // this
		uintptr(value),             // in float64
	)

	if hr != 0 {
		return ole.NewError(hr)
	}

	return nil
}

func (v *iGeolocator) GetReportInterval() (uint32, error) {
	var out uint32
	hr, _, _ := syscall.SyscallN(
		v.VTable().GetReportInterval,
		uintptr(unsafe.Pointer(v)),    // this
		uintptr(unsafe.Pointer(&out)), // out uint32
	)

	if hr != 0 {
		return 0, ole.NewError(hr)
	}

	return out, nil
}

func (v *iGeolocator) SetReportInterval(value uint32) error {
	hr, _, _ := syscall.SyscallN(
		v.VTable().SetReportInterval,
		uintptr(unsafe.Pointer(v)), // this
		uintptr(value),             // in uint32
	)

	if hr != 0 {
		return ole.NewError(hr)
	}

	return nil
}

func (v *iGeolocator) GetLocationStatus() (PositionStatus, error) {
	var out PositionStatus
	hr, _, _ := syscall.SyscallN(
		v.VTable().GetLocationStatus,
		uintptr(unsafe.Pointer(v)),    // this
		uintptr(unsafe.Pointer(&out)), // out PositionStatus
	)

	if hr != 0 {
		return PositionStatusReady, ole.NewError(hr)
	}

	return out, nil
}

func (v *iGeolocator) GetGeopositionAsync() (*foundation.IAsyncOperation, error) {
	var out *foundation.IAsyncOperation
	hr, _, _ := syscall.SyscallN(
		v.VTable().GetGeopositionAsync,
		uintptr(unsafe.Pointer(v)),    // this
		uintptr(unsafe.Pointer(&out)), // out foundation.IAsyncOperation
	)

	if hr != 0 {
		return nil, ole.NewError(hr)
	}

	return out, nil
}

func (v *iGeolocator) GetGeopositionAsyncWithAgeAndTimeout(maximumAge int64, timeout int64) (*foundation.IAsyncOperation, error) {
	var out *foundation.IAsyncOperation
	hr, _, _ := syscall.SyscallN(
		v.VTable().GetGeopositionAsyncWithAgeAndTimeout,
		uintptr(unsafe.Pointer(v)),           // this
		uintptr(unsafe.Pointer(&maximumAge)), // in int64 (TimeSpan)
		uintptr(unsafe.Pointer(&timeout)),    // in int64 (TimeSpan)
		uintptr(unsafe.Pointer(&out)),        // out foundation.IAsyncOperation
	)

	if hr != 0 {
		return nil, ole.NewError(hr)
	}

	return out, nil
}

func (v *iGeolocator) AddPositionChanged(handler *foundation.TypedEventHandler) (foundation.EventRegistrationToken, error) {
	var out foundation.EventRegistrationToken
	hr, _, _ := syscall.SyscallN(
		v.VTable().AddPositionChanged,
		uintptr(unsafe.Pointer(v)),       // this
		uintptr(unsafe.Pointer(handler)), // in foundation.TypedEventHandler
		uintptr(unsafe.Pointer(&out)),    // out foundation.EventRegistrationToken
	)

	if hr != 0 {
		return foundation.EventRegistrationToken{}, ole.NewError(hr)
	}

	return out, nil
}

func (v *iGeolocator) RemovePositionChanged(token foundation.EventRegistrationToken) error {
	hr, _, _ := syscall.SyscallN(
		v.VTable().RemovePositionChanged,
		uintptr(unsafe.Pointer(v)),      // this
		uintptr(unsafe.Pointer(&token)), // in foundation.EventRegistrationToken
	)

	if hr != 0 {
		return ole.NewError(hr)
	}

	return nil
}

func (v *iGeolocator) AddStatusChanged(handler *foundation.TypedEventHandler) (foundation.EventRegistrationToken, error) {
	var out foundation.EventRegistrationToken
	hr, _, _ := syscall.SyscallN(
		v.VTable().AddStatusChanged,
		uintptr(unsafe.Pointer(v)),       // this
		uintptr(unsafe.Pointer(handler)), // in foundation.TypedEventHandler
		uintptr(unsafe.Pointer(&out)),    // out foundation.EventRegistrationToken
	)

	if hr != 0 {
		return foundation.EventRegistrationToken{}, ole.NewError(hr)
	}

	return out, nil
}

func (v *iGeolocator) RemoveStatusChanged(token foundation.EventRegistrationToken) error {
	hr, _, _ := syscall.SyscallN(
		v.VTable().RemoveStatusChanged,
		uintptr(unsafe.Pointer(v)),      // this
		uintptr(unsafe.Pointer(&token)), // in foundation.EventRegistrationToken
	)

	if hr != 0 {
		return ole.NewError(hr)
	}

	return nil
}

const GUIDiGeolocatorWithScalarAccuracy string = "96f5d3c1-b80f-460a-994d-a96c47a51aa4"
const SignatureiGeolocatorWithScalarAccuracy string = "{96f5d3c1-b80f-460a-994d-a96c47a51aa4}"

type iGeolocatorWithScalarAccuracy struct {
	ole.IInspectable
}

type iGeolocatorWithScalarAccuracyVtbl struct {
	ole.IInspectableVtbl

	GetDesiredAccuracyInMeters uintptr
	SetDesiredAccuracyInMeters uintptr
}

func (v *iGeolocatorWithScalarAccuracy) VTable() *iGeolocatorWithScalarAccuracyVtbl {
	return (*iGeolocatorWithScalarAccuracyVtbl)(unsafe.Pointer(v.RawVTable))
}

func (v *iGeolocatorWithScalarAccuracy) GetDesiredAccuracyInMeters() (*foundation.IReference, error) {
	var out *foundation.IReference
	hr, _, _ := syscall.SyscallN(
		v.VTable().GetDesiredAccuracyInMeters,
		uintptr(unsafe.Pointer(v)),    // this
		uintptr(unsafe.Pointer(&out)), // out foundation.IReference
	)

	if hr != 0 {
		return nil, ole.NewError(hr)
	}

	return out, nil
}

func (v *iGeolocatorWithScalarAccuracy) SetDesiredAccuracyInMeters(value *foundation.IReference) error {
	hr, _, _ := syscall.SyscallN(
		v.VTable().SetDesiredAccuracyInMeters,
		uintptr(unsafe.Pointer(v)),     // this
		uintptr(unsafe.Pointer(value)), // in foundation.IReference
	)

	if hr != 0 {
		return ole.NewError(hr)
	}

	return nil
}

const GUIDiGeolocator2 string = "d1b42e6d-8891-43b4-ad36-27c6fe9a97b1"
const SignatureiGeolocator2 string = "{d1b42e6d-8891-43b4-ad36-27c6fe9a97b1}"

type iGeolocator2 struct {
	ole.IInspectable
}

type iGeolocator2Vtbl struct {
	ole.IInspectableVtbl

	AllowFallbackToConsentlessPositions uintptr
}

func (v *iGeolocator2) VTable() *iGeolocator2Vtbl {
	return (*iGeolocator2Vtbl)(unsafe.Pointer(v.RawVTable))
}

func (v *iGeolocator2) AllowFallbackToConsentlessPositions() error {
	hr, _, _ := syscall.SyscallN(
		v.VTable().AllowFallbackToConsentlessPositions,
		uintptr(unsafe.Pointer(v)), // this
	)

	if hr != 0 {
		return ole.NewError(hr)
	}

	return nil
}

const GUIDiGeolocatorStatics string = "9a8e7571-2df5-4591-9f87-eb5fd894e9b7"
const SignatureiGeolocatorStatics string = "{9a8e7571-2df5-4591-9f87-eb5fd894e9b7}"

type iGeolocatorStatics struct {
	ole.IInspectable
}

type iGeolocatorStaticsVtbl struct {
	ole.IInspectableVtbl

	GeolocatorRequestAccessAsync                     uintptr
	GeolocatorGetGeopositionHistoryAsync             uintptr
	GeolocatorGetGeopositionHistoryWithDurationAsync uintptr
}

func (v *iGeolocatorStatics) VTable() *iGeolocatorStaticsVtbl {
	return (*iGeolocatorStaticsVtbl)(unsafe.Pointer(v.RawVTable))
}

func GeolocatorRequestAccessAsync() (*foundation.IAsyncOperation, error) {
	inspectable, err := ole.RoGetActivationFactory("Windows.Devices.Geolocation.Geolocator", ole.NewGUID(GUIDiGeolocatorStatics))
	if err != nil {
		return nil, err
	}
	v := (*iGeolocatorStatics)(unsafe.Pointer(inspectable))

	var out *foundation.IAsyncOperation
	hr, _, _ := syscall.SyscallN(
		v.VTable().GeolocatorRequestAccessAsync,
		uintptr(unsafe.Pointer(v)),    // this
		uintptr(unsafe.Pointer(&out)), // out foundation.IAsyncOperation
	)

	if hr != 0 {
		return nil, ole.NewError(hr)
	}

	return out, nil
}

func GeolocatorGetGeopositionHistoryAsync(startTime foundation.DateTime) (*foundation.IAsyncOperation, error) {
	inspectable, err := ole.RoGetActivationFactory("Windows.Devices.Geolocation.Geolocator", ole.NewGUID(GUIDiGeolocatorStatics))
	if err != nil {
		return nil, err
	}
	v := (*iGeolocatorStatics)(unsafe.Pointer(inspectable))

	var out *foundation.IAsyncOperation
	hr, _, _ := syscall.SyscallN(
		v.VTable().GeolocatorGetGeopositionHistoryAsync,
		uintptr(unsafe.Pointer(v)),          // this
		uintptr(unsafe.Pointer(&startTime)), // in foundation.DateTime
		uintptr(unsafe.Pointer(&out)),       // out foundation.IAsyncOperation
	)

	if hr != 0 {
		return nil, ole.NewError(hr)
	}

	return out, nil
}

func GeolocatorGetGeopositionHistoryWithDurationAsync(startTime foundation.DateTime, duration int64) (*foundation.IAsyncOperation, error) {
	inspectable, err := ole.RoGetActivationFactory("Windows.Devices.Geolocation.Geolocator", ole.NewGUID(GUIDiGeolocatorStatics))
	if err != nil {
		return nil, err
	}
	v := (*iGeolocatorStatics)(unsafe.Pointer(inspectable))

	var out *foundation.IAsyncOperation
	hr, _, _ := syscall.SyscallN(
		v.VTable().GeolocatorGetGeopositionHistoryWithDurationAsync,
		uintptr(unsafe.Pointer(v)),          // this
		uintptr(unsafe.Pointer(&startTime)), // in foundation.DateTime
		uintptr(unsafe.Pointer(&duration)),  // in int64 (TimeSpan)
		uintptr(unsafe.Pointer(&out)),       // out foundation.IAsyncOperation
	)

	if hr != 0 {
		return nil, ole.NewError(hr)
	}

	return out, nil
}

const GUIDiGeolocatorStatics2 string = "993011a2-fa1c-4631-a71d-0dbeb1250d9c"
const SignatureiGeolocatorStatics2 string = "{993011a2-fa1c-4631-a71d-0dbeb1250d9c}"

type iGeolocatorStatics2 struct {
	ole.IInspectable
}

type iGeolocatorStatics2Vtbl struct {
	ole.IInspectableVtbl

	GeolocatorGetIsDefaultGeopositionRecommended uintptr
	GeolocatorSetDefaultGeoposition              uintptr
	GeolocatorGetDefaultGeoposition              uintptr
}

func (v *iGeolocatorStatics2) VTable() *iGeolocatorStatics2Vtbl {
	return (*iGeolocatorStatics2Vtbl)(unsafe.Pointer(v.RawVTable))
}

func GeolocatorGetIsDefaultGeopositionRecommended() (bool, error) {
	inspectable, err := ole.RoGetActivationFactory("Windows.Devices.Geolocation.Geolocator", ole.NewGUID(GUIDiGeolocatorStatics2))
	if err != nil {
		return false, err
	}
	v := (*iGeolocatorStatics2)(unsafe.Pointer(inspectable))

	var out bool
	hr, _, _ := syscall.SyscallN(
		v.VTable().GeolocatorGetIsDefaultGeopositionRecommended,
		uintptr(unsafe.Pointer(v)),    // this
		uintptr(unsafe.Pointer(&out)), // out bool
	)

	if hr != 0 {
		return false, ole.NewError(hr)
	}

	return out, nil
}

func GeolocatorSetDefaultGeoposition(value *foundation.IReference) error {
	inspectable, err := ole.RoGetActivationFactory("Windows.Devices.Geolocation.Geolocator", ole.NewGUID(GUIDiGeolocatorStatics2))
	if err != nil {
		return err
	}
	v := (*iGeolocatorStatics2)(unsafe.Pointer(inspectable))

	hr, _, _ := syscall.SyscallN(
		v.VTable().GeolocatorSetDefaultGeoposition,
		uintptr(unsafe.Pointer(v)),     // this
		uintptr(unsafe.Pointer(value)), // in foundation.IReference
	)

	if hr != 0 {
		return ole.NewError(hr)
	}

	return nil
}

func GeolocatorGetDefaultGeoposition() (*foundation.IReference, error) {
	inspectable, err := ole.RoGetActivationFactory("Windows.Devices.Geolocation.Geolocator", ole.NewGUID(GUIDiGeolocatorStatics2))
	if err != nil {
		return nil, err
	}
	v := (*iGeolocatorStatics2)(unsafe.Pointer(inspectable))

	var out *foundation.IReference
	hr, _, _ := syscall.SyscallN(
		v.VTable().GeolocatorGetDefaultGeoposition,
		uintptr(unsafe.Pointer(v)),    // this
		uintptr(unsafe.Pointer(&out)), // out foundation.IReference
	)

	if hr != 0 {
		return nil, ole.NewError(hr)
	}

	return out, nil
}
