'use strict';

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

function col(metadata, tableName, alias, columnName, fallback = 'NULL') {
  return metadata.tables[tableName]?.columns?.[columnName] ? `${alias}.${columnName}` : fallback;
}

async function inspect(pool) {
  return inspectTables(pool, {
    modificadores: ['idproducto', 'idmodificador', 'precio', 'idgruposmodificadores', 'idempresa', 'WorkspaceId'],
    productos: ['idproducto', 'descripcion'],
  });
}

async function extract(pool, _watermark, limit) {
  const metadata = await inspect(pool);
  const errors = requireColumns(metadata, 'modificadores', ['idproducto', 'idgruposmodificadores']);
  if (errors.length) throw new Error(`SoftRestaurant product_modifiers schema incompleto: ${errors.join('; ')}`);
  const hasProducts = metadata.tables.productos?.exists;
  const modifierProductExpr = metadata.tables.modificadores.columns.idmodificador ? 'm.idmodificador' : 'm.idproducto';
  const productJoin = hasProducts ? `LEFT JOIN ${qname('productos')} p ON p.idproducto=${modifierProductExpr}` : '';
  const result = await pool.request()
    .input('limit', sql.Int, limit)
    .query(`
      SELECT TOP (@limit)
        CAST(CONCAT(ISNULL(${col(metadata, 'modificadores', 'm', 'idempresa', "''")}, ''), ':', m.idgruposmodificadores, ':', m.idproducto, ':', ${modifierProductExpr}) AS varchar(220)) AS external_id,
        NULL AS source_created_at,
        CAST('2000-01-01' AS datetime) AS source_updated_at,
        NULL AS business_date,
        m.idgruposmodificadores AS idgrupo_modificador,
        m.idproducto AS idproducto_padre,
        ${modifierProductExpr} AS idproducto_modificador,
        ${col(metadata, 'modificadores', 'm', 'idmodificador')} AS idmodificador,
        ${col(metadata, 'modificadores', 'm', 'precio', '0')} AS precio,
        ${col(metadata, 'modificadores', 'm', 'idempresa')} AS idempresa,
        ${hasProducts && metadata.tables.productos.columns.descripcion ? 'p.descripcion' : 'CAST(m.idproducto AS varchar(80))'} AS descripcion,
        ${col(metadata, 'modificadores', 'm', 'WorkspaceId')} AS workspace_id
      FROM ${qname('modificadores')} m
      ${productJoin}
      ORDER BY ${col(metadata, 'modificadores', 'm', 'idempresa', "''")}, m.idgruposmodificadores, m.idproducto
    `);
  return result.recordset.map((row) => ({ ...row, payload: { ...row, raw_payload: row } }));
}

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