package main

import (
	"encoding/json"
	"fmt"
	"net/http"
	"net/url"
	"time"
)

type NominatimResponse struct {
	Lat string `json:"lat"`
	Lon string `json:"lon"`
}

func geocodeQuery(query string) (latitude, longitude string, found bool, err error) {
	// URL encode the query
	query = url.QueryEscape(query)

	// Construct the request URL
	urlString := fmt.Sprintf("https://nominatim.openstreetmap.org/search?format=json&q=%s", query)

	// Make the HTTP GET request
	resp, err := http.Get(urlString)
	if err != nil {
		return "", "", false, err
	}
	defer resp.Body.Close()

	// Read the response
	var result []NominatimResponse
	if err := json.NewDecoder(resp.Body).Decode(&result); err != nil {
		return "", "", false, err
	}

	// Check if there are any results
	if len(result) > 0 {
		latitude = result[0].Lat
		longitude = result[0].Lon
		return latitude, longitude, true, nil
	}

	return "", "", false, nil
}

func handleMapSearch(w http.ResponseWriter, settings UserSettings, query string) {
	// Start measuring the time for geocoding the query
	startTime := time.Now()

	// Geocode the query to get coordinates
	latitude, longitude, found, err := geocodeQuery(query)
	if err != nil {
		printDebug("Error geocoding query: %s, error: %v", query, err)
		http.Error(w, Translate("internal_server_error"), http.StatusInternalServerError)
		return
	}

	// Measure the elapsed time for geocoding
	elapsedTime := time.Since(startTime)

	// Prepare the data to pass to the template
	data := map[string]interface{}{
		"Query":       query,
		"Latitude":    latitude,
		"Longitude":   longitude,
		"Found":       found,
		"Fetched":     fmt.Sprintf("%.2f %s", elapsedTime.Seconds(), Translate("seconds")),
		"Theme":       settings.Theme,
		"Safe":        settings.SafeSearch,
		"IsThemeDark": settings.IsThemeDark,
	}

	// Render the template
	renderTemplate(w, "map.html", data)
}