'use strict';

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

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

async function inspect(pool) {
  return inspectTables(pool, {
    gruposmodificadoresproductos: [
      'idproducto',
      'idgruposmodificadores',
      'idempresa',
      'prioridad',
      'incluidos',
      'maximomodificadores',
      'forzarcaptura',
      'captura_incluido',
      'id',
      'WorkspaceId',
    ],
  });
}

async function extract(pool, _watermark, limit) {
  const metadata = await inspect(pool);
  const errors = requireColumns(metadata, 'gruposmodificadoresproductos', ['idproducto', 'idgruposmodificadores']);
  if (errors.length) throw new Error(`SoftRestaurant product_modifier_group_assignments schema incompleto: ${errors.join('; ')}`);
  const result = await pool.request()
    .input('limit', sql.Int, limit)
    .query(`
      SELECT TOP (@limit)
        CAST(CONCAT(ISNULL(${col(metadata, 'idempresa', "''")}, ''), ':', gmp.idproducto, ':', gmp.idgruposmodificadores) AS varchar(180)) AS external_id,
        NULL AS source_created_at,
        CAST('2000-01-01' AS datetime) AS source_updated_at,
        NULL AS business_date,
        gmp.idproducto,
        gmp.idgruposmodificadores AS idgrupo_modificador,
        ${col(metadata, 'idempresa')} AS idempresa,
        ${col(metadata, 'prioridad', '0')} AS secuencia_boton,
        ${col(metadata, 'incluidos', '0')} AS incluidos_en_precio,
        ${col(metadata, 'maximomodificadores', '0')} AS max_modificadores,
        ${col(metadata, 'forzarcaptura', '0')} AS forzar_captura,
        ${col(metadata, 'captura_incluido', '0')} AS captura_incluido,
        ${col(metadata, 'WorkspaceId')} AS workspace_id
      FROM ${qname('gruposmodificadoresproductos')} gmp
      ORDER BY ${col(metadata, 'idempresa', "''")}, gmp.idproducto, ${col(metadata, 'prioridad', '0')}, gmp.idgruposmodificadores
    `);
  return result.recordset.map((row) => ({ ...row, payload: { ...row, raw_payload: row } }));
}

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