const __vite__mapDeps=(i,m=__vite__mapDeps,d=(m.f||(m.f=["assets/SpreadsheetsPage-xNc8TSM_.js","assets/rolldown-runtime-Bh1tDfsg.js","assets/vendor-D9YQtIW7.js","assets/NewProspectPage-Da8irItg.js","assets/useProspectLocation-EWmburb6.js","assets/ProspectsListPage-CPRP9OYR.js","assets/ProspectDetailPage-CftLgbxN.js"])))=>i.map(i=>d[i]); import{n as e}from"./rolldown-runtime-Bh1tDfsg.js";import{_ as t,a as n,c as r,d as i,f as a,g as o,h as s,i as c,l,m as u,n as d,o as f,p as ee,r as te,s as p,t as ne,u as re,v as ie,y as ae}from"./vendor-D9YQtIW7.js";(function(){let e=document.createElement(`link`).relList;if(e&&e.supports&&e.supports(`modulepreload`))return;for(let e of document.querySelectorAll(`link[rel="modulepreload"]`))n(e);new MutationObserver(e=>{for(let t of e)if(t.type===`childList`)for(let e of t.addedNodes)e.tagName===`LINK`&&e.rel===`modulepreload`&&n(e)}).observe(document,{childList:!0,subtree:!0});function t(e){let t={};return e.integrity&&(t.integrity=e.integrity),e.referrerPolicy&&(t.referrerPolicy=e.referrerPolicy),e.crossOrigin===`use-credentials`?t.credentials=`include`:e.crossOrigin===`anonymous`?t.credentials=`omit`:t.credentials=`same-origin`,t}function n(e){if(e.ep)return;e.ep=!0;let n=t(e);fetch(e.href,n)}})();var m=e(ae(),1),oe=ie(),h=`auth:session-expired`;function se(e,t){return e||!t?`include`:`omit`}async function ce(e){try{let t=await e.json();return t.error||t.message||`Error: ${e.statusText}`}catch{return`Error: ${e.statusText}`}}function le(e){window.dispatchEvent(new CustomEvent(e))}var g=`X-Client`;function _(e){let t=e.trim();if(t.match(/api:\d+/)||t.match(/:\/\/api:/))throw Error(`API_URL cannot use internal Docker network URL (api:PORT). Frontend must use a browser-reachable host.`);return t.replace(/\/+$/,``).replace(/\/api$/,``)}function ue(e){return e===`localhost`||e===`127.0.0.1`||/^192\.168\.\d{1,3}\.\d{1,3}$/.test(e)||/^10\.\d{1,3}\.\d{1,3}\.\d{1,3}$/.test(e)||/^172\.(1[6-9]|2\d|3[0-1])\.\d{1,3}\.\d{1,3}$/.test(e)}function v(e,t){let n=e||t||``;if(!n.trim())return null;try{return new URL(_(n)).origin}catch{return null}}function y(e,t,n,r){return r?!0:n?n===e||ue(t):!1}var b={tokenKey:`ap_access_token`,tenantSlugKey:`ap_tenant_slug`,defaultTenantSlug:`default`,authClient:`web`,csrfCookie:`ap_csrf_web`},de=class{getApiBaseUrl(){if(typeof window>`u`)return _(`https://api.asistentepolitico.com`);let e=v(window.__API_URL__,`https://api.asistentepolitico.com`);return y(window.location.origin,window.location.hostname,e,!1)?``:_(window.__API_URL__||`https://api.asistentepolitico.com`)}getAuthBaseUrl(){if(typeof window>`u`)return _(`https://auth.asistentepolitico.com`);let e=v(window.__AUTH_URL__,`https://auth.asistentepolitico.com`);if(y(window.location.origin,window.location.hostname,e,!1))return``;let t=window.__AUTH_URL__||`https://auth.asistentepolitico.com`;return t?_(String(t)):this.getApiBaseUrl()}getTokenKey(){return b.tokenKey}getTenantSlugKey(){return b.tenantSlugKey}getDefaultTenantSlug(){return b.defaultTenantSlug}getTenantSlug(){return typeof window>`u`?b.defaultTenantSlug:window.localStorage.getItem(b.tenantSlugKey)?.trim().toLowerCase()||b.defaultTenantSlug}setTenantSlug(e){if(typeof window>`u`)return;let t=String(e||b.defaultTenantSlug).trim().toLowerCase()||b.defaultTenantSlug;window.localStorage.setItem(b.tenantSlugKey,t)}},x=null;function S(){return x||=new de,x}var fe=`x-csrf-token`;function pe(e){if(typeof document>`u`)return null;let t=document.cookie.match(RegExp(`(?:^|; )${e}=([^;]*)`));return t?decodeURIComponent(t[1]):null}function me(e){let t=pe(e);return t?{[fe]:t}:{}}function he(){return me(b.csrfCookie)}var ge=class{authStorage;config;constructor(e,t={}){this.authStorage=e,this.config=t.config??S()}getAuthHeaders(e={},t=!1){let n=this.authStorage.getToken(),r={...e,[g]:b.authClient,...t?he():{}};return n&&n!==`cookie`&&(r.Authorization=`Bearer ${n}`),r[`X-Tenant-Slug`]=this.config.getTenantSlug(),r}handleUnauthorized(){this.authStorage.clearToken(),le(h)}async handleResponse(e,t){if(e.status===401)throw this.handleUnauthorized(),Error(await this.parseError(e));if(!e.ok)throw Error(await this.parseError(e));return!t||e.json()}fetchInit(e,t=!1){let n=this.authStorage.getToken(),r=!!(n&&n!==`cookie`);return{headers:this.getAuthHeaders(e,t),credentials:se(t,r)}}async get(e){let t=await fetch(`${this.config.getApiBaseUrl()}${e}`,this.fetchInit({}));return this.handleResponse(t,!0)}async post(e,t){let n=await fetch(`${this.config.getApiBaseUrl()}${e}`,{...this.fetchInit({"Content-Type":`application/json`},!0),method:`POST`,body:t===void 0?void 0:JSON.stringify(t)});return this.handleResponse(n,!0)}async put(e,t){let n=await fetch(`${this.config.getApiBaseUrl()}${e}`,{...this.fetchInit({"Content-Type":`application/json`},!0),method:`PUT`,body:t===void 0?void 0:JSON.stringify(t)});return this.handleResponse(n,!0)}async delete(e){let t=await fetch(`${this.config.getApiBaseUrl()}${e}`,{...this.fetchInit({},!0),method:`DELETE`});return this.handleResponse(t,!1)}async postRaw(e,t){let n=await fetch(`${this.config.getApiBaseUrl()}${e}`,{method:`POST`,headers:this.getAuthHeaders({"Content-Type":`application/json`},!0),body:t===void 0?void 0:JSON.stringify(t),credentials:`include`});return n.status===401&&this.handleUnauthorized(),n}async parseError(e){return ce(e)}},_e=class{deferred=null;constructor(){typeof window>`u`||(window.addEventListener(`beforeinstallprompt`,e=>{e.preventDefault(),this.deferred=e,window.dispatchEvent(new CustomEvent(`pwa:install-available`))}),window.addEventListener(`appinstalled`,()=>{this.deferred=null,window.dispatchEvent(new CustomEvent(`pwa:installed`))}))}canInstall(){return!!this.deferred}async promptInstall(){return this.deferred?(await this.deferred.prompt(),await this.deferred.userChoice,this.deferred=null,!0):!1}async clearCachesAndReload(){try{if(`serviceWorker`in navigator){let e=await navigator.serviceWorker.getRegistrations();await Promise.all(e.map(async e=>{e.active?.postMessage({type:`CLEAR_CACHE`}),e.waiting?.postMessage({type:`SKIP_WAITING`}),await e.unregister()}))}if(`caches`in window){let e=await caches.keys();await Promise.all(e.map(e=>caches.delete(e)))}}finally{let e=new URL(window.location.href);e.searchParams.set(`_nocache`,`1`),e.searchParams.set(`_t`,String(Date.now())),location.replace(e.toString())}}},ve=class{info(e){window.alert(e)}error(e){window.alert(e)}};function C(e,t={}){let n={...t,[g]:b.authClient},r=e?.getToken();return r&&r!==`cookie`&&(n.Authorization=`Bearer ${r}`),n}var ye=class{config;tokenStorage;constructor(e,t=null){this.config=e??S(),this.tokenStorage=t}async login(e,t){let n=await fetch(`${this.config.getAuthBaseUrl()}/auth/login`,{method:`POST`,headers:C(this.tokenStorage,{"Content-Type":`application/json`,"X-Tenant-Slug":this.config.getTenantSlug()}),body:JSON.stringify({email:e,password:t}),credentials:`include`});if(!n.ok){let e=`Error al iniciar sesión.`;try{let t=await n.json();e=t.error||t.message||e}catch{}throw Error(e)}let r=await n.json(),i=r.accessToken||r.token;if(!i)throw Error(`Respuesta de login inválida (sin token).`);return this.tokenStorage?.setToken(`cookie`),{accessToken:i}}async logout(){try{await fetch(`${this.config.getAuthBaseUrl()}/auth/logout`,{method:`POST`,headers:C(this.tokenStorage,{"Content-Type":`application/json`}),credentials:`include`})}catch{}}async getSession(){let e=this.tokenStorage?.getToken(),t=!e||e===`cookie`,n=await fetch(`${this.config.getAuthBaseUrl()}/auth/session`,{headers:C(this.tokenStorage,{"X-Tenant-Slug":this.config.getTenantSlug()}),credentials:t?`include`:`omit`});if(n.status===401||!n.ok)return{authenticated:!1,accessToken:null,session:null};let r=await n.json();return{authenticated:!!r.authenticated,accessToken:t?`cookie`:e??null,session:r}}async listLoginTenants(){let e;try{e=await fetch(`${this.config.getAuthBaseUrl()}/auth/tenants`,{method:`GET`,headers:{Accept:`application/json`}})}catch{throw Error(`No se pudo conectar con autenticación. Levanta auth-api: bash local/dev.sh up`)}if(!e.ok)throw Error(`No se pudieron cargar las organizaciones.`);let t=await e.json();if(!Array.isArray(t))throw Error(`Respuesta de organizaciones inválida.`);return t.map(e=>{let t=e,n=typeof t.slug==`string`?t.slug.trim():``,r=typeof t.name==`string`?t.name.trim():n;return n?{slug:n,name:r||n}:null}).filter(e=>e!=null)}},be=`cookie`,xe=class{storageKey;constructor(e){this.storageKey=e}getToken(){return be}setToken(e){this.clearLegacyStorage()}clearToken(){this.clearLegacyStorage()}isAuthenticated(){return!0}clearLegacyStorage(){typeof window<`u`&&window.localStorage.removeItem(this.storageKey)}};function Se(e,t){let n=e.trim();if(!n||!t)throw Error(`Correo y contraseña son requeridos.`);return{email:n,password:t}}var w=class{authenticated=!1;_hydrating=null;authProvider;tokenStorage;config;constructor(e,t,n=null){this.authProvider=e,this.tokenStorage=t,this.config=n}async ensureSession(){return this.authenticated?!0:(this._hydrating||=(async()=>{try{let e=await this.authProvider.getSession();if(this.authenticated=e.authenticated,e.authenticated){this.tokenStorage.setToken(`cookie`);let t=e.session?.tenantSlug??e.session?.tenant_slug;t&&this.config?.setTenantSlug(t)}else this.tokenStorage.clearToken();return this.authenticated}catch{return this.authenticated=!1,this.tokenStorage.clearToken(),!1}finally{this._hydrating=null}})(),this._hydrating)}async login(e,t){let n=Se(e,t);await this.authProvider.login(n.email,n.password),this.tokenStorage.setToken(`cookie`),this.authenticated=!0}async logout(){try{await this.authProvider.logout()}finally{this.tokenStorage.clearToken(),this.authenticated=!1}}async listLoginTenants(){return this.authProvider.listLoginTenants()}isAuthenticated(){return this.authenticated}async isAuthenticatedAsync(){return this.ensureSession()}getToken(){return this.tokenStorage.getToken()}getTenantSlug(){return this.config?.getTenantSlug()??b.defaultTenantSlug}setTenantSlug(e){this.config?.setTenantSlug(e)}};function T(e){let t=new xe(e.config.getTokenKey());return{authStorage:t,authService:new w(new ye(e.config,t),t,e.config)}}function E(e){return Array.isArray(e)?e:e&&typeof e==`object`&&Array.isArray(e.items)?e.items:[]}var D=class{http;constructor(e){this.http=e}async listByUser(){return E(await this.http.get(`/spreadsheets/user`))}create(e){return this.http.post(`/spreadsheets`,{name:e})}async delete(e){await this.http.delete(`/spreadsheets/${e}`)}};function O(e){let t=(e??``).trim();if(!t)throw Error(`El nombre de la planilla es requerido.`);return{name:t}}var k=class{repo;constructor(e){this.repo=e}listByUser(){return this.repo.listByUser()}create(e){let t=O(e);return this.repo.create(t.name)}delete(e){if(!e||e<=0)throw Error(`ID de planilla inválido`);return this.repo.delete(e)}};function A(e){return{spreadsheetService:new k(new D(e.http))}}function j(e){return Array.isArray(e)?e:e&&typeof e==`object`&&Array.isArray(e.items)?e.items:[]}var Ce=class{http;constructor(e){this.http=e}async listByUser(){return j(await this.http.get(`/prospects/user`))}getById(e){return this.http.get(`/prospects/${e}`)}create(e){return this.http.post(`/prospects`,e)}update(e,t){return this.http.put(`/prospects/${e}`,t)}async delete(e){await this.http.delete(`/prospects/${e}`)}async consultVotingPlace(e){let t=await this.http.postRaw(`/prospects/consult-voting-place`,{document:e}),n={};try{n=await t.json()}catch{}return t.status===401?{ok:!1,message:`Sesión expirada. Inicia sesión de nuevo.`}:t.ok?{ok:!0,place:n.place,department_place:n.department_place,city_place:n.city_place,table_place:n.table_place??null}:{ok:!1,message:n.message||n.error||`Error al consultar.`,manualProcessRequired:!!n.manualProcessRequired}}};function we(e){return new Promise(t=>setTimeout(t,e))}function Te(e){let t=String(e?.message||``).toLowerCase();return e instanceof TypeError||t.includes(`cors`)||t.includes(`failed to fetch`)||t.includes(`network`)}function Ee(e){let t=e.address||{},n={};n.department=t.state||t.region||t.county,n.city=t.city||t.town||t.village||t.municipality||t.city_district,t.suburb?n.zone=t.suburb:t.district?n.zone=t.district:t.city_district&&!t.city&&!t.town&&(n.zone=t.city_district),t.neighbourhood?n.neighborhood=t.neighbourhood:t.quarter?n.neighborhood=t.quarter:t.residential?n.neighborhood=t.residential:t.suburb&&!n.zone&&(n.neighborhood=t.suburb);let r=[];return t.road&&(r.push(t.road),t.house_number&&r.push(t.house_number)),r.length?n.address=r.join(` `):e.display_name&&(n.address=(e.display_name.split(`,`)[0]||``).trim()),n}var De=class{async reverse(e,t,n=2){let r=Math.max(1,n),i=null;for(let n=1;n<=r;n+=1)try{let n=await fetch(`https://nominatim.openstreetmap.org/reverse?format=json&lat=${e}&lon=${t}&addressdetails=1&accept-language=es&zoom=18`,{headers:{Accept:`application/json`}});if(!n.ok)throw Error(`Error de geocodificación (${n.status})`);return Ee(await n.json())}catch(e){if(i=e,!(nsetTimeout(t,e))}function ke(e){return new Promise((t,n)=>{navigator.geolocation.getCurrentPosition(t,n,e)})}var Ae=class{async getCurrentPosition(e=2){if(!(`geolocation`in navigator))throw Error(`Geolocalización no disponible en este dispositivo.`);let t=Math.max(1,e),n=null;for(let e=1;e<=t;e+=1){let r=e===1?{enableHighAccuracy:!0,timeout:1e4,maximumAge:0}:{enableHighAccuracy:!1,timeout:15e3,maximumAge:6e4};try{let e=await ke(r);return{latitude:e.coords.latitude,longitude:e.coords.longitude}}catch(r){n=r;let i=r?.code;if(!(e`u`?`/data/${t}`:new URL(`data/${t}`,document.baseURI).href}async function N(e){if(typeof DecompressionStream<`u`&&e.body){let t=e.body.pipeThrough(new DecompressionStream(`gzip`));return await new Response(t).text()}return e.text()}async function P(...e){let t=e.join(`/`),n=await fetch(M(`${t}.gz`));if(n.ok){let e=await N(n);return JSON.parse(e)}let r=await fetch(M(...e));if(!r.ok)throw Error(`HTTP ${r.status} ${t}`);return r.json()}var je=class{async loadDivipola(){return P(`geo`,`colombia-divipola.json`)}async loadVotingIndex(){return P(`voting`,`index.json`)}async loadMunicipioPuestos(e){let t=String(e).padStart(5,`0`),n=`voting/puestos/${t}.json`,r=await fetch(M(`${n}.gz`));if(r.status===404){let e=await fetch(M(`voting`,`puestos`,`${t}.json`));if(e.status===404)return null;if(!e.ok)throw Error(`Puestos ${t} HTTP ${e.status}`);return e.json()}if(!r.ok)throw Error(`Puestos ${t} HTTP ${r.status}`);let i=await N(r);return JSON.parse(i)}};function F(e){return String(e||``).replace(/\D+/g,``)}function I(e){return F(e).slice(0,10)}function L(e){return/^[0-9]+$/.test(String(e||``))}function Me(e){return/^3[0-9]{9}$/.test(String(e||``))}function R(e){return String(e||``).trim()||null}function Ne(e){let t=e.mobile==null?``:I(e.mobile);return{spreadsheet_id:e.spreadsheet_id??null,spreadsheet_name:e.spreadsheet_name??null,type_document:String(e.type_document||`CC`),document:F(e.document),name:String(e.name||``).trim(),mobile:t||null,address:R(e.address),latitude:e.latitude??null,longitude:e.longitude??null,department:String(e.department||``).trim(),city:String(e.city||``).trim(),zone:R(e.zone),neighborhood:R(e.neighborhood),department_place:R(e.department_place),place:R(e.place),city_place:R(e.city_place),table_place:e.table_place??null}}var Pe=class{repo;location;geocode;constructor(e,t,n){this.repo=e,this.location=t,this.geocode=n}listByUser(){return this.repo.listByUser()}getById(e){if(!e||e<=0)throw Error(`ID de prospecto inválido`);return this.repo.getById(e)}create(e,t={}){return this.assertValid(e,t.requireCoords!==!1),this.repo.create(e)}update(e,t){if(!e||e<=0)throw Error(`ID de prospecto inválido`);return this.assertValid(t,!1),this.repo.update(e,t)}delete(e){if(!e||e<=0)throw Error(`ID de prospecto inválido`);return this.repo.delete(e)}consultVotingPlace(e){let t=F(e);return L(t)?this.repo.consultVotingPlace(t):Promise.resolve({ok:!1,message:`El documento solo debe contener números.`})}async captureLocation(){let e=await this.location.getCurrentPosition();try{let t=await this.geocode.reverse(e.latitude,e.longitude);return{...e,address:t}}catch(t){return{...e,address:null,geocodeError:t instanceof Error?t.message:`Ubicación OK; dirección automática no disponible (red/CORS).`}}}buildInput(e,t){let n=e.spreadsheet_id,r=n?Number(n):null,i=t.find(e=>String(e.id)===n),a=e.latitude.trim(),o=e.longitude.trim(),s=e.table_place.trim();return Ne({spreadsheet_id:r,spreadsheet_name:i?.name||null,type_document:e.type_document||`CC`,document:e.document,name:e.name,mobile:e.mobile||null,address:e.address||null,latitude:a?Number(a):null,longitude:o?Number(o):null,department:e.department,city:e.city,zone:e.zone||null,neighborhood:e.neighborhood||null,department_place:e.department_place||null,place:e.place||null,city_place:e.city_place||null,table_place:s?Number(s):null})}assertValid(e,t){if(!L(e.document))throw Error(`El documento debe contener solo números, sin espacios.`);if(e.mobile&&!Me(e.mobile))throw Error(`El celular debe iniciar en 3 y tener 10 dígitos, sin espacios.`);if(!String(e.name||``).trim())throw Error(`El nombre es requerido.`);if(t){if(e.latitude==null||e.longitude==null)throw Error(`Por favor, usa el botón "Usar mi ubicación" para obtener las coordenadas antes de guardar.`);if(Number.isNaN(e.latitude)||Number.isNaN(e.longitude))throw Error(`Las coordenadas de ubicación no son válidas. Por favor, usa el botón "Usar mi ubicación" nuevamente.`)}}},Fe=class{catalog;constructor(e){this.catalog=e}listDepartments(e=``){return this.catalog.listDepartments(e)}listCities(e,t=``){return this.catalog.listCities(e,t)}listPuestos(e,t,n=``){return this.catalog.listPuestos(e,t,n)}listMesas(e,t,n,r=``){return this.catalog.listMesas(e,t,n,r)}resolveFromConsult(e){return this.catalog.resolveFromConsult(e)}};function z(e){return e.normalize(`NFD`).replace(/\p{M}/gu,``).toLowerCase().trim()}function B(e,t,n){let r=z(t);return r?e.filter(e=>z(n(e)).includes(r)):e}function V(e,t){let n=z(t);return n?e.find(e=>z(e.name)===n)??null:null}function Ie(e,t){let n=z(t);return n?e.find(e=>z(e.name)===n)??null:null}function H(e,t){let n=z(t);if(!n)return null;for(let t of e.departments){let e=t.cities.find(e=>z(e.name)===n);if(e)return{department:t,city:e}}return null}function Le(e,t){let n=z(t);return n?e.find(e=>z(e.name)===n)??null:null}function Re(e,t,n){return t===`department`?{department_place:n,city_place:``,place:``,table_place:``}:t===`city`?{city_place:n,place:``,table_place:``}:t===`place`?{place:n,table_place:``}:{table_place:n}}var ze=class{port;divipolaPromise=null;votingIdsPromise=null;puestosCache=new Map;constructor(e){this.port=e}loadDivipola(){return this.divipolaPromise||=this.port.loadDivipola(),this.divipolaPromise}loadVotingIds(){return this.votingIdsPromise||=this.port.loadVotingIndex().then(e=>new Set((e.municipioIds||[]).map(e=>String(e).padStart(5,`0`)))).catch(()=>new Set),this.votingIdsPromise}async listDepartments(e=``){return B((await this.loadDivipola()).departments,e,e=>e.name)}async listCities(e,t=``){let n=V((await this.loadDivipola()).departments,e);return n?B(n.cities,t,e=>e.name):[]}async resolveMunicipioId(e,t){let n=V((await this.loadDivipola()).departments,e);return n?Ie(n.cities,t)?.code??null:null}async hasPuestosCatalog(e){return(await this.loadVotingIds()).has(String(e).padStart(5,`0`))}loadMunicipioPuestos(e){let t=String(e).padStart(5,`0`),n=this.puestosCache.get(t);return n||(n=this.port.loadMunicipioPuestos(t),this.puestosCache.set(t,n)),n}async listPuestos(e,t,n=``){let r=await this.resolveMunicipioId(e,t);return!r||!await this.hasPuestosCatalog(r)?{puestos:[],fromCatalog:!1}:{puestos:B((await this.loadMunicipioPuestos(r))?.puestos??[],n,e=>e.name),fromCatalog:!0}}async listMesas(e,t,n,r=``){let{puestos:i,fromCatalog:a}=await this.listPuestos(e,t,``);if(!a)return{mesas:[],fromCatalog:!1};let o=Le(i,n);return o?{mesas:B(o.mesas,r,e=>e),fromCatalog:!0}:{mesas:[],fromCatalog:!0}}async resolveFromConsult(e){if(!e.trim())return null;let t=H(await this.loadDivipola(),e);return t?{department_place:t.department.name,city_place:t.city.name}:null}};function Be(e){let t=new ze(new je);return{prospectService:new Pe(new Ce(e.http),new Ae,new De),votingPlaceCatalogService:new Fe(t)}}var Ve=class{notifications;constructor(e){this.notifications=e}info(e){this.notifications.info(e)}error(e){this.notifications.error(e)}},He=class{pwa;constructor(e){this.pwa=e}canInstall(){return this.pwa.canInstall()}promptInstall(){return this.pwa.promptInstall()}clearCachesAndReload(){return this.pwa.clearCachesAndReload()}},Ue=class{services;constructor(){let e=S(),t=T({config:e}),n=new ge(t.authStorage,{config:e}),r=Be({http:n});this.services={authService:t.authService,spreadsheetService:A({http:n}).spreadsheetService,prospectService:r.prospectService,votingPlaceCatalogService:r.votingPlaceCatalogService,pwaService:new He(new _e),feedbackService:new Ve(new ve)}}getServices(){return this.services}},U=null;function W(){return U||=new Ue,U.getServices()}var G=ne(),K=(0,m.createContext)(null);function We({children:e}){let t=(0,m.useMemo)(()=>W(),[]),n=ee();return(0,m.useEffect)(()=>{let e=()=>{window.location.pathname!==`/login`&&(t.authService.logout().catch(()=>{}),n(`/login`,{replace:!0}))};return window.addEventListener(h,e),()=>window.removeEventListener(h,e)},[t,n]),(0,G.jsx)(K.Provider,{value:t,children:e})}function q(){let e=(0,m.useContext)(K);if(!e)throw Error(`useServices must be used within `);return e}var J=({isActive:e})=>[`flex-1 text-center text-xs py-2 rounded-full active:scale-[0.98] transition font-medium`,e?`bg-slate-800 text-slate-100`:`bg-slate-900 text-slate-400`].join(` `);function Ge(){let{pwaService:e,feedbackService:t}=q(),{pathname:n}=a(),i=n===`/prospects`||/^\/prospects\/\d+/.test(n),[o,s]=(0,m.useState)(typeof navigator<`u`?navigator.onLine:!0),[l,u]=(0,m.useState)(e.canInstall());return(0,m.useEffect)(()=>{let e=()=>s(!0),t=()=>s(!1),n=()=>u(!0),r=()=>u(!1);return window.addEventListener(`online`,e),window.addEventListener(`offline`,t),window.addEventListener(`pwa:install-available`,n),window.addEventListener(`pwa:installed`,r),()=>{window.removeEventListener(`online`,e),window.removeEventListener(`offline`,t),window.removeEventListener(`pwa:install-available`,n),window.removeEventListener(`pwa:installed`,r)}},[]),(0,G.jsxs)(`div`,{className:`max-w-sm mx-auto min-h-screen flex flex-col bg-slate-950 safe-top safe-bottom`,children:[(0,G.jsxs)(`header`,{className:`px-4 pt-3 pb-2 flex items-center justify-between border-b border-slate-800/80 bg-slate-950/90 backdrop-blur`,children:[(0,G.jsxs)(`div`,{className:`flex items-center gap-2`,children:[(0,G.jsxs)(`picture`,{children:[(0,G.jsx)(`source`,{srcSet:`/icons/main.webp`,type:`image/webp`}),(0,G.jsx)(`img`,{src:`/icons/icon-192.png`,alt:`Asistente Político`,className:`w-8 h-8 rounded-2xl object-cover`})]}),(0,G.jsxs)(`div`,{children:[(0,G.jsx)(`p`,{className:`text-sm font-semibold leading-none`,children:`Asistente Político`}),(0,G.jsx)(`p`,{className:`text-[11px] text-slate-400 mt-0.5`,children:`Campo · Organización de prospectos`})]})]}),(0,G.jsx)(d,{method:`post`,action:`/logout`,children:(0,G.jsx)(`button`,{type:`submit`,className:`text-[11px] px-2 py-1 rounded-full border border-slate-700 text-slate-300 active:scale-[0.97] transition`,children:`Cerrar sesión`})})]}),(0,G.jsxs)(`div`,{className:`flex px-3 pt-2 pb-1 gap-1.5 bg-slate-950 sticky top-0 z-10`,children:[(0,G.jsx)(c,{to:`/spreadsheets`,className:J,end:!0,children:`Planillas`}),(0,G.jsx)(c,{to:`/prospects/new`,className:J,children:`Prospecto`}),(0,G.jsx)(c,{to:`/prospects`,className:()=>J({isActive:i}),end:!0,children:`Lista`})]}),(0,G.jsx)(`main`,{className:`flex-1 overflow-y-auto overflow-x-hidden px-4 pb-4 pt-2`,children:(0,G.jsx)(r,{})}),(0,G.jsxs)(`footer`,{className:`px-4 py-2.5 border-t border-slate-800 text-[10px] text-slate-500 flex items-center justify-between bg-slate-950/95 backdrop-blur safe-bottom`,children:[(0,G.jsxs)(`span`,{className:`flex items-center gap-1`,children:[(0,G.jsx)(`span`,{className:`w-1.5 h-1.5 rounded-full ${o?`bg-emerald-500`:`bg-amber-500`}`}),(0,G.jsx)(`span`,{children:o?` Conectado`:` Sin conexión`})]}),(0,G.jsxs)(`div`,{className:`flex items-center gap-2`,children:[(0,G.jsx)(`button`,{type:`button`,className:`px-2 py-1 text-[9px] bg-slate-700 text-slate-200 rounded hover:bg-slate-600 active:scale-95 transition`,title:`Limpiar caché y actualizar aplicación`,onClick:()=>{confirm(`¿Limpiar caché y recargar con la última versión?`)&&e.clearCachesAndReload().catch(()=>{location.replace(`${location.origin}${location.pathname}?_nocache=1&_t=${Date.now()}`)})},children:`Actualizar`}),l?(0,G.jsx)(`button`,{type:`button`,className:`px-2 py-1 text-[9px] bg-primary-600 text-white rounded hover:bg-primary-700 transition`,title:`Instalar aplicación`,onClick:()=>{e.promptInstall().then(n=>{n||t.info(`Instalación no disponible ahora.`),u(e.canInstall())})},children:`Instalar`}):null,(0,G.jsx)(`span`,{children:`v0.2 · PWA`})]})]})]})}function Ke(e){return e instanceof Error?e.message:typeof e==`string`?e:`An unexpected error occurred`}function qe(){let e=s(),t=o(e)?`${e.status} ${e.statusText}`:Ke(e);return(0,G.jsxs)(`div`,{className:`max-w-sm mx-auto min-h-screen flex flex-col justify-center px-4 bg-slate-950 text-slate-50`,children:[(0,G.jsx)(`h1`,{className:`text-lg font-semibold mb-2`,children:`Algo salió mal`}),(0,G.jsx)(`p`,{className:`text-sm text-slate-400 mb-4`,children:t}),(0,G.jsx)(te,{to:`/login`,className:`text-sm text-primary-600 underline`,children:`Ir al login`})]})}async function Y(){let{authService:e}=W();if(!await e.ensureSession())throw t(`/login`);return null}async function Je(){let{authService:e}=W();if(await e.ensureSession())throw t(`/spreadsheets`);return null}async function Ye(){await Je();let{authService:e}=W(),t=e.getTenantSlug();try{return{tenants:await e.listLoginTenants(),defaultTenantSlug:t}}catch(e){return{tenants:[],defaultTenantSlug:t,tenantsError:e instanceof Error?e.message:`No se pudieron cargar las organizaciones.`}}}async function Xe(){await Y();let{spreadsheetService:e,prospectService:t}=W();try{let n=await e.listByUser(),r={};try{let e=await t.listByUser();for(let t of e){let e=t.spreadsheet_id;e!=null&&(r[e]=(r[e]||0)+1)}}catch{r={}}return{spreadsheets:n.map(e=>({...e,prospectCount:r[e.id]??0}))}}catch(e){return{spreadsheets:[],error:e instanceof Error?e.message:`No se pudieron cargar las planillas.`}}}async function Ze({request:e}){await Y();let{spreadsheetService:t}=W(),n=new URL(e.url).searchParams.get(`spreadsheetId`)||``;try{let e=await t.listByUser();return{spreadsheets:e,defaultSpreadsheetId:e.some(e=>String(e.id)===n)?n:``}}catch(e){return{spreadsheets:[],defaultSpreadsheetId:``,error:e instanceof Error?e.message:`No se pudieron cargar las planillas.`}}}async function Qe(){await Y();let{prospectService:e}=W();try{return{prospects:[...await e.listByUser()].sort((e,t)=>(e.name||``).localeCompare(t.name||``,`es`,{sensitivity:`base`}))}}catch(e){return{prospects:[],error:e instanceof Error?e.message:`No se pudieron cargar los prospectos.`}}}async function $e({params:e}){await Y();let t=Number(e.id);if(!t||Number.isNaN(t)||t<=0)throw new Response(`Prospecto no encontrado`,{status:404});let{prospectService:n,spreadsheetService:r}=W(),[i,a]=await Promise.all([n.getById(t),r.listByUser()]);return{prospect:i,spreadsheets:a}}function X(e){return{spreadsheet_id:String(e.get(`spreadsheet_id`)||``),type_document:String(e.get(`type_document`)||`CC`),document:String(e.get(`document`)||``),name:String(e.get(`name`)||``),mobile:String(e.get(`mobile`)||``),address:String(e.get(`address`)||``),latitude:String(e.get(`latitude`)||``),longitude:String(e.get(`longitude`)||``),department:String(e.get(`department`)||``),city:String(e.get(`city`)||``),zone:String(e.get(`zone`)||``),neighborhood:String(e.get(`neighborhood`)||``),department_place:String(e.get(`department_place`)||``),place:String(e.get(`place`)||``),city_place:String(e.get(`city_place`)||``),table_place:String(e.get(`table_place`)||``)}}async function et({request:e}){let n=await e.formData(),r=String(n.get(`email`)||``),i=String(n.get(`password`)||``),a=String(n.get(`tenantSlug`)||``).trim(),{authService:o}=W();a&&o.setTenantSlug(a);try{throw await o.login(r,i),t(`/spreadsheets`)}catch(e){if(e instanceof Response)throw e;return{error:e instanceof Error?e.message:`Error al iniciar sesión.`}}}async function tt(){try{await W().authService.logout()}catch{}throw t(`/login`)}async function nt({request:e}){let t=await e.formData(),n=String(t.get(`intent`)||`create`),{spreadsheetService:r}=W();try{if(n===`delete`){let e=Number(t.get(`id`));return await r.delete(e),{ok:!0,intent:`delete`}}let e=String(t.get(`name`)||``);return{ok:!0,intent:`create`,id:(await r.create(e)).id}}catch(e){if(e instanceof Response)throw e;return{ok:!1,error:e instanceof Error?e.message:`No se pudo completar la acción.`}}}async function rt({request:e}){let n=await e.formData(),{prospectService:r,spreadsheetService:i}=W();try{let e=await i.listByUser(),a=X(n),o=r.buildInput(a,e);throw await r.create(o,{requireCoords:!0}),t(`/prospects`)}catch(e){if(e instanceof Response)throw e;return{ok:!1,error:e instanceof Error?e.message:`No se pudo guardar el prospecto.`}}}async function it({request:e}){let t=await e.formData();if(String(t.get(`intent`))!==`delete`)return{ok:!1,error:`Acción no soportada.`};try{return await W().prospectService.delete(Number(t.get(`id`))),{ok:!0}}catch(e){if(e instanceof Response)throw e;return{ok:!1,error:e instanceof Error?e.message:`No se pudo eliminar.`}}}async function at({request:e,params:t}){let n=Number(t.id),r=await e.formData(),{prospectService:i,spreadsheetService:a}=W();try{let e=await a.listByUser(),t=X(r),o=i.buildInput(t,e);return await i.update(n,o),{ok:!0,message:`Prospecto actualizado correctamente.`}}catch(e){if(e instanceof Response)throw e;return{ok:!1,error:e instanceof Error?e.message:`No se pudo actualizar el prospecto.`}}}var Z=`w-full px-3 py-2.5 rounded-xl bg-slate-900/80 border border-slate-800 text-sm placeholder-slate-500 focus:outline-none focus:ring-2 focus:ring-primary-600 focus:border-transparent`;function ot(){let{tenants:e,defaultTenantSlug:t,tenantsError:n}=i(),r=re(),a=u().state!==`idle`,o=e.length>0,s=e.some(e=>e.slug===t)?t:e[0]?.slug||``;return(0,G.jsxs)(`div`,{className:`max-w-sm mx-auto min-h-screen flex flex-col bg-slate-950 safe-top safe-bottom px-4 pt-8 pb-4`,children:[(0,G.jsx)(`title`,{children:`Login · Asistente Político`}),(0,G.jsxs)(`div`,{className:`mb-8 flex flex-col items-center`,children:[(0,G.jsxs)(`picture`,{children:[(0,G.jsx)(`source`,{srcSet:`/icons/main.webp`,type:`image/webp`}),(0,G.jsx)(`img`,{src:`/icons/icon-192.png`,alt:`Asistente Político`,className:`w-20 h-20 rounded-3xl mb-4 object-cover`})]}),(0,G.jsx)(`h1`,{className:`text-2xl font-semibold mb-1`,children:`Bienvenido`}),(0,G.jsx)(`p`,{className:`text-sm text-slate-400 text-center`,children:`Inicia sesión para gestionar tus planillas y registrar prospectos en campo.`})]}),(0,G.jsxs)(d,{method:`post`,className:`space-y-4`,children:[(0,G.jsxs)(`div`,{className:`space-y-1.5`,children:[(0,G.jsx)(`label`,{htmlFor:`tenantSlug`,className:`text-xs font-medium text-slate-300`,children:`Organización (tenant)`}),o?(0,G.jsx)(`select`,{id:`tenantSlug`,name:`tenantSlug`,required:!0,defaultValue:s,className:`${Z} appearance-auto`,children:e.map(e=>(0,G.jsxs)(`option`,{value:e.slug,children:[e.name,` (`,e.slug,`)`]},e.slug))}):(0,G.jsx)(`input`,{id:`tenantSlug`,name:`tenantSlug`,type:`text`,autoComplete:`organization`,defaultValue:t,required:!0,className:Z,placeholder:`default`}),n?(0,G.jsxs)(`p`,{className:`text-xs text-amber-400`,children:[n,` Puedes escribir el slug manualmente.`]}):null]}),(0,G.jsxs)(`div`,{className:`space-y-1.5`,children:[(0,G.jsx)(`label`,{htmlFor:`email`,className:`text-xs font-medium text-slate-300`,children:`Correo`}),(0,G.jsx)(`input`,{id:`email`,name:`email`,type:`email`,autoComplete:`email`,required:!0,className:Z,placeholder:`tucorreo@ejemplo.com`})]}),(0,G.jsxs)(`div`,{className:`space-y-1.5`,children:[(0,G.jsx)(`label`,{htmlFor:`password`,className:`text-xs font-medium text-slate-300`,children:`Contraseña`}),(0,G.jsx)(`input`,{id:`password`,name:`password`,type:`password`,autoComplete:`current-password`,required:!0,className:Z,placeholder:`••••••••`})]}),(0,G.jsx)(`button`,{type:`submit`,disabled:a,className:`w-full mt-2 inline-flex items-center justify-center gap-2 px-4 py-2.5 rounded-xl bg-primary-600 text-sm font-medium active:scale-[0.98] transition text-white shadow-sm shadow-primary-900/60 disabled:opacity-60`,children:a?`Ingresando…`:`Ingresar`})]}),r?.error?(0,G.jsx)(`p`,{className:`mt-4 text-xs text-red-400 bg-red-950/40 border border-red-900 rounded-lg px-3 py-2`,children:r.error}):null]})}var st=(0,m.lazy)(()=>f(()=>import(`./SpreadsheetsPage-xNc8TSM_.js`).then(e=>({default:e.SpreadsheetsPage})),__vite__mapDeps([0,1,2]))),ct=(0,m.lazy)(()=>f(()=>import(`./NewProspectPage-Da8irItg.js`).then(e=>({default:e.NewProspectPage})),__vite__mapDeps([3,1,2,4]))),lt=(0,m.lazy)(()=>f(()=>import(`./ProspectsListPage-CPRP9OYR.js`).then(e=>({default:e.ProspectsListPage})),__vite__mapDeps([5,2,1]))),ut=(0,m.lazy)(()=>f(()=>import(`./ProspectDetailPage-CftLgbxN.js`).then(e=>({default:e.ProspectDetailPage})),__vite__mapDeps([6,1,2,4])));function Q(e){return(0,G.jsx)(m.Suspense,{fallback:(0,G.jsx)(`div`,{className:`flex justify-center py-16 text-sm text-slate-400`,children:`Cargando…`}),children:e})}function dt(){return(0,G.jsx)(We,{children:(0,G.jsx)(r,{})})}var ft=n([{element:(0,G.jsx)(dt,{}),errorElement:(0,G.jsx)(qe,{}),hydrateFallbackElement:(0,G.jsx)(G.Fragment,{}),children:[{path:`/login`,loader:Ye,action:et,hydrateFallbackElement:(0,G.jsx)(G.Fragment,{}),element:(0,G.jsx)(ot,{})},{path:`/logout`,action:tt,element:(0,G.jsx)(p,{to:`/login`,replace:!0})},{loader:Y,element:(0,G.jsx)(Ge,{}),children:[{index:!0,element:(0,G.jsx)(p,{to:`/spreadsheets`,replace:!0})},{path:`spreadsheets`,loader:Xe,action:nt,element:Q((0,G.jsx)(st,{}))},{path:`prospects/new`,loader:Ze,action:rt,element:Q((0,G.jsx)(ct,{}))},{path:`prospects`,loader:Qe,action:it,element:Q((0,G.jsx)(lt,{}))},{path:`prospects/:id`,loader:$e,action:at,element:Q((0,G.jsx)(ut,{}))}]},{path:`*`,element:(0,G.jsx)(p,{to:`/`,replace:!0})}]}]);(0,oe.createRoot)(document.getElementById(`app`)).render((0,G.jsx)(m.StrictMode,{children:(0,G.jsx)(l,{router:ft})}));var $=document.getElementById(`loading-screen`);$&&requestAnimationFrame(()=>{$.classList.add(`hidden`),window.setTimeout(()=>$.remove(),320)}),`serviceWorker`in navigator&&window.addEventListener(`load`,()=>{navigator.serviceWorker.register(`/sw.js`,{scope:`/`}).then(e=>{e.addEventListener(`updatefound`,()=>{let t=e.installing;t?.addEventListener(`statechange`,()=>{t.state===`installed`&&navigator.serviceWorker.controller&&confirm(`Hay una nueva versión. ¿Actualizar?`)&&(t.postMessage({type:`SKIP_WAITING`}),location.reload())})})}).catch(e=>console.error(`[SW]`,e)),navigator.serviceWorker.addEventListener(`controllerchange`,()=>location.reload())});export{F as i,Re as n,I as r,q as t};