(function (global) {
  global.ARQ = global.ARQ || {};
  ARQ.aiPerLayer = {
    open: function (layerId) {
      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 layer = ARQ.layers.findLayerById(sheet, layerId);
      if (!layer) return;
      if (!layer.visible) {
        ARQ.bus.emit(ARQ.EVENTS.TOAST, 'Muestra la capa para usar IA');
        return;
      }

      var $prompt = $('<textarea class="arq-textarea" rows="5" placeholder="Describe la intención (p. ej. realismo, materiales, iluminación…)"/>');
      var autoBase = 'Reinterpreta esta capa manteniendo composición y lectura arquitectónica. ';
      $prompt.val(autoBase);

      var $body = $('<div/>').append(
        $('<p class="arq-muted"/>').text('Capa: ' + (layer.nombre || layerId)),
        $('<label class="arq-label"/>').text('Prompt'),
        $prompt
      );

      var dlg = ARQ.dialog.open({
        title: 'IA por capa',
        body: $body,
        buttons: [
          { label: 'Cancelar', onClick: function () { dlg.close(); } },
          { label: 'Generar', primary: true, onClick: function () {
            var txt = ($prompt.val() || '').trim();
            if (!txt) return;
            dlg.close();
            var run = function () {
              return ARQ.capture.captureLayerPng(layer, sheet, { transparentBackground: true }).then(function (cap) {
                return ARQ.aiTransport.generateImageFromImage(txt, 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 · ' + (layer.nombre || 'capa')),
                    meta: {
                      kind: 'derived',
                      derivationType: 'perLayer',
                      origin: { sheetId: sheet.id, layerId: layer.id, layerNombre: layer.nombre || '' },
                      createdAt: ARQ.utils.nowIso(),
                      promptAuto: autoBase,
                      promptUser: txt,
                      promptFinal: res.prompt_final || txt,
                      vision_description: res.vision_description || '',
                      model: 'dall-e-3',
                      inputCapture: { type: 'layer', transparentBackground: 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: txt,
                        respuesta: 'IA por capa',
                        fecha: ARQ.utils.nowIso(),
                      });
                      ARQ.store.setDirty(true);
                    }
                  });
                });
              });
            };
            if (ARQ.ops && ARQ.ops.run) {
              ARQ.ops.run(run, { label: 'Generando variación con IA…', 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(); },
      });
    },
  };

  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 + ')';
  }
})(typeof window !== 'undefined' ? window : this);
