package app

import (
	"fmt"

	"code.tnxs.net/taxnexus/lib/api/geo/geo_client/coordinate"
	"code.tnxs.net/taxnexus/lib/api/geo/geo_models"
)

// GetCoordinate is a first class object retrieval method
func GetCoordinate(addr *Address, principal *User) (*geo_models.CoordinateBasic, error) {
	sugar.Debug("ops.getCoordinate: 📥")
	if addr == nil {
		return nil, fmt.Errorf("ops.getCoordinate: 💣 ⛔ Address cannot be nil")
	}
	if addr.ToString() == "" {
		return nil, fmt.Errorf("ops.getCoordinate: 💣 ⛔ Address cannot be empty")
	}
	sugar.Debugf("ops.getCoordinate: 📏 address: %s", addr.ToString())
	if addr.City == "" {
		return nil, fmt.Errorf("ops.getCoordinate: 💣 ⛔ City cannot be blank")
	}
	obj, ok := coordinateCache.get(addr.ToString())
	if ok {
		sugar.Debugf("ops.GetCoordiante: 👍🏻 🎯 📤")
		return obj, nil
	}
	placeName := addr.City + ", " + addr.StateCode
	if addr.StateCode == "" {
		placeName = addr.City + ", " + addr.State
	}
	coordParams := coordinate.NewGetCoordinateBasicParamsWithTimeout(getTimeout)
	theAddress := addr.ToString()
	coordParams.PlaceName = &placeName
	coordParams.Address = &theAddress
	response, geoErr := geoClient.Coordinate.GetCoordinateBasic(coordParams, principal.Auth)
	if geoErr != nil {
		return nil, fmt.Errorf("ops.getCoordinate: 💣 ⛔ failed, %s (%w)", *coordParams.Address, geoErr)
	}
	if len(response.Payload.Data) != 1 {
		return nil, fmt.Errorf("ops.getCoordinate: 💣 ⛔ one and only one coordinate record should be returned")
	}
	sugar.Debugf("ops.getCoordinate: ✅ geo records retrieved = %d", len(response.Payload.Data))
	var coord geo_models.CoordinateBasic
	for _, itm := range response.Payload.Data {
		coord = *itm
	}
	coordinateCache.put(addr.ToString(), &coord)
	sugar.Debug("ops.getCoordinate: 👍 📤")
	return &coord, nil
}
