const axios = require('axios');
const pool  = require('../config/db');

const NOMINATIM = 'https://nominatim.openstreetmap.org/search';

/**
 * Geocodifica una dirección usando Nominatim (OpenStreetMap).
 * Devuelve { lat, lng, coloniaNombre } o null si no encuentra nada.
 */
async function geocodificar(direccion) {
  const { data } = await axios.get(NOMINATIM, {
    params: {
      q:              `${direccion}, Celaya, Guanajuato, México`,
      format:         'json',
      limit:          1,
      addressdetails: 1,
    },
    headers: {
      // Nominatim requiere un User-Agent identificable
      'User-Agent': 'RecoleccionApp-Hackathon/1.0',
    },
    timeout: 8000,
  });

  if (!data || data.length === 0) return null;

  const resultado = data[0];
  const addr      = resultado.address || {};

  // Nominatim devuelve la colonia en distintos campos según la zona
  const coloniaNombre =
    addr.suburb       ||
    addr.neighbourhood||
    addr.quarter      ||
    addr.city_district||
    null;

  return {
    lat:           parseFloat(resultado.lat),
    lng:           parseFloat(resultado.lon),
    coloniaNombre,
  };
}

/**
 * Busca la colonia en la BD por nombre (coincidencia parcial, sin importar
 * mayúsculas). Devuelve { coloniaId, rutaId, routeId } o null.
 */
async function buscarColonia(nombre) {
  if (!nombre) return null;

  const { rows } = await pool.query(
    `SELECT c.id AS colonia_id, c.ruta_id, r.route_id
     FROM colonias c
     JOIN rutas r ON r.id = c.ruta_id
     WHERE LOWER(c.nombre) = LOWER($1)
        OR LOWER(c.nombre) LIKE LOWER($2)
     LIMIT 1`,
    [nombre, `%${nombre}%`]
  );

  if (rows.length === 0) return null;

  return {
    coloniaId: rows[0].colonia_id,
    rutaId:    rows[0].ruta_id,
    routeId:   rows[0].route_id,   // ej: "RUTA-01"
  };
}

module.exports = { geocodificar, buscarColonia };
