// Copyright (c) 2023 Joshua Rich <joshua.rich@gmail.com>
//
// This software is released under the MIT License.
// https://opensource.org/licenses/MIT

package tracker

import (
	"context"

	"github.com/joshuar/go-hass-agent/internal/hass"
	"github.com/joshuar/go-hass-agent/internal/hass/api"
	"github.com/rs/zerolog/log"
)

// LocationUpdate represents a location update from a platform/device. It
// provides a bridge between the platform/device specific location info and Home
// Assistant.
type Location interface {
	Gps() []float64
	GpsAccuracy() int
	Battery() int
	Speed() int
	Altitude() int
	Course() int
	VerticalAccuracy() int
}

// marshalLocationUpdate will take a LocationUpdate and marshal it into a
// hass.LocationUpdate that can be sent as a request to HA
func marshalLocationUpdate(l Location) *hass.LocationUpdate {
	return &hass.LocationUpdate{
		Gps:              l.Gps(),
		GpsAccuracy:      l.GpsAccuracy(),
		Battery:          l.Battery(),
		Speed:            l.Speed(),
		Altitude:         l.Altitude(),
		Course:           l.Course(),
		VerticalAccuracy: l.VerticalAccuracy(),
	}
}

func updateLocation(ctx context.Context, l Location) {
	response := <-api.ExecuteRequest(ctx, marshalLocationUpdate(l))
	switch r := response.(type) {
	case []byte:
		log.Debug().Msg("Location Updated.")
	case error:
		log.Warn().Err(r).Msg("Failed to update location.")
	default:
		log.Warn().Msgf("Unknown response type %T", r)
	}
}