(function (global) {
  global.ARQ = global.ARQ || {};
  var STYLES = [
    'realismo', 'hiperrealismo', 'toon', 'anime', 'cómic', 'renacentismo', 'barroco',
    'impresionismo', 'acuarela', 'óleo', 'boceto técnico', 'blueprint arquitectónico',
    'cyberpunk', 'sci-fi', 'low poly', 'clay render', 'matte painting', 'minimalista',
    'surrealista', 'concept art', 'isométrico', 'pixel art', 'tinta', 'pastel', 'noir',
  ];

  function uniqueAiName(sheet, base) {
    var names = (sheet.capas || []).map(function (l) { return l.nombre || ''; });
    var b = base || 'IA';
    if (names.indexOf(b) < 0) return b;
    var n = 2;
    while (names.indexOf(b + ' (' + n + ')') >= 0) n++;
    return b + ' (' + n + ')';
  }

  ARQ.aiGlobal = {
    syncUi: function () {
      var has = ARQ.aiGate && ARQ.aiGate.isEnabled();
      var $b = $('#btn-ai-global');
      if (!$b.length) return;
      $b.prop('disabled', !has);
      $b.attr('title', has ? 'IA sobre todo el lienzo' : 'Requiere API Key OpenAI');
    },

    open: function () {
      if (!ARQ.aiGate || !ARQ.aiGate.isEnabled()) {
        ARQ.bus.emit(ARQ.EVENTS.TOAST, 'Configura la API Key de OpenAI en Configuración.');
        return;
      }
      var sheet = ARQ.utils.activeSheet(ARQ.store.getProject());
      if (!sheet) return;

      var $prompt = $('<textarea class="arq-textarea" rows="5"/>');
      var $style = $('<select class="arq-input"/>');
      $style.append($('<option value="">').text('(sin estilo fijo)'));
      STYLES.forEach(function (s) {
        $style.append($('<option/>').attr('value', s).text(s));
      });
      var $inten = $('<input type="range" min="1" max="10" value="7"/>');
      var $mat = $('<label><input type="checkbox" id="ai-global-mat" checked/> Incluir materiales del proyecto</label>');
      $prompt.val('Transforma este lienzo completo en una interpretación visual profesional, coherente con arquitectura y composición.');

      var $body = $('<div/>').append(
        $('<p class="arq-muted"/>').text('Se capturan todas las capas visibles y el fondo de la hoja.'),
        $('<label class="arq-label"/>').text('Prompt'),
        $prompt,
        $('<label class="arq-label"/>').text('Estilo visual'),
        $style,
        $('<label class="arq-label"/>').text('Intensidad del estilo'),
        $inten,
        $('<div class="arq-muted"/>').text('1 = sutil · 10 = fuerte'),
        $mat
      );

      var dlg = ARQ.dialog.open({
        title: 'IA · lienzo completo',
        body: $body,
        buttons: [
          { label: 'Cancelar', onClick: function () { dlg.close(); } },
          { label: 'Generar', primary: true, onClick: function () {
            var userPrompt = ($prompt.val() || '').trim();
            if (!userPrompt) return;
            dlg.close();
            var run = function () {
              return ARQ.capture.captureVisibleSheetPng(sheet, { includeBackground: true }).then(function (cap) {
                var parts = [userPrompt];
                var st = $style.val();
                if (st) {
                  parts.push('Estilo visual deseado: ' + st + '. Intensidad aproximada: ' + $inten.val() + '/10.');
                }
                if ($('#ai-global-mat').is(':checked')) {
                  var p = ARQ.store.getProject();
                  if (p && p.materiales && p.materiales.length) {
                    parts.push('Materiales del proyecto: ' + JSON.stringify(p.materiales.map(function (m) {
                      return { hex: m.hex, nombre: m.nombre_material };
                    })));
                  }
                }
                var fullPrompt = parts.join('\n\n');
                return ARQ.aiTransport.generateImageFromImage(fullPrompt, cap.b64, {}).then(function (res) {
                  if (!res.success) return Promise.reject(new Error(res.error || 'Error'));
                  var dataUrl = 'data:image/png;base64,' + res.b64_json;
                  return ARQ.aiDerivedLayers.insertDerivedLayer({
                    dataUrl: dataUrl,
                    nombre: uniqueAiName(sheet, 'IA · lienzo'),
                    meta: {
                      kind: 'derived',
                      derivationType: 'global',
                      origin: { sheetId: sheet.id, layerId: null, layerNombre: '' },
                      createdAt: ARQ.utils.nowIso(),
                      promptUser: userPrompt,
                      promptFinal: res.prompt_final || fullPrompt,
                      vision_description: res.vision_description || '',
                      model: 'dall-e-3',
                      inputCapture: { type: 'sheetVisible', includeBackground: true },
                    },
                  }).then(function () {
                    var p = ARQ.store.getProject();
                    if (p) {
                      p.chat_ia = p.chat_ia || [];
                      p.chat_ia.push({
                        id: ARQ.utils.uuid(),
                        prompt_usuario: userPrompt,
                        respuesta: 'IA lienzo completo',
                        fecha: ARQ.utils.nowIso(),
                      });
                      ARQ.store.setDirty(true);
                    }
                  });
                });
              });
            };
            if (ARQ.ops && ARQ.ops.run) {
              ARQ.ops.run(run, { label: 'Generando render IA del lienzo…', blocking: 'critical' }).catch(function (e) {
                ARQ.bus.emit(ARQ.EVENTS.TOAST, (e && e.message) ? e.message : 'Error IA');
              });
            } else {
              run().catch(function (e) {
                ARQ.bus.emit(ARQ.EVENTS.TOAST, (e && e.message) ? e.message : 'Error IA');
              });
            }
          } },
        ],
        onCancel: function () { dlg.close(); },
      });
    },
  };
})(typeof window !== 'undefined' ? window : this);
