vendor: 4,778 bytes, line 1
1import{u as Do,j as Io,r as d,l as L,B as Je,q as Uo,c as s,b as o,e as f,i as h,a as pe,h as Vo,p as q,f as g,z as D,F as I,x as O,v as E,t as i,d as Ge,A as Oo,g as No,m as $e,w as We,C as Fo,E as Lo,G as To,D as Qe,_ as zo,H as Bo,I as Ye,J as Ho,K as Ze,o as r,L as Ke,M as Xe}from"#entry";import{_ as qo}from"./WWy_r-EY.js";import{t as eo}from"./UdKP_XCG.js";import{n as ce}from"./q3U5rlDj.js";import{u as Jo,f as Pe,r as Go,t as Wo,b as Qo}from"./B-jTRGN7.js";import{d as oo,u as ao}from"./nDhKAmaK.js";import{i as Ee,u as Yo,C as Re,A as fe,M as to,a as lo,g as Zo,b as Ko,c as Xo}from"./DRq45blS.js";import{u as ea}from"./GyODDOTC.js";import"./BsqTxom4.js";import"./CaVVEZRR.js";const oa={class:"mb-8"},aa={class:"mt-1 text-sm text-slate-600"},ta={class:"mb-6 border-b border-slate-200/90"},la={class:"flex gap-6"},sa={key:0,class:"space-y-6"},ra={class:"bg-white rounded-lg border border-slate-200/80 p-6"},na={class:"grid grid-cols-1 md:grid-cols-2 lg:grid-cols-5 gap-4"},ia=["value"],ua={class:"grid grid-cols-1 md:grid-cols-3 gap-6"},da={class:"bg-white rounded-lg border border-slate-200/80 p-6"},ca={class:"flex items-center justify-between"},ga={class:"text-3xl font-bold text-gray-900 mt-1"},ma={class:"bg-white rounded-lg border border-slate-200/80 p-6"},va={class:"flex items-center justify-between"},ba={class:"text-3xl font-bold text-gray-900 mt-1"},pa={class:"bg-white rounded-lg border border-slate-200/80 p-6"},fa={class:"flex items-center justify-between"},xa={class:"text-3xl font-bold text-gray-900 mt-1"},ya={class:"bg-white rounded-lg border border-slate-200/80 p-6"},ha={class:"flex flex-col gap-4 mb-6"},ka={class:"flex flex-col sm:flex-row sm:justify-between sm:items-center gap-4"},wa={class:"flex flex-wrap items-center gap-3"},Ca={class:"flex items-center gap-2 text-sm text-gray-600"},Sa={key:0,class:"flex flex-wrap items-center gap-3 px-4 py-3 bg-red-50 border border-red-200 rounded-lg"},Aa={class:"text-sm font-medium text-red-900"},$a=["disabled"],Pa={key:0,class:"flex items-center justify-center h-64"},Ea={key:1,class:"overflow-x-auto"},Ra={class:"w-full"},_a={class:"border-b border-gray-200"},Ma={class:"w-10 py-3 px-3"},ja=["checked"],Da={class:"py-3 px-3 align-top"},Ia=["checked","aria-label","onChange"],Ua={class:"py-3 px-4"},Va={class:"font-medium text-gray-900"},Oa={class:"text-sm text-gray-500 truncate max-w-xs"},Na={class:"py-3 px-4"},Fa={class:"flex flex-col gap-1"},La={key:0,class:"bg-violet-100 text-violet-800 px-2 py-1 rounded-full text-xs font-medium w-fit"},Ta={key:1,class:"bg-blue-100 text-blue-800 px-2 py-1 rounded-full text-xs font-medium w-fit"},za={key:2,class:"text-xs text-gray-500"},Ba={class:"py-3 px-4 text-sm text-gray-600"},Ha={class:"py-3 px-4 text-sm text-gray-600"},qa={class:"py-3 px-4"},Ja={class:"text-sm text-gray-600"},Ga={key:0,class:"text-xs text-gray-500 block"},Wa={class:"py-3 px-4"},Qa={class:"font-semibold text-gray-900"},Ya={class:"py-3 px-4"},Za={class:"py-3 px-4 align-top"},Ka={class:"flex flex-col gap-2 min-w-[220px] max-w-xs"},Xa=["title"],et=["href"],ot={class:"py-3 px-4 align-top whitespace-nowrap"},at=["onClick"],tt=["disabled","onClick"],lt={class:"mt-6 flex flex-col sm:flex-row sm:items-center sm:justify-between gap-4 pt-4 border-t border-gray-200"},st={class:"text-sm text-gray-600"},rt={class:"font-medium text-gray-900"},nt={class:"font-medium text-gray-900"},it={class:"font-medium text-gray-900"},ut={key:0},dt={class:"flex items-center gap-2"},ct=["disabled"],gt={class:"text-sm text-gray-600 px-2"},mt=["disabled"],vt={key:2,class:"text-center py-12"},bt={class:"flex justify-center mb-4"},pt={key:1,class:"space-y-6"},ft={class:"bg-white rounded-lg border border-slate-200/80 p-6"},xt={class:"grid grid-cols-1 md:grid-cols-2 gap-4"},yt={key:0,class:"bg-white rounded-lg border border-slate-200/80 p-6"},ht={class:"space-y-4"},kt={key:0,class:"bg-gray-50 rounded-lg p-4"},wt={class:"text-sm text-gray-600 space-y-1"},Ct={key:1,class:"space-y-2"},St={class:"flex justify-between text-sm text-gray-600"},At={class:"w-full bg-gray-200 rounded-full h-2.5"},$t={class:"text-xs text-gray-500"},Pt={key:0,class:"flex items-center gap-2"},Et={key:1,class:"flex items-center gap-2 text-amber-700"},Rt={class:"flex space-x-4"},_t=["disabled"],Mt={key:0},jt={key:1},Dt={class:"font-medium"},It={key:0,class:"text-sm mt-2"},Ut={class:"flex flex-wrap items-center justify-between gap-3 mb-4"},Vt={class:"text-xl font-semibold text-gray-900"},Ot={key:0,class:"text-sm text-gray-500"},Nt=["href"],Ft={class:"mb-6"},Lt={class:"grid grid-cols-1 sm:grid-cols-2 gap-3"},Tt=["disabled"],zt=["disabled"],Bt={class:"grid grid-cols-1 md:grid-cols-2 gap-6"},Ht=["value"],qt=["value"],Jt={class:"md:col-span-2"},Gt={class:"flex items-center gap-2 text-sm font-medium text-gray-700 mb-3
1cursor-pointer"},Wt={key:0,class:"max-w-xs"},Qt=["value"],Yt={key:1,class:"grid grid-cols-1 sm:grid-cols-2 gap-4 max-w-xl"},Zt=["value"],Kt=["value"],Xt={key:2,class:"mt-2 text-xs text-gray-500"},el={key:1},ol=["value"],al=["value"],tl={class:"block text-sm font-medium text-gray-700 mb-2"},ll={key:0,class:"text-xs text-blue-700 mb-2"},sl={key:1,class:"text-xs text-blue-700 mb-2"},rl=["required"],nl=["value"],il=["placeholder"],ul={class:"md:col-span-2"},dl={class:"md:col-span-2"},cl={class:"block text-sm font-medium text-gray-700 mb-2"},gl={class:"font-normal text-slate-500"},ml=["disabled"],vl={key:0,class:"mt-1 text-xs text-amber-600"},bl={key:1,class:"mt-1 text-xs text-amber-600"},pl={key:2,class:"mt-2 text-sm text-gray-600 flex items-center gap-2"},fl={key:3,class:"mt-2 text-sm text-red-600"},xl={key:4,class:"mt-4 grid grid-cols-2 sm:grid-cols-4 gap-3"},yl=["src","alt"],hl={key:0,class:"absolute top-1 left-1 text-[10px] font-semibold uppercase bg-slate-900/80 text-white px-1.5 py-0.5 rounded"},kl=["onClick"],wl={class:"flex flex-wrap justify-end gap-3"},Cl=["disabled"],Sl={key:0},Al={key:1},te=4,Ol={__name:"inventario",setup($l){Do({title:"Inventario - Panel Admin",meta:[{name:"robots",content:"noindex, nofollow"}]});const{$firestore:so}=Io(),{crearRepuesto:xe,actualizarRepuesto:_e}=Jo(),ge=d(null),le=d(!1),ye=d(""),M=d(1),J=d(50),x=d([]),{getCategorias:ro,getModelosByMarca:Me,getMarcas:no}=ea(),je=L(()=>no().slice().sort((a,e)=>a.nombre.localeCompare(e.nombre))),C=d(null),he=d(null),N=d("ver"),W=d("json"),ke=d(!1),se=d(!1),T=d(!1),K=d(0),X=d(0),Q=d(0),z=d(0),_=d([]),y=d({marca:"",anio:null,modelo:"",categoria:"",subcategoria:""}),ee=d(""),Y=d("nombre"),re=d([]),$=d([]),k=d([]),U=d([]),we=d(null),R=d(null),b=d(null),w=d("vehiculo"),t=d({marca:"",modelo:"",anio:null,usarRangoAnios:!1,anioDesde:null,anioHasta:null,categoria:"",subcategoria:"",marcaRepuesto:"",nombre:"",descripcion:"",precio:"",url:"",imagenes:[],stock:!0}),me=a=>Ee(a),De=L(()=>w.value==="universal"?Zo(t.value.categoria)?.subcategorias||[]:U.value),Ie=a=>{C.value||(w.value=a,t.value.categoria="",t.value.subcategoria="",U.value=[],a==="universal"?(t.value.marca="",t.value.modelo="",t.value.modeloExacto="",t.value.anio=null,t.value.usarRangoAnios=!1,t.value.anioDesde=null,t.value.anioHasta=null,$.value=[],k.value=[]):t.value.marcaRepuesto="",j.value="")},io=()=>{t.value.subcategoria=""},uo=a=>Pe(a)||a.anio||"â",Ue=L(()=>{const a=t.value;return a.usarRangoAnios?a.anioDesde??a.anioHasta:a.anio}),co=()=>{if(t.value.usarRangoAnios){const a=t.value.anio;t.value.anioDesde=t.value.anioDesde??a,t.value.anioHasta=t.value.anioHasta??a,t.value.anio=null}else t.value.anio=t.value.anioDesde??t.value.anioHasta??t.value.anio,t.value.anioDesde=null,t.value.anioHasta=null},ne=d(null),ie=d(!1),j=d(""),Ce=L(()=>w.value==="universal"?!!t.value.categoria:!!(t.value.marca&&t.value.modelo&&Ue.value)),go=async a=>{j.value="";const e=Array.from(a.target.files||[]);if(ne.value&&(ne.value.value=""),!e.length)return;if(!Ce.value){j.value=w.value==="universal"?"Elige la categorÃa antes de subir fotos.":"Completa marca, modelo y año antes de subir fotos.";return}const n=te-t.value.imagenes.length;if(n<=0){j.value="Ya tienes 4 fotos. Elimina una para agregar otra.";return}const u=e.slice(0,n);e.length>n&&(j.value=`Solo se agregaron ${n} foto(s). Máximo ${te} en total.`),ie.value=!0;try{for(const l of u){const c=w.value==="universal"?await ao(l,{marca:lo,modelo:to,anio:fe,catalogo:Re,categoria:t.value.categoria}):await ao(l,{marca:t.value.marca,modelo:t.value.modelo,anio:Ue.value});t.value.imagenes.push(c)}}catch(l){j.value=l?.data?.message||l?.message||"Error al subir la imagen"}finally{ie.value=!1}},mo=a=>{t.value.imagenes.splice(a,1),j.value=""},V=L(()=>{let a=[..._.value];if(y.value.marca&&(a=a.filter(e=>e.marca===y.value.marca)),y.value.anio&&(a=a.filter(e=>Go(e,y.value.anio))),y.value.modelo&&(a=a.filter(e=>e.modelo.toLowerCase().includes(y.value.modelo.toLowerCase()))),y.value.categoria&&(a=a.filter(e=>e.categoria.toLowerCase().includes(y.value.categoria.toLowerCase()))),y.value.subcategoria&&(a=a.filter(e=>e.subcategoria?.toLowerCase().includes(y.value.subcategoria.toLowerCase()))),ee.value){const e=ee.value.toLowerCase();a=a.filter(n=>n.nombre.toLowerCase().includes(e)||n.descripcion.toLowerCase().includes(e))}return Y.value==="nombre"?a.sort((e,n)=>e.nombre.localeCompare(n.nombre)):Y.value==="precio"?a.sort((e,n)=>{const u=parseFloat(e.precio.toString().replace("$","").replace(",",""))||0,l=parseFloat(n.precio.toString().replace("$","").replace(",",""))||0;return u-l}):Y.value==="precio-desc"?a.sort((e,n)=>{const u=parseFloat(e.precio.toString().replace("$","").replace(",",""))||0;return(parseFloat(n.precio.toString().replace("$","").replace(",",""))||0)-u}):Y.value==="fecha"&&a.sort((e,n)=>{const u=e.createdAt instanceof Date?e.createdAt:new Date(e.createdAt||0);return(n.createdAt instanceof Date?n.createdAt:new Date(n.createdAt||0)).getTime()-u.getTime()}),a}),ue=L(()=>Math.max(1,Math.ceil(V.value.length/J.value))),Se=L(()=>{const a=(M.value-1)*J.value;return V.value.slice(a,a+J.value)}),Ve=L(()=>
1{if(V.value.length===0)return{desde:0,hasta:0};const a=(M.value-1)*J.value+1,e=Math.min(M.value*J.value,V.value.length);return{desde:a,hasta:e}}),Oe=a=>x.value.includes(a),Ne=L(()=>{const a=Se.value;return a.length>0&&a.every(e=>x.value.includes(e.id))});Je(()=>V.value.length,()=>{M.value>ue.value&&(M.value=ue.value)}),Je([ee,Y,J,()=>({...y.value})],()=>{M.value=1});const Fe=a=>{const e=Math.min(Math.max(1,a),ue.value);M.value=e},vo=a=>{x.value.includes(a)?x.value=x.value.filter(e=>e!==a):x.value=[...x.value,a]},bo=()=>{const a=Se.value.map(e=>e.id);if(Ne.value)x.value=x.value.filter(e=>!a.includes(e));else{const e=new Set([...x.value,...a]);x.value=[...e]}},po=()=>{x.value=V.value.map(a=>a.id)},fo=()=>{x.value=[]},xo=L(()=>_.value.filter(a=>a.stock).length),Le=()=>{{const{hostname:a,origin:e}=window.location;return a==="localhost"||a==="127.0.0.1"?"https://autopiezas360.cl":e}},oe=a=>{if(!a)return"";if(w.value==="universal"||Ee(a)){const e=Yo({categoria:a.categoria,slug:a.slug});return e?`${Le()}${e}`:""}return!a?.marca||!a?.modelo||!a?.categoria?"":Bo({marca:a.marca,modelo:a.modelo,anio:a.anio,categoria:a.categoria,slug:a.slug,nombre:a.nombre},Le())},Te=a=>a?a.split("-").map(e=>e.charAt(0).toUpperCase()+e.slice(1)).join(" "):"",ze=a=>Ye(a),Ae=a=>Ze(String(a||"")),ve=a=>Ho(String(a||"")),de=async()=>{try{console.log("ð Cargando productos desde Firestore..."),ke.value=!0;const a=Fo(so,"repuestos");let e;try{const n=Lo(a,To("createdAt","desc"));e=await Qe(n),console.log("â
Query ejecutada con ordenamiento")}catch(n){console.warn("â ï¸ No se pudo ordenar por createdAt, cargando sin orden:",n),e=await Qe(a)}_.value=[],e.forEach(n=>{const u=n.data();_.value.push({id:n.id,...u,createdAt:u.createdAt?.toDate?u.createdAt.toDate():u.createdAt})}),console.log(`ð¦ Productos cargados: ${_.value.length}`),_.value.sort((n,u)=>{const l=n.createdAt instanceof Date?n.createdAt:new Date(n.createdAt||0);return(u.createdAt instanceof Date?u.createdAt:new Date(u.createdAt||0)).getTime()-l.getTime()})}catch(a){console.error("â Error cargando productos:",a),console.error("â Detalles del error:",a.message,a.stack)}finally{ke.value=!1}},yo=()=>{try{console.log("ð Cargando categorÃas...");const a=ro();re.value=a.sort((e,n)=>e.orden-n.orden),console.log("â
CategorÃas cargadas:",re.value.length)}catch(a){console.error("â Error cargando categorÃas:",a)}},ho=async()=>{if(!t.value.marca){$.value=[],k.value=[];return}try{console.log("ð Cargando modelos para marca:",t.value.marca);const a=await Me(t.value.marca);$.value=a,console.log("â
Modelos cargados:",$.value.length),t.value.modelo="",t.value.anio=null,k.value=[]}catch(a){console.error("â Error cargando modelos:",a),$.value=[]}},ko=async()=>{if(!t.value.marca||!t.value.modelo){k.value=[];return}try{console.log("ð Cargando años para modelo:",t.value.modelo);const a=$.value.find(e=>e.nombre===t.value.modelo);a?(k.value=[...a.años].sort((e,n)=>n-e),console.log("â
Años cargados:",k.value.length),t.value.modeloExacto=a.nombre):(k.value=[],t.value.modeloExacto=t.value.modelo),t.value.anio=null}catch(a){console.error("â Error cargando años:",a),k.value=[]}},wo=()=>{if(!t.value.categoria){U.value=[];return}try{console.log("ð Cargando subcategorÃas para categorÃa:",t.value.categoria);const a=re.value.find(e=>e.slug===t.value.categoria||e.nombre===t.value.categoria);a?.subcategorias?(U.value=a.subcategorias.map(e=>({slug:e,label:Te(e)})),console.log("â
SubcategorÃas cargadas:",U.value.length)):U.value=[],t.value.subcategoria=""}catch(a){console.error("â Error cargando subcategorÃas:",a),U.value=[]}},Z=()=>{},Co=()=>{y.value={marca:"",anio:null,modelo:"",categoria:"",subcategoria:""},ee.value=""},So=async a=>{const e=a.target.files[0];if(e)try{const n=await e.text(),u=JSON.parse(n);R.value=u,b.value=null}catch(n){console.error("Error leyendo archivo:",n),b.value={exito:!1,mensaje:"Error al leer el archivo JSON",detalles:n.message}}},Ao=async()=>{if(R.value)try{se.value=!0,b.value=null,K.value=0,Q.value=0,z.value=0;const a=[],e=R.value.marca,n=R.value.año,u=R.value.modelo||"";console.log("ð¦ Iniciando procesamiento de JSON..."),console.log(` Marca: ${e}, Año: ${n}, Modelo: ${u}`);for(const[A,v]of Object.entries(R.value.categorias||{})){if(v.subcategorias&&Object.keys(v.subcategorias).length>0){for(const[m,p]of Object.entries(v.subcategorias))if(p.productos&&Array.isArray(p.productos))for(const P of p.productos)a.push({producto:P,categoria:A,subcategoria:m})}if(v.productos&&Array.isArray(v.productos))for(const m of v.productos)a.push({producto:m,categoria:A,subcategoria:null})}X.value=a.length,console.log(`â
Total de productos a procesar: ${X.value}`);const l=`repuestos/${e.toLowerCase()}/${u.toLowerCase()}/${n}`;let c=0,S=0;const B=new Map;for(let A=0;A<a.length;A++){const v=a[A];K.value=A+1;try{const m=v.producto;let p=m.imagen||"";if(p&&p.trim()&&p.startsWith("images/"))try{console.log(`ð¤ Subiendo imagen local: ${p}`);const ae=await $fetch("/api/admin/subir-imagen-local",{method:"POST",body:{rutaImagen:p,basePath:l}});ae.success&&ae.url?(p=ae.url,Q.value++,console.log(`â
Imagen subida exitosamente: ${p}`)):(console.warn(`â ï¸ No se pudo subir la imagen: ${p}`),z.value++,p="")}catch(ae){console.error(`â Error subiendo imagen ${p}:`,ae),z.value++,p=""}const P=$o(m,e,n,v.categoria,v.subcategoria,u,p);console.log(`ð¾ Guardando producto ${A+1}/${a.length}: ${P.nombre}`);const H=await xe(P);console.log(`â
Producto guardado con ID: ${H}`),c++;const G=`${P.marca}-${P.modelo}-${P.anio}`;B.has(G)||B.set(G,{marca:P.marca,modelo:P.modelo,año:P.anio,categoria:P.categoria})}catch(m){console.error(`â Error procesando producto ${A+1}:`,m),S++}}console.log("ð Resumen final:"),console.log(` â
Productos guardados: ${c}`),console.log(` â Errores: ${S}`),console.log(` ð¤ Imágenes subidas: ${Q.value}`),console.log(` â ï¸ Errores en imágenes: ${z.value}`);let F=0;for(const[A,v]of B)try{await $fetch("/api/admin/actualizar-marca.json",{method:"POST",body:{marca:v.marca,modelo:v.modelo,año:v.año,categoria:v.categoria}}),F++}catch(m){console.error("Error actualizando JSON de marca:",m)}b.value={exito:!0,mensaje:"Procesamiento completado",detalles:`${c} productos guardados exitosamente. ${Q.value} imagen(es) subida(s) a R2.${S>0?` ${S} error(es).`:""}${z.value>0?` ${z.value} imagen(es) no se pudieron subir.`:""}${F>0?` ${F} archivo(s) JSON actualizado(s).`:""}`},await de(),He()}catch(a){console.error("Error procesando JSON:",a),b.value={exito:!1,mensaje:"Error al procesar el JSON",detalles:a.message}}finally{se.value=!1,K.value=0,X.value=0}},Be=(a,e,n,u)=>{const l=Ae(a),c=Ae(String(e)),S=Ae(u);return`${l}-${c}-${n}-${S}`.substring(0,100)},$o=(a,e,n,u,l,c="",S="")=>{const B=a.precio?.toString().replace("$","").replace(",","")||"0",F=parseFloat(B)||0,A=ze(u),v=l?ve(l):null,m=c||a.modelo||"",p=Be(e,m,n,a.nombre||"producto"),P=parseInt(n)||parseInt(a.año)||new Date().getFullYear(),H=
1parseInt(a.anioDesde??a.añoDesde,10),G=parseInt(a.anioHasta??a.añoHasta,10),qe=Number.isFinite(H)&&Number.isFinite(G)&&G>H?{anio:H,anioDesde:H,anioHasta:G}:{anio:P};return{marca:e.toLowerCase(),modelo:m,...qe,categoria:A,subcategoria:v,nombre:a.nombre||"",descripcion:a.descripcion||a.nombre||"",precio:F,stock:!0,cantidad:1,imagen:S||a.imagen||"",imagenes:ce(S||a.imagen,a.imagenes),url:a.url||"",compatibilidad:[],tags:[e,A,v].filter(Boolean),activo:!0,destacado:!1,slug:p,searchTerms:[a.nombre,a.descripcion,e,m,u,l].filter(Boolean).map(jo=>jo.toLowerCase()),metaTitle:`${a.nombre} - ${e} ${m} ${Pe(qe)}`,metaDescription:a.descripcion||a.nombre}},He=()=>{R.value=null,b.value=null,K.value=0,X.value=0,Q.value=0,z.value=0,we.value&&(we.value.value="")},Po=async()=>{try{if(console.log("ð Iniciando guardado de producto manual..."),console.log("ð Datos del producto:",t.value,"tipo:",w.value),T.value=!0,w.value==="universal"){if(!t.value.categoria||!t.value.nombre||!t.value.descripcion||!t.value.precio){b.value={exito:!1,mensaje:"Completa categorÃa, nombre, descripción y precio"},T.value=!1;return}if(t.value.categoria==="aceite-motor"&&!t.value.subcategoria){b.value={exito:!1,mensaje:"Para aceite de motor elige la viscosidad"},T.value=!1;return}const m=Number(String(t.value.precio).replace(/[^\d]/g,""))||0;if(!m){b.value={exito:!1,mensaje:"Ingresa un precio válido"},T.value=!1;return}const p=ce(null,t.value.imagenes),P=C.value&&t.value.slug?t.value.slug:Xo(t.value.categoria,t.value.nombre,t.value.marcaRepuesto),H={catalogo:Re,marca:lo,modelo:to,anio:fe,anioDesde:fe,anioHasta:fe,categoria:t.value.categoria,subcategoria:t.value.subcategoria?ve(t.value.subcategoria):null,nombre:t.value.nombre.trim(),descripcion:t.value.descripcion.trim(),precio:m,stock:t.value.stock,cantidad:1,imagen:p[0]||"",imagenes:p,url:t.value.url||"",codigoOEM:"",marcaRepuesto:(t.value.marcaRepuesto||"").trim(),compatibilidad:[],tags:[Re,t.value.categoria,t.value.subcategoria,t.value.marcaRepuesto].filter(Boolean),activo:!0,destacado:!1,slug:P,searchTerms:[t.value.nombre,t.value.descripcion,t.value.marcaRepuesto,t.value.categoria,t.value.subcategoria].filter(Boolean).map(G=>String(G).toLowerCase()),metaTitle:t.value.marcaRepuesto?`${t.value.nombre} ${t.value.marcaRepuesto} | AutoPiezas360`:`${t.value.nombre} | AutoPiezas360`,metaDescription:t.value.descripcion.trim().slice(0,160)};C.value?(await _e(C.value,H),b.value={exito:!0,mensaje:"Producto universal actualizado"}):(await xe(H),b.value={exito:!0,mensaje:"Producto universal guardado"}),await de(),be(),setTimeout(()=>{N.value="ver"},1e3);return}const a=t.value.usarRangoAnios?t.value.anioDesde!=null&&t.value.anioHasta!=null:t.value.anio!=null;if(!t.value.marca||!t.value.modelo||!a||!t.value.categoria||!t.value.nombre||!t.value.descripcion||!t.value.precio){console.error("â Faltan campos requeridos"),b.value={exito:!1,mensaje:"Por favor completa todos los campos requeridos"},T.value=!1;return}const e=t.value.precio.replace("$","").replace(",",""),n=parseFloat(e)||0;console.log("ð° Precio procesado:",n);let u;try{u=Qo({usarRango:t.value.usarRangoAnios,anio:t.value.anio,anioDesde:t.value.anioDesde,anioHasta:t.value.anioHasta})}catch(m){b.value={exito:!1,mensaje:m?.message||"Revisa los años del repuesto"},T.value=!1;return}const l=Pe(u),c=Be(t.value.marca,t.value.modelo,u.anio,t.value.nombre);console.log("ð Slug generado:",c);const S=ze(t.value.categoria),B=t.value.subcategoria?ve(t.value.subcategoria):null;console.log("ð CategorÃa slug:",S,"SubcategorÃa slug:",B);let F=t.value.modeloExacto||t.value.modelo;if($.value.length>0){const m=$.value.find(p=>p.nombre===t.value.modelo);m&&(F=m.nombre)}console.log("ð Modelo final a guardar:",F);const A=ce(null,t.value.imagenes),v={catalogo:"vehiculo",marca:t.value.marca.toLowerCase(),modelo:F,...u,categoria:S,subcategoria:B,nombre:t.value.nombre,descripcion:t.value.descripcion.trim(),precio:n,stock:t.value.stock,cantidad:1,imagen:A[0]||"",imagenes:A,url:t.value.url||"",compatibilidad:[],tags:[t.value.marca,S,B].filter(Boolean),activo:!0,destacado:!1,slug:c,searchTerms:[t.value.nombre,t.value.descripcion,t.value.marca,t.value.modelo,t.value.categoria,t.value.subcategoria].filter(
1Boolean).map(m=>m.toLowerCase()),metaTitle:`${t.value.nombre} - ${t.value.marca} ${F} ${l}`,metaDescription:t.value.descripcion};if(console.log("ð¾ Producto a guardar en Firestore:",v),C.value)await _e(C.value,v),console.log("â Producto actualizado:",C.value),b.value={exito:!0,mensaje:"Producto actualizado exitosamente"};else{const m=await xe(v);console.log("â Producto guardado en Firestore con ID:",m);try{console.log("ð Actualizando archivo JSON de marca..."),await $fetch("/api/admin/actualizar-marca.json",{method:"POST",body:{marca:v.marca,modelo:v.modelo,año:v.anio,categoria:v.categoria}}),console.log("â Archivo JSON de marca actualizado")}catch(p){console.error("â Error actualizando JSON de marca:",p)}b.value={exito:!0,mensaje:"Producto guardado exitosamente"}}console.log("ð Recargando productos..."),await de(),be(),setTimeout(()=>{N.value="ver"},1e3)}catch(a){console.error("â Error guardando producto:",a),console.error("â Detalles del error:",a.message,a.stack),b.value={exito:!1,mensaje:"Error al guardar el producto",detalles:a.message}}finally{T.value=!1}},be=()=>{C.value=null,w.value="vehiculo",t.value={marca:"",modelo:"",modeloExacto:"",anio:null,usarRangoAnios:!1,anioDesde:null,anioHasta:null,categoria:"",subcategoria:"",marcaRepuesto:"",nombre:"",descripcion:"",precio:"",url:"",imagenes:[],stock:!0},$.value=[],k.value=[],U.value=[],b.value=null,j.value="",ie.value=!1,ne.value&&(ne.value.value="")},Eo=()=>{be(),N.value="ver"},Ro=async a=>{C.value=a.id,N.value="cargar",W.value="manual",b.value=null;const e=Ee(a);if(w.value=e?"universal":"vehiculo",e){t.value={marca:"",modelo:"",modeloExacto:"",usarRangoAnios:!1,anio:null,anioDesde:null,anioHasta:null,categoria:a.categoria||"",subcategoria:a.subcategoria||"",marcaRepuesto:a.marcaRepuesto||"",nombre:a.nombre,descripcion:a.descripcion,precio:String(a.precio??""),url:a.url||"",imagenes:ce(a.imagen,a.imagenes),slug:a.slug||"",stock:a.stock??!0},$.value=[],k.value=[],U.value=[],j.value="",await Ke(),he.value?.scrollIntoView({behavior:"smooth",block:"start"});return}const n=re.value.find(l=>Xe(l.slug,a.categoria)||Xe(l.nombre,a.categoria)),u=Wo(a);if(t.value={marca:a.marca,modelo:a.modelo,modeloExacto:a.modelo,usarRangoAnios:u,anio:u?null:a.anio,anioDesde:u?a.anioDesde??a.anio:null,anioHasta:u?a.anioHasta??a.anio:null,categoria:n?.slug||Ye(a.categoria),subcategoria:a.subcategoria?ve(a.subcategoria):"",marcaRepuesto:"",nombre:a.nombre,descripcion:a.descripcion,precio:String(a.precio??""),url:a.url||"",imagenes:ce(a.imagen,a.imagenes),slug:a.slug||"",stock:a.stock??!0},j.value="",a.marca)try{$.value=await Me(a.marca);const l=$.value.find(c=>c.nombre===a.modelo||c.slug===Ze(a.modelo));l?k.value=[...l.años].sort((c,S)=>S-c):k.value=[]}catch{$.value=[],k.value=[]}n?.subcategorias?.length?U.value=n.subcategorias.map(l=>({slug:l,label:Te(l)})):U.value=[],await Ke(),he.value?.scrollIntoView({behavior:"smooth",block:"start"})},_o=async()=>{const a=[...x.value];if(!a.length||!confirm(`¿Eliminar ${a.length} producto(s)? 2 3Se borrarán de Firestore y sus fotos en R2. Esta acción no se puede deshacer.`))return;le.value=!0;let e=0,n=0;for(let u=0;u<a.length;u++){const l=a[u];ye.value=`${u+1}/${a.length}`;try{await oo(l),_.value=_.value.filter(c=>c.id!==l),x.value=x.value.filter(c=>c!==l),e++}catch(c){console.error("Error eliminando",l,c),n++}}le.value=!1,ye.value="",b.value={exito:n===0,mensaje:n===0?`${e} producto(s) eliminado(s)`:`${e} eliminado(s), ${n} con error`},n>0&&alert(`${e} eliminados. ${n} no se pudieron borrar (revisa la consola).`)},Mo=async a=>{const e=a?.nombre||"este producto";if(a?.id&&confirm(`¿Eliminar "${e}"? 4 5Se borrará de Firestore y sus fotos en R2. Esta acción no se puede deshacer.`)){ge.value=a.id;try{const n=await oo(a.id);_.value=_.value.filter(l=>l.id!==a.id),x.value=x.value.filter(l=>l!==a.id);const u=n.r2?.requested>0?` · ${n.r2.deleted}/${n.r2.requested} imagen(es) en R2`:"";b.value={exito:!0,mensaje:`Producto eliminado${u}`},n.r2?.failed?.length&&console.warn("R2: algunas imágenes no se pudieron borrar",n.r2.failed)}catch(n){console.error("Error eliminando producto:",n);const u=n?.data?.message||n?.message||"Error al eliminar el producto";alert(u),await de()}finally{ge.value=null}}};return Uo(async()=>{console.log("ð Inicializando página de inventario..."),await de(),yo(),console.log("â Página de inventario inicializada")}
5),(a,e)=>{const n=zo,u=qo;return r(),s("div",null,[o("header",oa,[e[39]||(e[39]=o("p",{class:"text-[11px] font-semibold uppercase tracking-[0.2em] text-slate-500 mb-2"},"Admin · Catálogo",-1)),e[40]||(e[40]=o("h2",{class:"text-2xl font-semibold text-slate-900 tracking-tight"},"Gestión de inventario",-1)),o("p",aa,[e[37]||(e[37]=h(" Repuestos por marca/modelo/año de auto. Aceites, filtros e insumos generales están en ",-1)),pe(n,{to:"/admin/productos",class:"text-blue-700 hover:underline"},{default:Vo(()=>[...e[36]||(e[36]=[h("Productos",-1)])]),_:1}),e[38]||(e[38]=h(". ",-1))])]),o("div",ta,[o("nav",la,[o("button",{type:"button",onClick:e[0]||(e[0]=l=>N.value="ver"),class:q(N.value==="ver"?"pb-3 text-sm font-medium border-b-2 border-slate-900 text-slate-900":"pb-3 text-sm font-medium border-b-2 border-transparent text-slate-500 hover:text-slate-800")}," Ver productos ",2),o("button",{type:"button",onClick:e[1]||(e[1]=l=>N.value="cargar"),class:q(N.value==="cargar"?"pb-3 text-sm font-medium border-b-2 border-slate-900 text-slate-900":"pb-3 text-sm font-medium border-b-2 border-transparent text-slate-500 hover:text-slate-800")}," Cargar productos ",2)])]),N.value==="ver"?(r(),s("div",sa,[o("div",ra,[e[47]||(e[47]=o("h2",{class:"text-xl font-semibold text-gray-900 mb-4"},"Filtros de Búsqueda",-1)),o("div",na,[o("div",null,[e[42]||(e[42]=o("label",{class:"block text-sm font-medium text-gray-700 mb-2"},"Marca",-1)),g(o("select",{"onUpdate:modelValue":e[2]||(e[2]=l=>y.value.marca=l),onChange:Z,class:"w-full px-3 py-2 border border-gray-300 rounded-lg focus:outline-none focus:ring-2 focus:ring-blue-500/30 focus:border-blue-500"},[e[41]||(e[41]=o("option",{value:""},"Todas las marcas",-1)),(r(!0),s(I,null,O(je.value,l=>(r(),s("option",{key:l.slug,value:l.slug},i($e(eo)(l.nombre)),9,ia))),128))],544),[[D,y.value.marca]])]),o("div",null,[e[43]||(e[43]=o("label",{class:"block text-sm font-medium text-gray-700 mb-2"},"Año",-1)),g(o("input",{"onUpdate:modelValue":e[3]||(e[3]=l=>y.value.anio=l),onInput:Z,type:"number",placeholder:"Año",class:"w-full px-3 py-2 border border-gray-300 rounded-lg focus:outline-none focus:ring-2 focus:ring-blue-500/30 focus:border-blue-500"},null,544),[[E,y.value.anio,void 0,{number:!0}]])]),o("div",null,[e[44]||(e[44]=o("label",{class:"block text-sm font-medium text-gray-700 mb-2"},"Modelo",-1)),g(o("input",{"onUpdate:modelValue":e[4]||(e[4]=l=>y.value.modelo=l),onInput:Z,type:"text",placeholder:"Modelo",class:"w-full px-3 py-2 border border-gray-300 rounded-lg focus:outline-none focus:ring-2 focus:ring-blue-500/30 focus:border-blue-500"},null,544),[[E,y.value.modelo]])]),o("div",null,[e[45]||(e[45]=o("label",{class:"block text-sm font-medium text-gray-700 mb-2"},"CategorÃa",-1)),g(o("input",{"onUpdate:modelValue":e[5]||(e[5]=l=>y.value.categoria=l),onInput:Z,type:"text",placeholder:"CategorÃa",class:"w-full px-3 py-2 border border-gray-300 rounded-lg focus:outline-none focus:ring-2 focus:ring-blue-500/30 focus:border-blue-500"},null,544),[[E,y.value.categoria]])]),o("div",null,[e[46]||(e[46]=o("label",{class:"block text-sm font-medium text-gray-700 mb-2"},"SubcategorÃa",-1)),g(o("input",{"onUpdate:modelValue":e[6]||(e[6]=l=>y.value.subcategoria=l),onInput:Z,type:"text",placeholder:"SubcategorÃa",class:"w-full px-3 py-2 border border-gray-300 rounded-lg focus:outline-none focus:ring-2 focus:ring-blue-500/30 focus:border-blue-500"},null,544),[[E,y.value.subcategoria]])])]),o("div",{class:"mt-4 flex justify-end"},[o("button",{onClick:Co,class:"px-4 py-2 text-sm text-gray-600 hover:text-gray-800 border border-gray-300 rounded-lg hover:bg-gray-50 transition-colors"}," Limpiar Filtros ")])]),o("div",ua,[o("div",da,[o("div",ca,[o("div",null,[e[48]||(e[48]=o("p",{class:"text-sm font-medium text-gray-600"},"Total Productos",-1)),o("p",ga,i(_.value.length),1)]),e[49]||(e[49]=o("div",{class:"p-3 bg-gradient-to-br from-blue-500 to-blue-600 rounded-xl"},[o("svg",{class:"w-6 h-6 text-white",fill:"none",stroke:"currentColor",viewBox:"0 0 24 24"},[o("path",{"stroke-linecap":"round","stroke-linejoin":"round","stroke-width":"2",d:"M20 7l-8-4-8 4m16 0l-8 4m8-4v10l-8 4m0-10L4 7m8 4v10M4 7v10l8 4"})])],-1))])]),o("div",ma,[o("div",va,[o("div",null,[e[50]||(e[50]=o("p",{class:"text-sm font-medium text-gray-600"},"Productos Filtrados",-1)),o("p",ba,i(V.value.length),1)]),e[51]||(e[51]=o("div",{class:"p-3 bg-gradient-to-br from-green-500 to-green-600 rounded-xl"}
5,[o("svg",{class:"w-6 h-6 text-white",fill:"none",stroke:"currentColor",viewBox:"0 0 24 24"},[o("path",{"stroke-linecap":"round","stroke-linejoin":"round","stroke-width":"2",d:"M9 12l2 2 4-4m6 2a9 9 0 11-18 0 9 9 0 0118 0z"})])],-1))])]),o("div",pa,[o("div",fa,[o("div",null,[e[52]||(e[52]=o("p",{class:"text-sm font-medium text-gray-600"},"En Stock",-1)),o("p",xa,i(xo.value),1)]),e[53]||(e[53]=o("div",{class:"p-3 bg-gradient-to-br from-purple-500 to-purple-600 rounded-xl"},[o("svg",{class:"w-6 h-6 text-white",fill:"none",stroke:"currentColor",viewBox:"0 0 24 24"},[o("path",{"stroke-linecap":"round","stroke-linejoin":"round","stroke-width":"2",d:"M5 8h14M5 8a2 2 0 110-4h14a2 2 0 110 4M5 8v10a2 2 0 002 2h10a2 2 0 002-2V8m-9 4h4"})])],-1))])])]),o("div",ya,[o("div",ha,[o("div",ka,[e[57]||(e[57]=o("h2",{class:"text-xl font-semibold text-gray-900"},"Productos",-1)),o("div",wa,[g(o("input",{"onUpdate:modelValue":e[7]||(e[7]=l=>ee.value=l),onInput:Z,type:"text",placeholder:"Buscar productos...",class:"px-4 py-2 border border-gray-300 rounded-lg focus:outline-none focus:ring-2 focus:ring-blue-500/30 focus:border-blue-500 min-w-[200px]"},null,544),[[E,ee.value]]),g(o("select",{"onUpdate:modelValue":e[8]||(e[8]=l=>Y.value=l),onChange:Z,class:"px-3 py-2 border border-gray-300 rounded-lg focus:outline-none focus:ring-2 focus:ring-blue-500/30 focus:border-blue-500"},[...e[54]||(e[54]=[o("option",{value:"nombre"},"Nombre (A-Z)",-1),o("option",{value:"precio"},"Precio (menor a mayor)",-1),o("option",{value:"precio-desc"},"Precio (mayor a menor)",-1),o("option",{value:"fecha"},"Más recientes",-1)])],544),[[D,Y.value]]),o("label",Ca,[e[56]||(e[56]=o("span",{class:"whitespace-nowrap"},"Por página",-1)),g(o("select",{"onUpdate:modelValue":e[9]||(e[9]=l=>J.value=l),class:"px-3 py-2 border border-gray-300 rounded-lg focus:outline-none focus:ring-2 focus:ring-blue-500/30 focus:border-blue-500"},[...e[55]||(e[55]=[o("option",{value:50},"50",-1),o("option",{value:100},"100",-1),o("option",{value:500},"500",-1)])],512),[[D,J.value,void 0,{number:!0}]])])])]),x.value.length>0?(r(),s("div",Sa,[o("span",Aa,i(x.value.length)+" seleccionado"+i(x.value.length===1?"":"s"),1),o("button",{type:"button",class:"text-sm text-red-800 hover:underline",onClick:po}," Seleccionar los "+i(V.value.length)+" filtrados ",1),o("button",{type:"button",class:"text-sm text-gray-600 hover:underline",onClick:fo}," Deseleccionar todo "),o("button",{type:"button",disabled:le.value,class:"ml-auto px-4 py-2 text-sm font-semibold text-white bg-red-600 rounded-lg hover:bg-red-700 disabled:opacity-50 disabled:cursor-not-allowed",onClick:_o},i(le.value?`Eliminando⦠(${ye.value})`:`Eliminar seleccionados (${x.value.length})`),9,$a)])):f("",!0)]),ke.value?(r(),s("div",Pa,[...e[58]||(e[58]=[o("div",{class:"text-center"},[o("div",{class:"animate-spin rounded-full h-12 w-12 border-b-2 border-red-600 mx-auto mb-4"}),o("p",{class:"text-gray-600"},"Cargando productos...")],-1)])])):V.value.length>0?(r(),s("div",Ea,[o("table",Ra,[o("thead",null,[o("tr",_a,[o("th",Ma,[o("input",{type:"checkbox",class:"rounded border-gray-300 text-red-600 focus:ring-red-500",checked:Ne.value,"aria-label":"Seleccionar todos en esta página",onChange:bo},null,40,ja)]),e[59]||(e[59]=o("th",{class:"text-left py-3 px-4 font-medium text-gray-700"},"Nombre",-1)),e[60]||(e[60]=o("th",{class:"text-left py-3 px-4 font-medium text-gray-700"},"Marca",-1)),e[61]||(e[61]=o("th",{class:"text-left py-3 px-4 font-medium text-gray-700"},"Modelo",-1)),e[62]||(e[62]=o("th",{class:"text-left py-3 px-4 font-medium text-gray-700"},"Año",-1)),e[63]||(e[63]=o("th",{class:"text-left py-3 px-4 font-medium text-gray-700"},"CategorÃa",-1)),e[64]||(e[64]=o("th",{class:"text-left py-3 px-4 font-medium text-gray-700"},"Precio",-1)),e[65]||(e[65]=o("th",{class:"text-left py-3 px-4 font-medium text-gray-700"},"Stock",-1)),e[66]||(e[66]=o("th",{class:"text-left py-3 px-4 font-medium text-gray-700"},"URL pública",-1)),e[67]||(e[67]=o("th",{class:"text-left py-3 px-4 font-medium text-gray-700"},"Acciones",-1))])]),o("tbody",null,[(r(!0),s(I,null,O(Se.value,l=>(r(),s("tr",{key:l.id,class:q(["border-b border-gray-100 hover:bg-gray-50",Oe(l.id)?"bg-red-50/40":""])},[o("td",Da,[o("input",{type:"checkbox",class:"rounded border-gray-300 text-red-600 focus:ring-red-500",checked:Oe(l.id),"aria-label":`Seleccionar ${l.nombre}`,onChange:c=>vo(l.id)},null,40,Ia)]),o("td",Ua,[o("div",null,[o("p",Va,i(l.nombre),1),o("p",Oa,i(l.descripcion),1)])]),o("td",Na,[o("div",Fa,[me(l)?(r(),s("span",La," Universal ")):(r(),s("span",Ta,i(l.marca),1)),me(l)&&l.marcaRepuesto?(r(),s("span",za,i(l.marcaRepuesto),1)):f("",!0)])]),o("td",Ba,i(me(l)?"â":l.modelo),1),o("td",Ha,i(me(l)?"â":uo(l)),1),o("td",qa,[o("div",null,[o("span",Ja,i(l.categoria),1),l.subcategoria?(r(),s("span",Ga,i(l.subcategoria),1)):f("",!0)])]),o("td",Wa,[o("span",Qa," $"+i(parseFloat(l.precio.toString().replace("$","").replace(",",""))||0),1)]),o("td",Ya,[o("span",{class:q(["px-2 py-1 rounded-full text-xs font-medium",l.stock?"bg-green-100 text-green-800":"bg-red-100 text-red-800"])},i(l.stock?"En Stock":"Sin Stock"),3)]),o("td",Za,[o("div",Ka,[o("p",{class:"text-xs text-gray-500 break-all leading-snug",title:oe(l)},i(oe(l)),9,Xa),o("a",{href:oe(l),target:"_blank",rel:"noopener noreferrer",class:"inline-flex items-center gap-1.5 w-fit px-3 py-1.5 text-xs font-semibold text-white bg-blue-600 rounded-lg hover:bg-blue-700 transition-colors"},[...e[68]||(e[68]=[o("svg",{class:"w-3.5 h-3.5",fill:"none",stroke:"currentColor",viewBox:"0 0 24 24","aria-hidden":"true"},[o("path",{"stroke-linecap":"round","stroke-linejoin":"round","stroke-width":"2",d:"M10 6H6a2 2 0 00-2 2v10a2 2 0 002 2h10a2 2 0 002-2v-4M14 4h6m0 0v6m0-6L10 14"})],-1),h(" Ver en sitio ",-1)])],8,et)])]),o("td",ot,[o("button",{type:"button",onClick:c=>Ro(l),class:"text-blue-600 hover:text-blue-700 text-sm font-medium mr-3"}," Editar ",8,at),o("button",{type:"button",disabled:ge.value===l.id||le.value,class:"text-red-600 hover:text-red-700 text-sm font-medium disabled:opacity-50 disabled:cursor-not-allowed",onClick:We(c=>Mo(l),["prevent"])},i(ge.value===l.id?"Eliminandoâ¦":"Eliminar"),9,tt)])],2))),128))])]),o("div",lt,[o("p",st,[e[69]||(e[69]=h(" Mostrando ",-1)),o("span",rt,i(Ve.value.desde),1),e[70]||(e[70]=h("â ",-1)),o("span",nt,i(Ve.value.hasta),1
5),e[71]||(e[71]=h(" de ",-1)),o("span",it,i(V.value.length),1),V.value.length!==_.value.length?(r(),s("span",ut," ("+i(_.value.length)+" en total) ",1)):f("",!0)]),o("div",dt,[o("button",{type:"button",disabled:M.value<=1,class:"px-3 py-1.5 text-sm border border-gray-300 rounded-lg hover:bg-gray-50 disabled:opacity-40 disabled:cursor-not-allowed",onClick:e[10]||(e[10]=l=>Fe(M.value-1))}," Anterior ",8,ct),o("span",gt," Página "+i(M.value)+" de "+i(ue.value),1),o("button",{type:"button",disabled:M.value>=ue.value,class:"px-3 py-1.5 text-sm border border-gray-300 rounded-lg hover:bg-gray-50 disabled:opacity-40 disabled:cursor-not-allowed",onClick:e[11]||(e[11]=l=>Fe(M.value+1))}," Siguiente ",8,mt)])])])):(r(),s("div",vt,[o("div",bt,[pe(u,{name:"cube",size:"xl",class:"text-gray-300 w-16 h-16"})]),e[72]||(e[72]=o("h3",{class:"text-xl font-semibold text-gray-800 mb-2"},"No se encontraron productos",-1)),e[73]||(e[73]=o("p",{class:"text-gray-600"},"Intenta ajustar los filtros o cargar nuevos productos",-1))]))])])):f("",!0),N.value==="cargar"?(r(),s("div",pt,[o("div",ft,[e[76]||(e[76]=o("h2",{class:"text-xl font-semibold text-gray-900 mb-4"},"Método de Carga",-1)),o("div",xt,[o("button",{onClick:e[12]||(e[12]=l=>W.value="json"),class:q(["p-6 border-2 rounded-xl transition-all",W.value==="json"?"border-red-600 bg-red-50":"border-gray-200 hover:border-gray-300"])},[...e[74]||(e[74]=[Ge('<div class="flex items-center space-x-4"><div class="p-3 bg-red-100 rounded-lg"><svg class="w-8 h-8 text-red-600" fill="none" stroke="currentColor" viewBox="0 0 24 24"><path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M7 21h10a2 2 0 002-2V9.414a1 1 0 00-.293-.707l-5.414-5.414A1 1 0 0012.586 3H7a2 2 0 00-2 2v14a2 2 0 002 2z"></path></svg></div><div class="text-left"><h3 class="text-lg font-semibold text-gray-900">Cargar desde JSON</h3><p class="text-sm text-gray-600">Sube un archivo JSON con la estructura de productos</p></div></div>',1)])],2),o("button",{onClick:e[13]||(e[13]=l=>W.value="manual"),class:q(["p-6 border-2 rounded-xl transition-all",W.value==="manual"?"border-red-600 bg-red-50":"border-gray-200 hover:border-gray-300"])},[...e[75]||(e[75]=[Ge('<div class="flex items-center space-x-4"><div class="p-3 bg-red-100 rounded-lg"><svg class="w-8 h-8 text-red-600" fill="none" stroke="currentColor" viewBox="0 0 24 24"><path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M11 5H6a2 2 0 00-2 2v11a2 2 0 002 2h11a2 2 0 002-2v-5m-1.414-9.414a2 2 0 112.828 2.828L11.828 15H9v-2.828l8.586-8.586z"></path></svg></div><div class="text-left"><h3 class="text-lg font-semibold text-gray-900">Carga Manual</h3><p class="text-sm text-gray-600">Agrega productos uno por uno mediante formulario</p></div></div>',1)])],2)])]),W.value==="json"?(r(),s("div",yt,[e[86]||(e[86]=o("h2",{class:"text-xl font-semibold text-gray-900 mb-4"},"Cargar Productos desde JSON",-1)),o("div",ht,[o("div",null,[e[77]||(e[77]=o("label",{class:"block text-sm font-medium text-gray-700 mb-2"}," Seleccionar archivo JSON ",-1)),o("input",{ref_key:"fileInput",ref:we,onChange:So,type:"file",accept:".json",class:"block w-full text-sm text-gray-500 file:mr-4 file:py-2 file:px-4 file:rounded-lg file:border-0 file:text-sm file:font-semibold file:bg-red-50 file:text-red-700 hover:file:bg-red-100"},null,544),e[78]||(e[78]=o("p",{class:"mt-2 text-sm text-gray-500"}," El archivo JSON debe tener la estructura con marca, año, categorÃas, subcategorÃas y productos ",-1))]),R.value?(r(),s("div",kt,[e[84]||(e[84]=o("h3",{class:"text-sm font-medium text-gray-700 mb-2"},"Vista Previa de Datos",-1)),o("div",wt,[o("p",null,[e[79]||(e[79]=o("strong",null,"Marca:",-1)),h(" "+i(R.value.marca),1)]),o("p",null,[e[80]||(e[80]=o("strong",null,"Añ
5o:",-1)),h(" "+i(R.value.año),1)]),o("p",null,[e[81]||(e[81]=o("strong",null,"Modelo:",-1)),h(" "+i(R.value.modelo),1)]),o("p",null,[e[82]||(e[82]=o("strong",null,"Total de productos:",-1)),h(" "+i(R.value.total_productos),1)]),o("p",null,[e[83]||(e[83]=o("strong",null,"CategorÃas:",-1)),h(" "+i(Object.keys(R.value.categorias||{}).length),1)])])])):f("",!0),se.value?(r(),s("div",Ct,[o("div",St,[e[85]||(e[85]=o("span",null,"Procesando productos...",-1)),o("span",null,i(K.value)+" / "+i(X.value),1)]),o("div",At,[o("div",{class:"bg-red-600 h-2.5 rounded-full transition-all duration-300",style:Oo({width:`${K.value/X.value*100}%`})},null,4)]),o("div",$t,[Q.value>0?(r(),s("p",Pt,[pe(u,{name:"arrow-up-tray",size:"sm"}),h(" Imágenes subidas: "+i(Q.value),1)])):f("",!0),z.value>0?(r(),s("p",Et,[pe(u,{name:"exclamation-triangle",size:"sm"}),h(" Errores en imágenes: "+i(z.value),1)])):f("",!0)])])):f("",!0),o("div",Rt,[o("button",{onClick:Ao,disabled:!R.value||se.value,class:"px-6 py-3 bg-red-600 text-white rounded-lg hover:bg-red-700 transition-colors disabled:opacity-50 disabled:cursor-not-allowed font-medium"},[se.value?(r(),s("span",Mt,"Procesando...")):(r(),s("span",jt,"Procesar y Guardar Productos"))],8,_t),o("button",{onClick:He,class:"px-6 py-3 bg-gray-200 text-gray-700 rounded-lg hover:bg-gray-300 transition-colors font-medium"}," Limpiar ")]),b.value?(r(),s("div",{key:2,class:q(["mt-4 p-4 rounded-lg",b.value.exito?"bg-green-50 text-green-800":"bg-red-50 text-red-800"])},[o("p",Dt,i(b.value.mensaje),1),b.value.detalles?(r(),s("p",It,i(b.value.detalles),1)):f("",!0)],2)):f("",!0)])])):f("",!0),W.value==="manual"?(r(),s("div",{key:1,ref_key:"formularioManualRef",ref:he,class:"bg-white rounded-lg border border-slate-200/80 p-6"},[o("div",Ut,[o("h2",Vt,i(C.value?"Editar producto":"Agregar producto manualmente"),1),C.value&&oe(t.value)?(r(),s("p",Ot,[e[87]||(e[87]=h(" URL: ",-1)),o("a",{href:oe(t.value),target:"_blank",rel:"noopener noreferrer",class:"text-blue-600 hover:underline break-all"},i(oe(t.value)),9,Nt)])):f("",!0)]),o("div",Ft,[e[90]||(e[90]=o("p",{class:"text-sm font-medium text-gray-700 mb-2"},"Tipo de producto",-1)),o("div",Lt,[o("button",{type:"button",class:q(["text-left p-4 border-2 rounded-xl transition-all",w.value==="vehiculo"?"border-red-600 bg-red-50":"border-gray-200 hover:border-gray-300"]),disabled:!!C.value,onClick:e[14]||(e[14]=l=>Ie("vehiculo"))},[...e[88]||(e[88]=[o("p",{class:"font-semibold text-gray-900"},"Por vehÃculo",-1),o("p",{class:"text-xs text-gray-600 mt-1"}," Pieza ligada a marca, modelo y año (ej. compresor Toyota Yaris 2018) ",-1)])],10,Tt),o("button",{type:"button",class:q(["text-left p-4 border-2 rounded-xl transition-all",w.value==="universal"?"border-red-600 bg-red-50":"border-gray-200 hover:border-gray-300"]),disabled:!!C.value,onClick:e[15]||(e[15]=l=>Ie("universal"))},[...e[89]||(e[89]=[o("p",{class:"font-semibold text-gray-900"},"Universal",-1),o("p",{class:"text-xs text-gray-600 mt-1"}," Sirve para cualquier auto: plumillas, limpieza, aceites, filtros, etc. ",-1)])],10,zt)])]),o("form",{onSubmit:We(Po,["prevent"]),class:"space-y-6"},[o("div",Bt,[w.value==="vehiculo"?(r(),s(I,{key:0},[o("div",null,[e[92]||(e[92]=o("label",{class:"block text-sm font-medium text-gray-700 mb-2"},"Marca *",-1)),g(o("select",{"onUpdate:modelValue":e[16]||(e[16]=l=>t.value.marca=l),onChange:ho,required:"",class:"w-full px-3 py-2 border border-gray-300 rounded-lg focus:outline-none focus:ring-2 focus:ring-blue-500/30 focus:border-blue-500"},[e[91]||(e[91]=o("option",{value:""},"Seleccionar marca",-1)),(r(!0),s(I,null,O(je.value,l=>(r(),s("option",{key:l.slug,value:l.slug},i($e(eo)(l.nombre)),9,Ht))),128))],544),[[D,t.value.marca]])]),o("div",null,[e[94]||(e[94]=o("label",{class:"block text-sm font-medium text-gray-700 mb-2"},"Modelo *",-1)),$.value.length>0?g((r(),s("select",{key:0,"onUpdate:modelValue":e[17]||(e[17]=l=>t.value.modelo=l),onChange:ko,required:"",class:"w-full px-3 py-2 border border-gray-300 rounded-lg focus:outline-none focus:ring-2 focus:ring-blue-500/30 focus:border-blue-500"},[e[93]||(e[93]=o("option",{value:""},"Seleccionar modelo",-1)),(r(!0),s(I,null,O($.value,l=>(r(),s("option",{key:l.slug,value:l.nombre}
5,i(l.nombre),9,qt))),128))],544)),[[D,t.value.modelo]]):g((r(),s("input",{key:1,"onUpdate:modelValue":e[18]||(e[18]=l=>t.value.modelo=l),type:"text",required:"",placeholder:"Ej: 370Z o S-Type",class:"w-full px-3 py-2 border border-gray-300 rounded-lg focus:outline-none focus:ring-2 focus:ring-blue-500/30 focus:border-blue-500"},null,512)),[[E,t.value.modelo]])]),o("div",Jt,[o("label",Gt,[g(o("input",{"onUpdate:modelValue":e[19]||(e[19]=l=>t.value.usarRangoAnios=l),type:"checkbox",class:"rounded border-gray-300 text-blue-600 focus:ring-blue-500",onChange:co},null,544),[[No,t.value.usarRangoAnios]]),e[95]||(e[95]=h(" Compatibilidad por rango de años (ej. 2014 â 2018) ",-1))]),t.value.usarRangoAnios?(r(),s("div",Yt,[o("div",null,[e[99]||(e[99]=o("label",{class:"block text-sm font-medium text-gray-700 mb-2"},"Año desde *",-1)),k.value.length>0?g((r(),s("select",{key:0,"onUpdate:modelValue":e[22]||(e[22]=l=>t.value.anioDesde=l),required:"",class:"w-full px-3 py-2 border border-gray-300 rounded-lg focus:outline-none focus:ring-2 focus:ring-blue-500/30 focus:border-blue-500"},[e[98]||(e[98]=o("option",{value:null},"Desde",-1)),(r(!0),s(I,null,O(k.value,l=>(r(),s("option",{key:`d-${l}`,value:l},i(l),9,Zt))),128))],512)),[[D,t.value.anioDesde,void 0,{number:!0}]]):g((r(),s("input",{key:1,"onUpdate:modelValue":e[23]||(e[23]=l=>t.value.anioDesde=l),type:"number",required:"",min:"1970",max:"2100",placeholder:"Ej: 2014",class:"w-full px-3 py-2 border border-gray-300 rounded-lg focus:outline-none focus:ring-2 focus:ring-blue-500/30 focus:border-blue-500"},null,512)),[[E,t.value.anioDesde,void 0,{number:!0}]])]),o("div",null,[e[101]||(e[101]=o("label",{class:"block text-sm font-medium text-gray-700 mb-2"},"Año hasta *",-1)),k.value.length>0?g((r(),s("select",{key:0,"onUpdate:modelValue":e[24]||(e[24]=l=>t.value.anioHasta=l),required:"",class:"w-full px-3 py-2 border border-gray-300 rounded-lg focus:outline-none focus:ring-2 focus:ring-blue-500/30 focus:border-blue-500"},[e[100]||(e[100]=o("option",{value:null},"Hasta",-1)),(r(!0),s(I,null,O(k.value,l=>(r(),s("option",{key:`h-${l}`,value:l},i(l),9,Kt))),128))],512)),[[D,t.value.anioHasta,void 0,{number:!0}]]):g((r(),s("input",{key:1,"onUpdate:modelValue":e[25]||(e[25]=l=>t.value.anioHasta=l),type:"number",required:"",min:"1970",max:"2100",placeholder:"Ej: 2018",class:"w-full px-3 py-2 border border-gray-300 rounded-lg focus:outline-none focus:ring-2 focus:ring-blue-500/30 focus:border-blue-500"},null,512)),[[E,t.value.anioHasta,void 0,{number:!0}]])])])):(r(),s("div",Wt,[e[97]||(e[97]=o("label",{class:"block text-sm font-medium text-gray-700 mb-2"},"Año *",-1)),k.value.length>0?g((r(),s("select",{key:0,"onUpdate:modelValue":e[20]||(e[20]=l=>t.value.anio=l),required:"",class:"w-full px-3 py-2 border border-gray-300 rounded-lg focus:outline-none focus:ring-2 focus:ring-blue-500/30 focus:border-blue-500"},[e[96]||(e[96]=o("option",{value:null},"Seleccionar año",-1)),(r(!0),s(I,null,O(k.value,l=>(r(),s("option",{key:l,value:l},i(l),9,Qt))),128))],512)),[[D,t.value.anio,void 0,{number:!0}]]):g((r(),s("input",{key:1,"onUpdate:modelValue":e[21]||(e[21]=l=>t.value.anio=l),type:"number",required:"",min:"1970",max:"2100",placeholder:"Ej: 2016",class:"w-full px-3 py-2 border border-gray-300 rounded-lg focus:outline-none focus:ring-2 focus:ring-blue-500/30 focus:border-blue-500"},null,512)),[[E,t.value.anio,void 0,{number:!0}]])])),t.value.usarRangoAnios?(r(),s("p",Xt," Se mostrará en la ficha como compatibilidad para todos los años del rango. ")):f("",!0)])],64)):(r(),s("div",el,[e[102]||(e[102]=o("label",{class:"block text-sm font-medium text-gray-700 mb-2"},"Marca del producto",-1)),g(o("input",{"onUpdate:modelValue":e[26]||(e[26]=l=>t.value.marcaRepuesto=l),type:"text",placeholder:"Ej: Bosch, Mobil, Turtle Wax (opcional)",class:"w-full px-3 py-2 border border-gray-300 rounded-lg focus:outline-none focus:ring-2 focus:ring-blue-500/30 focus:border-blue-500"},null,512),[[E,t.value.marcaRepuesto]]),e[103]||(e[103]=o("p",{class:"mt-1 text-xs text-gray-500"}," Marca comercial del artÃculo, no la del auto. ",-1))])),o("div",null,[e[106]||(e[106]=o("label",{class:"block text-sm font-medium text-gray-700 mb-2"},"CategorÃa *",-1)),w.value==="vehiculo"?g((r(),s("select",{key:0,"onUpdate:modelValue":e[27]||(e[27]=l=>t.value.categoria=l),onChange:wo,required:"",class:"w-full px-3 py-2 border border-gray-300 rounded-lg focus:outline-none focus:ring-2 focus:ring-blue-500/30 focus:border-blue-500"},[e[104]||(e[104]=o("option",{value:""},"Seleccionar categorÃa",-1)),(r(!0),s(I,null,O(re.value,l=>(r(),s("option",{key:l.slug,value:l.slug},i(l.nombre),9,ol))),128))],544)),[[D,t.value.categoria]]):g((r(),s("select",{key:1,"onUpdate:modelValue":e[28]||(e[28]=l=>t.value.categoria=l),required:"",class:"w-full px-3 py-2 border border-gray-300 rounded-lg focus:outline-none focus:ring-2 focus:ring-blue-500/30 focus:border-blue-500",onChange:io},[e[105]||(e[105]=o("option",{value:""},"Seleccionar categorÃa",-1)),(r(!0),s(I,null,O($e(Ko),l=>(r(),s("option",{key:l.slug,value:l.slug},i(l.nombre),9,al))),128))],544)),[[D,t.value.categoria]])]),o("div",null,[o("label",tl,i(t.value.categoria==="aceite-motor"?"Viscosidad (10W-40, 5W-30â¦)":"SubcategorÃa"),1),t.value.categoria==="aceite-motor"?(r(),s("p",ll,[...e[107]||(e[107]=[h(" Los aceites se publican en ",-1),o("strong",null,"/aceite-motor",-1),h(". Usa la viscosidad como subcategorÃa. ",-1)])])):w.value==="universal"?(r(),s("p",sl,[...e[108]||(e[108]=[h(" Se publica en ",-1),o("strong",null,"/accesorios-autos",-1),h(" (menú Accesorios). ",-1)])])):f("",!0),De.value.length>0?g((r(),s("select",{key:2,"onUpdate:modelValue":e[29]||(e[29]=l=>t.value.subcategoria=l),required:w.value==="universal"&&t.value.categoria==="aceite-motor",class:"w-full px-3 py-2 border border-gray-300 rounded-lg focus:outline-none focus:ring-2 focus:ring-blue-500/30 focus:border-blue-500"},[e[109]||(e[109]=o("option",{value:""},"Seleccionar subcategorÃa (opcional)",-1)),(r(!0),s(I,null,O(De.value,l=>(r(),s("option",{key:l.slug,value:l.slug},i(l.label),9,nl))),128))],8,rl)),[[D,t.value.subcategoria]]):g((r(),s("input",{key:3,"onUpdate:modelValue":e[30]||(e[30]=l=>t.value.subcategoria=l),type:"text",placeholder:w.value==="universal"?"Ej: Plumillas, shampoo, etc.":"Ej: Compresor de Aire Acondicionado",class:"w-full px-3 py-2 border border-gray-300 rounded-lg focus:outline-none focus:ring-2 focus:ring-blue-500/30 focus:border-blue-500"},null,8,il)),[[E,t.value.subcategoria]])]),o("div",null,[e[110]||(e[110]=o("label",{class:"block text-sm font-medium text-gray-700 mb-2"},"Nombre *",-1)),g(o("input",{"onUpdate:modelValue":e[31]||(e[31]=l=>t.value.nombre=l),type:"text",required:"",placeholder:"Ej: UAC RO0900B PAG",class:"w-full px-3 py-2 border border-gray-300 rounded-lg focus:outline-none focus:ring-2 focus:ring-blue-500/30 focus:border-blue-500"},null,512),[[E,t.value.nombre]])]),o("div",ul,[e[111]||(e[111]=o("label",{class:"block text-sm font-medium text-gray-700 mb-2"},"Descripción *",-1)),g(o("textarea",{"onUpdate:modelValue":e[32]||(e[32]=l=>t.value.descripcion=l),required:"",rows:"6",placeholder:"Describe el repuesto. Puedes usar varias lÃneas; se verán igual en la ficha del producto.",class:"w-full px-3 py-2 border border-gray-300 rounded-lg focus:outline-none focus:ring-2 focus:ring-blue-500/30 focus:border-blue-500 resize-y min-h-[140px]"},null,512),[[E,t.value.descripcion]])]),o("div",null,[e[112]||(e[112]=o("label",{class:"block text-sm font-medium text-gray-700 mb-2"},"Precio *",-1)),g(o("input",{"onUpdate:modelValue":e[33]||(e[33]=l=>t.value.precio=l),type:"text",required:"",placeholder:"Ej: $4.72 o 4.72",class:"w-full px-3 py-2 border border-gray-300 rounded-lg focus:outline-none focus:ring-2 focus:ring-blue-500/30 focus:border-blue-500"},null,512),[[E,t.value.precio]])]),o("div",null,[e[113]||(e[113]=o("label",{class:"block text-sm font-medium text-gray-700 mb-2"},"URL",-1)),g(o("input",{"onUpdate:modelValue":e[34]||(e[34]=l=>t.value.url=l),type:"url",placeholder:"URL del producto",class:"w-full px-3 py-2 border border-gray-300 rounded-lg focus:outline-none focus:ring-2 focus:ring-blue-500/30 focus:border-blue-500"},null,512),[[E,t.value.url]])]),o("div",dl,[o("label",cl,[e[114]||(e[114]=h(" Fotos del producto ",-1)),o("span",gl,"("+i(t.value.imagenes.length)+"/"+i(te)+")",1)]),o("input",{ref_key:"imagenFileInput",ref:ne,type:"file",multiple:"",accept:"image/jpeg,image/png,image/webp,image/gif,image/avif,image/tiff,image/bmp,image/heic,image/heif",class:"block w-full text-sm text-gray-500 file:mr-4 file:py-2 file:px-4 file:rounded-lg file:border-0 file:text-sm file:font-semibold file:bg-slate-100 file:text-slate-800 hover:file:bg-slate-200",disabled:!Ce.value||t.value.imagenes.length>=te||ie.value,onChange:go},null,40,ml),o("p",{class:"mt-1 text-xs text-gray-500"}," Hasta "+i(te)+" fotos. JPG, PNG, WebP y más. Máx. 10 MB c/u. La primera es la principal. "),Ce.value?t.value.imagenes.length>=te?(r(),s("p",bl," LÃmite alcanzado. Quita una foto para agregar otra. ")):f("",!0):(r(),s("p",vl,i(w.value==="universal"?"Elige la categorÃa antes de subir fotos.":"Completa marca, modelo y año antes de subir fotos."),1)),ie.value?(r(),s("div",pl,[...e[115]||(e[115]=[o("span",{class:"animate-spin rounded-full h-4 w-4 border-b-2 border-slate-900"},null,-1),h(" Subiendo foto(s) a R2... ",-1)])])):f("",!0),j.value?(r(),s("p",fl,i(j.value),1)):f("",!0),t.value.imagenes.length?(r(),s("div",xl,[(r(!0),s(I,null,O(t.value.imagenes,(l,c)=>(r(),s("div",{key:`${l}-${c}`,class:"relative group rounded-lg border border-slate-200 overflow-hidden bg-slate-50"},[o("img",{src:l,alt:`Foto ${c+1}`,class:"aspect-square w-full object-cover"},null,8,yl),c===0?(r(),s("span",hl," Principal ")):f("",!0),o("button",{type:"button",class:"absolute top-1 right-1 w-7 h-7 rounded-full bg-white/95 text-slate-700 shadow hover:bg-red-50 hover:text-red-700 text-sm font-bold opacity-90 group-hover:opacity-100",title:"Quitar foto",onClick:S=>mo(c)}," à ",8,kl)]))),128))])):f("",!0)]),o("div",null,[e[117]||(e[117]=o("label",{class:"block text-sm font-medium text-gray-700 mb-2"},"Stock",-1)),g(o("select",{"onUpdate:modelValue":e[35]||(e[35]=l=>t.value.stock=l),class:"w-full px-3 py-2 border border-gray-300 rounded-lg focus:outline-none focus:ring-2 focus:ring-blue-500/30 focus:border-blue-500"},[...e[116]||(e[116]=[o("option",{value:!0},"En Stock",-1),o("option",{value:!1},"Sin Stock",-1)])],512),[[D,t.value.stock]])])]),o("div",wl,[C.value?(r(),s("button",{key:0,t
5ype:"button",onClick:Eo,class:"px-6 py-3 bg-gray-200 text-gray-700 rounded-lg hover:bg-gray-300 transition-colors font-medium"}," Cancelar edición ")):f("",!0),o("button",{type:"button",onClick:be,class:"px-6 py-3 bg-gray-200 text-gray-700 rounded-lg hover:bg-gray-300 transition-colors font-medium"}," Limpiar "),o("button",{type:"submit",disabled:T.value,class:"px-6 py-3 bg-red-600 text-white rounded-lg hover:bg-red-700 transition-colors disabled:opacity-50 disabled:cursor-not-allowed font-medium"},[T.value?(r(),s("span",Sl,i(C.value?"Actualizando...":"Guardando..."),1)):(r(),s("span",Al,i(C.value?"Actualizar producto":"Guardar producto"),1))],8,Cl)])],32)],512)):f("",!0)])):f("",!0)])}}};export{Ol as default};
Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.