final
This commit is contained in:
66
internal/domain/final_answer.go
Normal file
66
internal/domain/final_answer.go
Normal file
@@ -0,0 +1,66 @@
|
||||
package domain
|
||||
|
||||
// FinalAnswer represents the final answer for the task
|
||||
type FinalAnswer struct {
|
||||
APIKey string `json:"apikey"`
|
||||
Task string `json:"task"`
|
||||
Answer AnswerDetail `json:"answer"`
|
||||
}
|
||||
|
||||
// AnswerDetail contains the person and power plant details
|
||||
type AnswerDetail struct {
|
||||
Name string `json:"name"`
|
||||
Surname string `json:"surname"`
|
||||
AccessLevel int `json:"accessLevel"`
|
||||
PowerPlant string `json:"powerPlant"`
|
||||
}
|
||||
|
||||
// FindClosestPowerPlant finds the power plant closest to any person
|
||||
// Returns the person, power plant, and distance
|
||||
func FindClosestPowerPlant(personDataMap map[string]*PersonData, powerPlants []Location, plantsData *PowerPlantsData) (*PersonData, *Location, float64, string) {
|
||||
var closestPerson *PersonData
|
||||
var closestPlant *Location
|
||||
minDistance := 1e10
|
||||
var powerPlantCode string
|
||||
|
||||
for _, personData := range personDataMap {
|
||||
if len(personData.Locations) == 0 {
|
||||
continue
|
||||
}
|
||||
|
||||
// Use first location (primary)
|
||||
personLoc := personData.Locations[0]
|
||||
|
||||
for _, plant := range powerPlants {
|
||||
distance := Haversine(
|
||||
personLoc.Latitude,
|
||||
personLoc.Longitude,
|
||||
plant.Latitude,
|
||||
plant.Longitude,
|
||||
)
|
||||
|
||||
// If distance is smaller, or same distance but higher access level
|
||||
if distance < minDistance {
|
||||
minDistance = distance
|
||||
closestPerson = personData
|
||||
closestPlant = &plant
|
||||
|
||||
// Get power plant code from plantsData
|
||||
if info, ok := plantsData.PowerPlants[plant.Name]; ok {
|
||||
powerPlantCode = info.Code
|
||||
}
|
||||
} else if distance == minDistance && closestPerson != nil && personData.AccessLevel > closestPerson.AccessLevel {
|
||||
// Same distance, but higher access level
|
||||
closestPerson = personData
|
||||
closestPlant = &plant
|
||||
|
||||
// Get power plant code from plantsData
|
||||
if info, ok := plantsData.PowerPlants[plant.Name]; ok {
|
||||
powerPlantCode = info.Code
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return closestPerson, closestPlant, minDistance, powerPlantCode
|
||||
}
|
||||
Reference in New Issue
Block a user