package main

import (
	"encoding/json"
	"fmt"
	"html/template"
	"log"
	"net/http"
	"net/url"
)

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, query string, lang string) {
	// Geocode the query to get coordinates
	latitude, longitude, found, err := geocodeQuery(query)
	if err != nil {
		log.Printf("Error geocoding query: %s, error: %v", query, err)
		http.Error(w, "Failed to find location", http.StatusInternalServerError)
		return
	}

	// Use a template to serve the map page
	data := map[string]interface{}{
		"Query":     query,
		"Latitude":  latitude,
		"Longitude": longitude,
		"Found":     found,
	}

	tmpl, err := template.ParseFiles("templates/map.html")
	if err != nil {
		log.Printf("Error loading map template: %v", err)
		http.Error(w, "Internal Server Error", http.StatusInternalServerError)
		return
	}

	tmpl.Execute(w, data)
}