import { hiprint } from 'vue-plugin-hiprint';

/**
 * QH-MES 自定义 provider（参考 vue-plugin-hiprint 动态 provider 机制）
 * - 新增一组“报表/套打”常用组件
 * - 提供一个默认的“普通明细表”（单行表头）
 *
 * 注意：此 provider 不替换 defaultElementTypeProvider，只做补充。
 */
export function createQhmesProvider() {
  const key = 'qhmesModule';

  const addElementTypes = function (context: any) {
    // 避免重复注册
    context.removePrintElementTypes(key);

    const commonText = (tid: string, title: string, extraOptions: Record<string, any> = {}) => {
      return {
        tid,
        title,
        type: 'text',
        options: {
          title,
          field: '',
          testData: title,
          ...extraOptions,
        },
      };
    };

    const elements: any[] = [
      commonText(`${key}.reportTitle`, '报表标题', { fontSize: 18, fontWeight: 'bold', textAlign: 'center' }),
      commonText(`${key}.subTitle`, '副标题', { fontSize: 12, textAlign: 'center' }),
      commonText(`${key}.labelValue`, '标签:值', { fontSize: 10 }),
      commonText(`${key}.pageNo`, '页码', { field: 'pageNumber', testData: '1/1' }),

      // 二维码/条码（用 text + textType）
      {
        tid: `${key}.qrcode`,
        title: '二维码',
        type: 'text',
        options: {
          title: '二维码',
          field: 'qrcode',
          testData: 'QRCODE_DEMO',
          textType: 'qrcode',
          width: 35,
          height: 35,
        },
      },
      {
        tid: `${key}.barcode`,
        title: '条形码',
        type: 'text',
        options: {
          title: '条形码',
          field: 'barcode',
          testData: '1234567890',
          textType: 'barcode',
          width: 80,
          height: 25,
        },
      },

      // 普通明细表（单行表头，支持多级分组合并）
      {
        tid: `${key}.tableSimple`,
        title: '普通明细表',
        type: 'html',
        options: {
          title: '普通明细表',
          field: 'table',
          testData: '',
          width: 180,
          height: 60,
          __qhmesManaged: true,
          columns: [
            { title: '物料', field: 'name', width: 90, align: 'left' },
            { title: '数量', field: 'qty', width: 45, align: 'right' },
            { title: '金额', field: 'amount', width: 45, align: 'right' },
          ],
          groupFields: [],
          formatter: `
function(t,e,printData){
  var opts = (t && t.options) ? t.options : {};
  var list = printData && Array.isArray(printData[opts.field || 'table']) ? printData[opts.field || 'table'] : [];
  var globalCols = printData && Array.isArray(printData.__qhmesTableColumns) ? printData.__qhmesTableColumns : [];
  var columns = Array.isArray(opts.columns) && opts.columns.length ? opts.columns : (globalCols.length ? globalCols : [
    { title: '物料', field: 'name', width: 90, align: 'left' },
    { title: '数量', field: 'qty', width: 45, align: 'right' },
    { title: '金额', field: 'amount', width: 45, align: 'right' }
  ]);
  var globalGroups = printData && Array.isArray(printData.__qhmesGroupFields) ? printData.__qhmesGroupFields : [];
  var groupFields = Array.isArray(opts.groupFields) && opts.groupFields.length ? opts.groupFields : globalGroups;
  var style = opts.__qhmesStyle || {};
  var fontSize = style.fontSize || 10;
  var borderColor = style.borderColor || '#000';
  var borderWidth = style.borderWidth || 1;
  var cellPadding = style.cellPadding || '2pt 4pt';
  var headerBg = style.headerBg || '';
  var tableWidth = style.tableWidth || '100%';

  function esc(v){
    if (v === null || v === undefined) return '';
    return String(v).replace(/&/g,'&amp;').replace(/</g,'&lt;').replace(/>/g,'&gt;');
  }
  function isGroupCol(field){
    return groupFields.indexOf(field) > -1;
  }

  // 计算每个分组列在每行的 rowspan（多级：上层一致前提下再判断下层）
  var rowspanMap = {};
  for (var c=0;c<columns.length;c++){
    var f = columns[c].field;
    rowspanMap[f] = new Array(list.length).fill(1);
  }
  for (var g=0; g<groupFields.length; g++){
    var gf = groupFields[g];
    // 分组字段可能不在 columns 中，需先兜底初始化，避免 rowspanMap[gf] 未定义报错
    if (!rowspanMap[gf]) rowspanMap[gf] = new Array(list.length).fill(1);
    var i = 0;
    while(i < list.length){
      var j = i + 1;
      while(j < list.length){
        var upperOk = true;
        for (var up=0; up<g; up++){
          var uf = groupFields[up];
          if ((list[j][uf] ?? '') !== (list[i][uf] ?? '')) { upperOk = false; break; }
        }
        if (!upperOk) break;
        if ((list[j][gf] ?? '') === (list[i][gf] ?? '')) j++;
        else break;
      }
      var span = j - i;
      if (!rowspanMap[gf]) rowspanMap[gf] = new Array(list.length).fill(1);
      rowspanMap[gf][i] = span;
      for (var k=i+1;k<j;k++) rowspanMap[gf][k] = 0;
      i = j;
    }
  }

  var html = '<table style="width:'+tableWidth+';border-collapse:collapse;table-layout:fixed;font-size:'+fontSize+'pt;">';
  html += '<thead><tr>';
  for (var h=0;h<columns.length;h++){
    var hc = columns[h];
    var hw = hc.width ? ('width:'+hc.width+'pt;') : '';
    var hbg = headerBg ? ('background:'+headerBg+';') : '';
    html += '<th style="border:'+borderWidth+'px solid '+borderColor+';padding:'+cellPadding+';text-align:center;'+hbg+hw+'">'+esc(hc.title || hc.field || '')+'</th>';
  }
  html += '</tr></thead><tbody>';

  for (var r=0;r<list.length;r++){
    html += '<tr>';
    for (var cc=0;cc<columns.length;cc++){
      var col = columns[cc];
      var field = col.field;
      var align = col.align || 'left';
      if (isGroupCol(field)){
        var rs = rowspanMap[field][r];
        if (rs > 0){
          html += '<td rowspan="'+rs+'" style="border:'+borderWidth+'px solid '+borderColor+';padding:'+cellPadding+';text-align:center;vertical-align:middle;">'+esc(list[r][field])+'</td>';
        }
      }else{
        html += '<td style="border:'+borderWidth+'px solid '+borderColor+';padding:'+cellPadding+';text-align:'+align+';">'+esc(list[r][field])+'</td>';
      }
    }
    html += '</tr>';
  }
  html += '</tbody></table>';
  return html;
}
          `,
        },
      },
    ];

    // 分组（左侧面板展示更友好）
    const groups = [
      new (hiprint as any).PrintElementTypeGroup('HttpPrinter风格组件', elements),
    ];

    context.addPrintElementTypes(key, groups);
  };

  return { addElementTypes };
}

