(function (global) {
  global.ARQ = global.ARQ || {};
  ARQ.dialogProject = {
    openNew: function (onCreated) {
      var $name = $('<input type="text" class="arq-input" placeholder="Nombre del proyecto" autocomplete="off"/>');
      var $nameWrap = $('<div class="arq-input-wrap"/>');
      var $nameClear = $('<button type="button" class="arq-input-clear" aria-label="Limpiar nombre" title="Limpiar">×</button>');
      var $desc = $('<textarea class="arq-textarea" placeholder="Descripción (opcional)"/>');
      var $ubi = $('<input type="text" class="arq-input" placeholder="Ubicación (se puede editar)" autocomplete="off"/>');
      var $geoStatus = $('<div class="arq-muted"/>').text('Ubicación: sin seleccionar');
      var $geoRetry = $('<button type="button" class="arq-btn arq-btn--ghost"/>').text('Actualizar');
      var $mapFrame = $('<iframe title="Mapa" loading="lazy" referrerpolicy="no-referrer-when-downgrade"/>');
      var $mapCircle = $('<div class="arq-map-circle"/>').append($mapFrame);
      var $geoTopRow = $('<div style="display:flex;gap:.5rem;flex-wrap:wrap;align-items:center;justify-content:space-between"/>')
        .append($geoRetry);
      var $geoPanel = $('<div class="arq-drawer-panel"/>');
      var coords = null;
      var geoBusy = false;

      function setMap(lat, lon) {
        if (lat == null || lon == null) {
          $mapFrame.attr('src', '');
          return;
        }
        var z = 16;
        var d = 0.01;
        var left = (lon - d), right = (lon + d), top = (lat + d), bottom = (lat - d);
        var src = 'https://www.openstreetmap.org/export/embed.html?bbox=' +
          [left, bottom, right, top].join('%2C') + '&layer=mapnik&marker=' + lat + '%2C' + lon;
        $mapFrame.attr('src', src);
      }

      function setCoords(c, sourceLabel) {
        coords = c || null;
        if (!coords) {
          $geoStatus.text('Ubicación: sin seleccionar');
          setMap(null, null);
          return;
        }
        var acc = (coords.accuracy != null) ? (' ±' + Math.round(coords.accuracy) + 'm') : '';
        $geoStatus.text('Ubicación: ' + coords.lat.toFixed(6) + ', ' + coords.lon.toFixed(6) + acc + (sourceLabel ? (' · ' + sourceLabel) : ''));
        setMap(coords.lat, coords.lon);
      }

      function reverseGeocode(lat, lon) {
        return fetch('https://nominatim.openstreetmap.org/reverse?format=jsonv2&lat=' + encodeURIComponent(lat) + '&lon=' + encodeURIComponent(lon), {
          method: 'GET',
          headers: { 'Accept': 'application/json' },
        }).then(function (r) { return r.json(); }).then(function (j) {
          if (j && j.display_name) return j.display_name;
          return '';
        }).catch(function () { return ''; });
      }

      function getFineLocation() {
        if (geoBusy) return;
        if (!global.navigator || !global.navigator.geolocation) {
          ARQ.bus.emit(ARQ.EVENTS.TOAST, 'Geolocalización no disponible');
          return;
        }
        geoBusy = true;
        $geoStatus.text('Ubicación: obteniendo…');
        global.navigator.geolocation.getCurrentPosition(function (pos) {
          var c = {
            lat: pos.coords.latitude,
            lon: pos.coords.longitude,
            accuracy: pos.coords.accuracy,
            timestamp: pos.timestamp || Date.now(),
            source: 'geolocation',
          };
          setCoords(c, 'GPS');
          reverseGeocode(c.lat, c.lon).then(function (addr) {
            if (addr && !($ubi.val() || '').trim()) {
              $ubi.val(addr);
            }
          }).finally(function () { geoBusy = false; });
        }, function (err) {
          geoBusy = false;
          var code = err && typeof err.code === 'number' ? err.code : 0;
          var msg = (err && err.message) ? err.message : 'No se pudo obtener ubicación';
          setCoords(null);
          if (code === 1) {
            $geoStatus.text('Ubicación: permisos de GPS no concedidos');
            ARQ.bus.emit(ARQ.EVENTS.TOAST, 'Permite el GPS para guardar y mostrar el mapa. Luego pulsa “Actualizar”.');
          } else {
            ARQ.bus.emit(ARQ.EVENTS.TOAST, msg);
          }
        }, { enableHighAccuracy: true, timeout: 12000, maximumAge: 0 });
      }

      $nameWrap.append($name, $nameClear);
      $nameClear.on('click', function () { $name.val('').trigger('input').focus(); });
      $name.on('input', function () {
        $nameClear.toggleClass('is-visible', !!(($name.val() || '').length));
      });

      $geoRetry.on('click', function () { getFineLocation(); });

      $geoPanel.append(
        $geoTopRow,
        $('<div style="margin-top:.5rem"/>').append($geoStatus),
        $('<div style="display:flex;justify-content:center"/>').append($mapCircle)
      );

      var $body = $('<div/>').append(
        $('<label class="arq-label"/>').text('Nombre'),
        $nameWrap,
        $('<label class="arq-label"/>').text('Descripción'),
        $desc,
        $('<label class="arq-label"/>').text('Ubicación'),
        $ubi,
        $geoPanel
      );

      $name.val(ARQ.utils.defaultProjectName()).trigger('input');
      setCoords(null);

      var dlg = ARQ.dialog.open({
        title: 'Nuevo proyecto',
        body: $body,
        buttons: [
          { label: 'Cancelar', onClick: function () { dlg.close(); } },
          { label: 'Crear', primary: true, onClick: function () {
            var n = ($name.val() || '').trim();
            if (!n) return;
            var createFn = function () {
              return ARQ.projects.create({
                nombre: n,
                descripcion: ($desc.val() || '').trim(),
                ubicacion_textual: ($ubi.val() || '').trim(),
                coordenadas: coords,
              }).then(function (r) {
                dlg.close();
                if (r.success && r.project) {
                  onCreated(r.project);
                  return r;
                }
                return Promise.reject(new Error(r.error || 'Error al crear'));
              });
            };
            if (ARQ.ops && ARQ.ops.run) {
              ARQ.ops.run(createFn, { label: 'Creando proyecto…', blocking: 'critical' }).catch(function () {});
            } else {
              createFn().catch(function () {
                ARQ.bus.emit(ARQ.EVENTS.TOAST, 'Error de red');
              });
            }
          } },
        ],
      });

      // Automático: siempre intenta pedir/usar GPS al abrir "Nuevo proyecto".
      // Si no hay permisos, el navegador mostrará el prompt; si el usuario lo bloquea,
      // el status lo indicará y "Actualizar" permite reintentar tras habilitar permisos.
      setTimeout(function () { getFineLocation(); }, 0);
    },
  };
})(typeof window !== 'undefined' ? window : this);
