/**
 * Copyright (c) 2024-2026 Тарабанов Александр Викторович
 * All rights reserved.
 * 
 * This software is proprietary and confidential.
 * Unauthorized copying, modification, or distribution is prohibited.
 * 
 * For licensing inquiries: info@hb3-accelerator.com
 * Website: https://hb3-accelerator.com
 * GitHub: https://github.com/VC-HB3-Accelerator
 */

    // backend/routes/geocoding.js
    const express = require('express');
    const router = express.Router();
    const axios = require('axios'); // Убедитесь, что axios установлен на бэкенде
    const logger = require('../utils/logger'); // Если используете логгер

    /**
     * @swagger
     * tags:
     *   name: Geocoding
     *   description: Прокси для сервисов геокодирования (например, Nominatim)
     */

    /**
     * @swagger
     * /api/geocoding/nominatim-search:
     *   get:
     *     summary: Проксирует запрос к Nominatim API (search)
     *     tags: [Geocoding]
     *     description: Перенаправляет GET запрос со всеми его query параметрами к https://nominatim.openstreetmap.org/search. Это необходимо для обхода CORS ограничений в браузере.
     *     parameters:
     *       - in: query
     *         name: q
     *         schema:
     *           type: string
     *         required: true
     *         description: Строка адреса для поиска.
     *       - in: query
     *         name: format
     *         schema:
     *           type: string
     *         required: true
     *         description: Формат ответа (например, jsonv2).
     *       - in: query
     *         name: addressdetails
     *         schema:
     *           type: integer
     *           enum: [0, 1]
     *         description: Включить детализированный адрес (0 или 1).
     *       - in: query
     *         name: limit
     *         schema:
     *           type: integer
     *         description: Максимальное количество возвращаемых результатов.
     *       # Можно добавить сюда и другие параметры Nominatim API по мере необходимости
     *     responses:
     *       200:
     *         description: Успешный ответ от Nominatim.
     *         content:
     *           application/json:
     *             schema:
     *               type: object # Или array, в зависимости от ответа Nominatim
     *       500:
     *         description: Ошибка при запросе к Nominatim или внутренняя ошибка сервера.
     */
    router.get('/nominatim-search', async (req, res) => {
      try {
        // Формируем URL для Nominatim, используя все query параметры из исходного запроса
        const queryParams = new URLSearchParams(req.query);
        const nominatimUrl = `https://nominatim.openstreetmap.org/search?${queryParams.toString()}`;

        if (logger && typeof logger.info === 'function') {
        logger.info(`[Geocoding] Proxying request to Nominatim: ${nominatimUrl}`);
        } else {
            console.log(`[Geocoding] Proxying request to Nominatim: ${nominatimUrl}`);
        }

        const nominatimResponse = await axios.get(nominatimUrl);
        
        res.json(nominatimResponse.data);

      } catch (error) {
        let errorMessage = error.message;
        let errorStatus = 500;
        let errorDetails = null;

        if (error.response) {
            // Ошибка пришла от Nominatim (или сети)
            errorMessage = error.response.data?.message || error.response.statusText || 'Error fetching data from Nominatim';
            errorStatus = error.response.status || 500;
            errorDetails = error.response.data;
        } else if (error.request) {
            // Запрос был сделан, но ответ не получен
            errorMessage = 'No response received from Nominatim';
        }
        // Иначе это ошибка настройки axios или другая внутренняя ошибка

        if (logger && typeof logger.error === 'function') {
            logger.error(`[Geocoding] Error proxying to Nominatim: ${errorMessage}`, { status: errorStatus, details: errorDetails, query: req.query });
        } else {
            console.error(`[Geocoding] Error proxying to Nominatim: ${errorMessage}`, { status: errorStatus, details: errorDetails, query: req.query });
        }

        res.status(errorStatus).json({ 
          message: 'Error processing geocoding request', 
          details: errorDetails || errorMessage
        });
      }
    });

    module.exports = router;