'use strict';

const { sql } = require('../../db');
const { qname, inspectTables, requireColumns } = require('../softrestaurantIntrospection');

async function extract(pool, watermark, limit) {
  const metadata = await inspectTables(pool, {
    productosdetalle: ['idproducto', 'idempresa', 'precio', 'bloqueado'],
    productos: ['idproducto', 'descripcion'],
  });
  const errors = requireColumns(metadata, 'productosdetalle', ['idproducto', 'idempresa', 'precio']);
  if (errors.length) return [];
  const hasProductName = metadata.tables.productos?.exists && metadata.tables.productos.columns.descripcion;
  const result = await pool.request()
    .input('limit', sql.Int, limit)
    .query(`
      SELECT TOP (@limit)
        CAST(CONCAT(pd.idempresa, ':', pd.idproducto) AS varchar(160)) AS external_id,
        NULL AS source_created_at,
        CAST('2000-01-01' AS datetime) AS source_updated_at,
        NULL AS business_date,
        pd.idempresa,
        pd.idproducto,
        ${hasProductName ? 'p.descripcion' : 'CAST(pd.idproducto AS varchar(60))'} AS descripcion,
        pd.precio,
        ${metadata.tables.productosdetalle.columns.bloqueado ? 'pd.bloqueado' : 'CAST(0 AS bit)'} AS bloqueado
      FROM ${qname('productosdetalle')} pd
      ${metadata.tables.productos?.exists ? `LEFT JOIN ${qname('productos')} p ON p.idproducto=pd.idproducto` : ''}
      ORDER BY pd.idempresa, pd.idproducto
    `);
  return result.recordset.map((row) => ({ ...row, payload: row }));
}

module.exports = { entityType: 'product_prices', extract };
