'use strict';
const metasSvc = require('../services/metasService');
const { localDateStr, localYear, localMonth } = require('../utils/localDate');
const logger   = require('../utils/logger');
const { db }   = require('../utils/dbName');

function parseMoney(val) {
  if (val === undefined || val === null || val === '') return null;
  const n = parseFloat(val);
  if (isNaN(n) || n < 0) return null;
  return Math.round(n * 100) / 100; 
}

async function getMetas(req, res, next) {
  try {
    const metas = await metasSvc.getMetas();

    
    let ventasActuales = { venta_hoy: 0, venta_mes_actual: 0, venta_anio_actual: 0 };
    try {
      const { getPool } = require('../db');
      const pool = await getPool();
      const hoy  = localDateStr();
      const anio = localYear();
      const mes  = localMonth();
      const { sql: sqlT } = require('../db');
      const req2 = pool.request();
      req2.input('mc_hoy',  sqlT.Date, hoy);
      req2.input('mc_anio', sqlT.Int,  anio);
      req2.input('mc_mes',  sqlT.Int,  mes);
      const r = await req2.query(`
        SELECT
          -- BUG-FIX: venta_hoy incluye tempcheques recién pagados sin doble conteo
          ROUND(ISNULL((
            SELECT SUM(u.total) FROM (
              SELECT folio, total FROM ${db()}cheques
              WHERE CAST(fecha AS DATE) = @mc_hoy AND cancelado = 0 AND pagado = 1 AND total > 0
              UNION
              SELECT tc.folio, tc.total FROM ${db()}tempcheques tc
              WHERE CAST(tc.fecha AS DATE) = @mc_hoy
                AND tc.cancelado = 0 AND tc.pagado = 1 AND tc.total > 0
                AND NOT EXISTS (
                  SELECT 1 FROM ${db()}cheques ch
                  WHERE ch.folio = tc.folio
                    AND CAST(ch.fecha AS DATE) = @mc_hoy
                    AND ch.cancelado = 0 AND ch.pagado = 1
                )
            ) u
          ), 0), 2) AS venta_hoy,
          ROUND(SUM(CASE WHEN MONTH(fecha)=@mc_mes AND YEAR(fecha)=@mc_anio THEN total ELSE 0 END),2) AS venta_mes_actual,
          ROUND(SUM(CASE WHEN YEAR(fecha)=@mc_anio THEN total ELSE 0 END),2) AS venta_anio_actual
        FROM ${db()}cheques
        WHERE cancelado=0 AND pagado=1 AND YEAR(fecha)=@mc_anio
      `);
      ventasActuales = r.recordset[0];
    } catch (e) {
      
      logger.warn('⚠️  No se pudieron obtener ventas actuales para avance:', { message: e.message });
    }

    res.json({ ok: true, data: { ...metas, ...ventasActuales } });
  } catch (err) { next(err); }
}

async function saveMetas(req, res, next) {
  try {
    const md = parseMoney(req.body.meta_diaria);
    const mm = parseMoney(req.body.meta_mensual);
    const ma = parseMoney(req.body.meta_anual);

    if (md === null || mm === null || ma === null) {
      return res.status(400).json({
        ok: false,
        error: 'Los campos meta_diaria, meta_mensual y meta_anual son requeridos y deben ser números ≥ 0.',
      });
    }

    
    if (md > 0 && mm > 0 && md * 30 > mm) {
      return res.status(400).json({
        ok: false,
        error: `La meta diaria (${md}) multiplicada por 30 días (${md * 30}) supera la meta mensual (${mm}). Revisa los valores.`,
      });
    }
    if (mm > 0 && ma > 0 && mm * 12 > ma) {
      return res.status(400).json({
        ok: false,
        error: `La meta mensual (${mm}) multiplicada por 12 meses (${mm * 12}) supera la meta anual (${ma}). Revisa los valores.`,
      });
    }

    const data = await metasSvc.saveMetas(md, mm, ma);
    res.json({ ok: true, mensaje: 'Metas guardadas correctamente', data });
  } catch (err) { next(err); }
}

module.exports = { getMetas, saveMetas };
