const pool = require('../db/connection');
const axios = require('axios');
const BANXICO_SERIE = 'SF43718';

function formatDate(date) {
  const d = new Date(date);
  const year = d.getFullYear();
  const month = String(d.getMonth() + 1).padStart(2, '0');
  const day = String(d.getDate()).padStart(2, '0');
  return `${year}-${month}-${day}`;
}

function mapBanxicoData(bmxJson) {
  const serie = bmxJson.bmx.series[0];
  return serie.datos.map(item => {
    const [day, month, year] = item.fecha.split('/');
    return {
      fecha: `${year}-${month.padStart(2, '0')}-${day.padStart(2, '0')}`,
      valor: parseFloat(item.dato)
    };
  });
}

const consultExchange = async (req, res) => {
  try {
    const token = process.env.BANXICO_TOKEN;
    if (!token) return res.status(400).json({ error: 'No se encontró token de Banxico' });

    const today = formatDate(new Date());
    const url = `https://www.banxico.org.mx/SieAPIRest/service/v1/series/${BANXICO_SERIE}/datos/2021-11-07/${today}`;

    const response = await axios.get(url, {
      headers: { 'Bmx-Token': token, 'Accept': 'application/json' }
    });

    const datos = mapBanxicoData(response.data);

    if (datos.length === 0) return res.status(404).json({ message: 'No hay datos para la fecha actual.' });

    let savedCount = 0;
    for (const item of datos) {
      const result = await pool.query(
        `INSERT INTO exchangetype(fecha, valor)
         VALUES ($1, $2)
         ON CONFLICT (fecha) DO NOTHING`,
        [item.fecha, item.valor]
      );
      if (result.rowCount > 0) savedCount++;
    }

    const message = savedCount > 0
      ? 'Datos de tipo de cambio guardados correctamente'
      : 'No se pudieron guardar los datos (quizá ya existían)';

    res.json({ message, savedCount, datos });

  } catch (err) {
    console.error('Error consultExchange:', err.response ? err.response.data : err);
    res.status(500).json({ error: 'Error interno al consultar exchange' });
  }
};

const getExchange = async (req, res) => {
  try {
    const result = await pool.query('SELECT * FROM getexange()');
    const units = result.rows.map(u => ({
      id: u.id_exchange,
      fecha: u.fecha,
      dato: parseFloat(u.dato)
    }));
    res.json({
      message: "Se obtuvieron los tipos de cambio.",
      request: units
    });

  } catch (error) {
    console.error(error);
    res.status(500).json({ message: 'No se pudo recuperar los tipos de cambio.' });
  }
};

module.exports = { consultExchange, getExchange };
