/* ════ UNA MESA · Auth modal + Profile screen ════ */

const CUISINE_PREFS = ['Marisco','Asador','Arroces','Japonés','Tapas','Vegetariano','Brunch','Fusión','Italiano','Gallego'];

function AuthModal({ onClose, onAuth, initialMode, geoLabel }) {
  const [mode, setMode] = useState(initialMode || 'signup'); // login | signup
  const [name, setName] = useState('');
  const [email, setEmail] = useState('');
  const [prefs, setPrefs] = useState([]);
  const [loc, setLoc] = useState(geoLabel || '');
  const togglePref = p => setPrefs(s => s.includes(p) ? s.filter(x=>x!==p) : [...s, p]);
  const submit = e => {
    e.preventDefault();
    const display = mode==='signup' ? (name.trim()||'Comensal') : formatName({ name:'', email:email.trim() });
    onAuth({ name: display.charAt(0).toUpperCase()+display.slice(1), email: email||'tú@unamesa.co', prefs, location: loc });
  };
  const isSignup = mode==='signup';
  return React.createElement(Modal, { onClose, max: isSignup ? 460 : 420 },
    React.createElement('h2', null, isSignup ? 'Crea tu perfil' : 'Bienvenido de nuevo'),
    React.createElement('p', { className:'msub' }, isSignup ? 'Personalizamos tus recomendaciones según tu gusto y tu zona.' : 'Entra para reservar y ver tus mesas.'),
    React.createElement('div', { className:'seg' },
      React.createElement('button',{className:isSignup?'on':'',onClick:()=>setMode('signup')},'Crear perfil'),
      React.createElement('button',{className:!isSignup?'on':'',onClick:()=>setMode('login')},'Iniciar sesión')),
    React.createElement('div', { className:'sso' },
      React.createElement('button',{className:'sso-btn',onClick:()=>onAuth({name:'Comensal',email:'tú@gmail.com',prefs,location:loc})},
        React.createElement(Icon,{name:'google'}),'Continuar con Google')),
    React.createElement('div', { className:'divider' }, isSignup ? 'o crea tu perfil con email' : 'o con tu email'),
    React.createElement('form', { onSubmit:submit },
      isSignup?React.createElement('div',{className:'field'},
        React.createElement('label',null,'Nombre'),
        React.createElement('input',{value:name,onChange:e=>setName(e.target.value),placeholder:'Tu nombre',required:true})):null,
      React.createElement('div',{className:'field'},
        React.createElement('label',null,'Email'),
        React.createElement('input',{type:'email',value:email,onChange:e=>setEmail(e.target.value),placeholder:'tu@email.com',required:true})),
      React.createElement('div',{className:'field'},
        React.createElement('label',null,'Contraseña'),
        React.createElement('input',{type:'password',placeholder:'••••••••',required:true})),
      isSignup?React.createElement('div',{className:'field'},
        React.createElement('label',null,'Ubicación'),
        React.createElement('input',{value:loc,onChange:e=>setLoc(e.target.value),placeholder:'Tu ciudad o barrio (p. ej. Alicante)'})):null,
      isSignup?React.createElement('div',{className:'field'},
        React.createElement('label',null,'Preferencias culinarias'),
        React.createElement('div',{className:'pref-chips'},
          CUISINE_PREFS.map(p=>React.createElement('button',{
            key:p, type:'button', className:'chip'+(prefs.includes(p)?' on':''), onClick:()=>togglePref(p)
          }, p)))):null,
      React.createElement('button',{className:'btn btn-acc btn-block btn-lg',type:'submit',style:{marginTop:'8px'}},
        isSignup?'Crear perfil':'Entrar')),
    React.createElement('p',{className:'muted',style:{fontSize:'12px',textAlign:'center',marginTop:'16px'}},
      'Demo · no se envían datos reales.')
  );
}

function mapSupaBooking(r) {
  const today = new Date().toLocaleDateString('en-CA');
  const isPast = r.date < today || r.status === 'cancelled';
  const d = new Date(r.date + 'T12:00:00');
  const MONTHS = ['ene','feb','mar','abr','may','jun','jul','ago','sep','oct','nov','dic'];
  const DAYS = ['dom','lun','mar','mié','jue','vie','sáb'];
  return {
    rawId:           r.id,
    id:              r.id.toString().slice(0, 8).toUpperCase(),
    rid:             r.venue_id,
    name:            r.venues?.name || 'Restaurante',
    cz:              { from: '#2D2420', to: '#4A3728' },
    glyph:           'spoon',
    dayLabel:        `${DAYS[d.getDay()]} ${d.getDate()} ${MONTHS[d.getMonth()]}`,
    time:            (r.time || '').slice(0, 5),
    party:           r.pax,
    deposit:         r.pax * 10,
    depositCents:    r.pax * 1000,
    paymentIntentId: r.payment_intent_id || null,
    userId:          r.user_id || null,
    status:          isPast ? 'past' : 'up',
    rawStatus:       r.status,
    isCancellable:   ['confirmed', 'pending'].includes(r.status),
  };
}

function ProfileScreen({ user, bookings, favs, data, openRest, toggleFav, startBook, go, spoons, onRedeem }) {
  const [tab, setTab] = useState('reservas');
  const [supaBookings, setSupaBookings] = useState(null);
  const [cancelTarget, setCancelTarget] = useState(null);
  const [cancelBusy, setCancelBusy] = useState(false);
  const [cancelError, setCancelError] = useState('');
  const [showDeleteModal, setShowDeleteModal] = useState(false);
  const [deleting, setDeleting] = useState(false);

  useEffect(() => {
    if (!window.UMAuth?.sb) { setSupaBookings([]); return; }
    const sb = window.UMAuth.sb;
    async function load() {
      try {
        const { data: { user: authUser } } = await sb.auth.getUser();

        let query = sb.from('reservations')
          .select('*, venues(name, address, photo_url, cuisine)')
          .in('status', ['confirmed', 'unconfirmed', 'pending'])
          .order('date', { ascending: false });

        if (authUser?.id) {
          query = query.or(`user_id.eq.${authUser.id},customer_name.ilike.%${user.name}%`);
        } else {
          query = query.ilike('customer_name', `%${user.name}%`);
        }

        const { data, error } = await query;
        if (error) { console.warn('[UNA MESA] loadBookings:', error.message); setSupaBookings([]); return; }
        setSupaBookings((data || []).map(mapSupaBooking));
      } catch(e) {
        console.warn('[UNA MESA] loadBookings:', e.message);
        setSupaBookings([]);
      }
    }
    load();
  }, [user]);

  const doCancel = async (booking) => {
    const b = booking || cancelTarget;
    if (!b || cancelBusy) return;
    setCancelBusy(true);
    setCancelError('');

    const sb = window.UMAuth.sb;

    /* 1 · Stripe refund — NON-FATAL, never blocks step 2 */
    try {
      const { data, error } = await sb.functions.invoke('stripe-refund', { body: { payment_intent_id: b.paymentIntentId } });
      if (error) { const t = await error.context?.text?.(); console.warn('[UNA MESA] stripe-refund:', t); }
    } catch(e) { console.warn('[UNA MESA] stripe-refund:', e.message); }

    /* 2 · DB update — ALWAYS runs */
    const { data: updateData, error: updateError } = await sb.functions.invoke('update-reservation', {
      body: { reservation_id: b.rawId, status: 'cancelled' }
    });
    if (updateError || updateData?.error) {
      console.warn('[CANCEL DB]', updateError || updateData.error);
      setCancelBusy(false);
      return;
    }

    /* 3 · Log cancellation record — non-fatal */
    try {
      await sb.from('cancellations').insert([{
        reservation_id: b.rawId,
        user_id:        b.userId,
        reason:         'user_cancelled',
        refund_amount:  b.depositCents,
      }]);
    } catch(e) { console.warn('[UNA MESA] cancellations insert:', e.message); }

    /* 4 · Send cancellation email — non-fatal */
    console.log('=== EMAIL GUARD v2 ===', { hasUser: !!user, email: user?.email });
    if (user?.email) {
      try {
        console.log('[EMAIL INVOKE] llamando send-cancellation-email...');
        const { data, error } = await sb.functions.invoke('send-cancellation-email', {
          body: {
            to:              user.email,
            customer_name:   user.name || user.email,
            restaurant_name: b.name,
            date:            b.dayLabel,
            time:            b.time,
            pax:             b.party,
            deposit_amount:  b.depositCents,
          }
        });
        if (error) {
          const errText = await error.context?.text?.();
          console.warn('[EMAIL ERROR]', errText || error.message);
        } else {
          console.log('[EMAIL OK]', data);
        }
      } catch(e) { console.warn('[EMAIL EXCEPTION]', e.message); }
    } else {
      console.warn('[EMAIL SKIP] sin user.email');
    }

    /* 5 · Update local UI */
    setSupaBookings(prev => prev.filter(x => x.rawId !== b.rawId));
    setCancelTarget(null);
    setCancelBusy(false);
  };

  const deleteAccount = async () => {
    setDeleting(true);
    try {
      const userData = localStorage.getItem('um-app-user');
      const localUser = userData ? JSON.parse(userData) : null;

      if (!localUser?.email) {
        console.error('No hay sesión activa');
        setDeleting(false);
        return;
      }

      const res = await fetch('https://rkaytcmyaaighozxatod.supabase.co/functions/v1/delete-account', {
        method: 'POST',
        headers: { 'Content-Type': 'application/json' },
        body: JSON.stringify({ email: localUser.email })
      });

      if (res.ok) {
        localStorage.clear();
        window.location.href = '/';
      } else {
        const err = await res.json();
        console.error('Error:', err);
      }
    } catch(e) {
      console.error('Error eliminando cuenta:', e);
    }
    setDeleting(false);
  };

  const now = Date.now();
  const activeBookings = supaBookings !== null ? supaBookings : bookings;
  const upcoming = activeBookings.filter(b=>b.status==='up');
  const past = activeBookings.filter(b=>b.status==='past');
  const favList = data.filter(r=>favs.includes(r.id));
  const points = Math.min(100, bookings.length*18 + favs.length*4);
  const visits = bookings.length;
  const toNext = Math.max(0, 5 - (visits%5||0));

  const BookingRow = (b, isPast) => {
    return React.createElement('div', { key:b.id, className:'booking-row' },
    React.createElement('div', { className:'booking-thumb', style:{ width:56, height:56, borderRadius:12, background:'linear-gradient(150deg, #2D2420, #4A3728)', flexShrink:0 } }),
    React.createElement('div',{className:'br-main'},
      React.createElement('div',{className:'br-name'},b.name),
      React.createElement('div',{className:'br-meta'}, (b.dayLabel||'Hoy')+' · '+b.time+' · '+b.party+(b.party===1?' comensal':' comensales')),
      React.createElement('div',{className:'br-meta',style:{marginTop:'2px'}},'Reserva '+b.id+' · depósito '+b.deposit+'€')),
    React.createElement('div',{style:{display:'flex',flexDirection:'column',gap:'8px',alignItems:'flex-end'}},
      React.createElement('span',{className:'br-status '+(isPast?'st-past':'st-up')}, isPast?'Completada':'Confirmada'),
      React.createElement('button',{className:'btn btn-soft btn-sm',onClick:()=>openRest(b.rid)}, isPast?'Reservar otra vez':'Ver restaurante'),
      !isPast && b.isCancellable
        ? React.createElement('button',{
            className:'btn btn-sm',
            style:{color:'#E85D3A',background:'transparent',border:'1px solid rgba(232,93,58,0.4)',borderRadius:'8px',padding:'4px 12px',fontSize:'12px',cursor:'pointer',lineHeight:'1.5'},
            onClick:()=>{ setCancelError(''); setCancelTarget(b); }
          },'Cancelar')
        : null
    ));
  };

  const cancelModal = cancelTarget && React.createElement('div', {
    style: {
      position: 'fixed', inset: 0, background: 'rgba(0,0,0,0.5)',
      display: 'flex', alignItems: 'center', justifyContent: 'center',
      zIndex: 1000
    }
  },
    React.createElement('div', {
      style: {
        background: '#FAF6F0', borderRadius: 16, padding: 32,
        maxWidth: 400, width: '90%', textAlign: 'center'
      }
    },
      React.createElement('h3', { style: { fontFamily: 'Playfair Display', marginBottom: 12 } }, '¿Cancelar esta reserva?'),
      React.createElement('p', { style: { color: '#666', marginBottom: 24, fontSize: 14 } },
        'El depósito será reembolsado en 5-10 días hábiles.'
      ),
      React.createElement('div', { style: { display: 'flex', gap: 12, justifyContent: 'center' } },
        React.createElement('button', {
          onClick: () => setCancelTarget(null),
          style: { padding: '10px 24px', borderRadius: 8, border: '1px solid #ddd', background: 'white', cursor: 'pointer' }
        }, 'Volver'),
        React.createElement('button', {
          onClick: () => { doCancel(cancelTarget); setCancelTarget(null); },
          style: { padding: '10px 24px', borderRadius: 8, border: 'none', background: '#FF5733', color: 'white', cursor: 'pointer' }
        }, 'Sí, cancelar')
      )
    )
  );

  let panel;
  if (tab==='reservas') {
    panel = (upcoming.length||past.length)
      ? React.createElement('div', null,
          upcoming.length?React.createElement('div',null,
            React.createElement('div',{className:'prof-sec-label'},'Próximas'),
            upcoming.map(b=>BookingRow(b,false))):null,
          past.length?React.createElement('div',{style:{marginTop:'22px'}},
            React.createElement('div',{className:'prof-sec-label'},'Historial'),
            past.map(b=>BookingRow(b,true))):null)
      : React.createElement('div',{className:'empty'},
          React.createElement(Icon,{name:'cal'}),
          React.createElement('p',null,'Aún no tienes reservas.'),
          React.createElement('button',{className:'btn btn-acc',style:{marginTop:'14px'},onClick:()=>go('results')},'Buscar restaurantes'));
  } else if (tab==='favoritos') {
    panel = favList.length
      ? React.createElement('div',{className:'rgrid'},
          favList.map(r=>React.createElement(RestaurantCard,{key:r.id,r,fav:true,onFav:toggleFav,onOpen:openRest,onBook:startBook})))
      : React.createElement('div',{className:'empty'},
          React.createElement(Icon,{name:'heart'}),
          React.createElement('p',null,'Sin favoritos todavía. Toca el corazón en cualquier restaurante.'),
          React.createElement('button',{className:'btn btn-acc',style:{marginTop:'14px'},onClick:()=>go('results')},'Explorar'));
  } else if (tab==='pasaporte') {
    panel = React.createElement('div', null,
      React.createElement(window.GastroPassport, { data, bookings, openRest, go }),
      React.createElement('div',{style:{marginTop:'22px'}}, React.createElement(window.PalateAI, { user, data, bookings, favs })));
  } else if (tab==='fidelidad') {
    panel = React.createElement(window.RewardsMarket, { spoons, onRedeem });
  }

  const handleDeleteClick = () => setShowDeleteModal(true);

  const deleteModal = showDeleteModal && React.createElement('div', {
    style: {
      position: 'fixed', inset: 0, background: 'rgba(0,0,0,0.4)',
      display: 'flex', alignItems: 'center', justifyContent: 'center',
      zIndex: 999, padding: '16px'
    }
  },
    React.createElement('div', {
      style: {
        background: '#fff', borderRadius: '20px', padding: '28px 24px',
        maxWidth: '340px', width: '100%', boxShadow: '0 20px 60px rgba(0,0,0,0.15)'
      }
    },
      React.createElement('div', {
        style: { width: 44, height: 44, borderRadius: '12px', background: '#FEE2E2',
          display: 'flex', alignItems: 'center', justifyContent: 'center', marginBottom: 16 }
      },
        React.createElement('i', { className: 'ti ti-trash', style: { color: '#EF4444', fontSize: 20 } })
      ),
      React.createElement('h3', {
        style: { fontWeight: 800, fontSize: 16, color: '#111', marginBottom: 8 }
      }, '¿Eliminar tu cuenta?'),
      React.createElement('p', {
        style: { fontSize: 13, color: '#6B7280', lineHeight: 1.6, marginBottom: 24 }
      }, 'Esta acción es irreversible. Se eliminarán todos tus datos personales. Tus reservas pasadas quedarán anonimizadas.'),
      React.createElement('div', { style: { display: 'flex', gap: 10 } },
        React.createElement('button', {
          onClick: () => setShowDeleteModal(false),
          style: {
            flex: 1, padding: '12px', borderRadius: '12px',
            border: '1.5px solid #E5E7EB', background: '#fff',
            fontSize: 13, fontWeight: 600, color: '#374151', cursor: 'pointer'
          }
        }, 'Cancelar'),
        React.createElement('button', {
          onClick: deleteAccount,
          disabled: deleting,
          style: {
            flex: 1, padding: '12px', borderRadius: '12px',
            border: 'none', background: '#EF4444',
            fontSize: 13, fontWeight: 700, color: '#fff',
            cursor: deleting ? 'not-allowed' : 'pointer',
            opacity: deleting ? 0.6 : 1
          }
        }, deleting ? 'Eliminando...' : 'Sí, eliminar')
      )
    )
  );

  return React.createElement(React.Fragment, null,
    cancelModal,
    deleteModal,
    React.createElement('div', { className:'view' },
      React.createElement('div', { className:'wrap' },
        React.createElement('div', { className:'prof-hero' },
          React.createElement('div',{className:'prof-av'}, formatName(user)[0].toUpperCase()),
          React.createElement('div',null,
            React.createElement('div',{className:'prof-name display'}, '¡Hola, '+formatName(user).split(' ')[0]+'!'),
            React.createElement('div',{className:'prof-mail'}, user.email)),
          React.createElement('div',{className:'loyalty', style:{marginTop:60}},
            React.createElement('div',{className:'ll'},'Programa Mesa'),
            React.createElement('div',{className:'lv'}, points+' pts'),
            React.createElement('div',{className:'lbar'},React.createElement('i',{style:{width:Math.max(8,points)+'%'}})),
            React.createElement('div',{className:'lnext'}, toNext+' visitas para tu próxima recompensa'))
        ),
        React.createElement('div', { className:'tabs' },
          React.createElement('div',{className:'tab'+(tab==='reservas'?' on':''),onClick:()=>setTab('reservas')},'Mis reservas'),
          React.createElement('div',{className:'tab'+(tab==='pasaporte'?' on':''),onClick:()=>setTab('pasaporte')},'Pasaporte'),
          React.createElement('div',{className:'tab'+(tab==='favoritos'?' on':''),onClick:()=>setTab('favoritos')},'Favoritos'),
          React.createElement('div',{className:'tab'+(tab==='fidelidad'?' on':''),onClick:()=>setTab('fidelidad')},'Recompensas')),
        panel,
        React.createElement('div', { style: { marginTop: '32px', paddingTop: '24px', borderTop: '1px solid #FEE2E2' } },
          React.createElement('p', { style: { fontSize: '12px', color: '#9CA3AF', marginBottom: '12px' } }, 'Zona de peligro'),
          React.createElement('button', {
            onClick: handleDeleteClick,
            style: { fontSize: '14px', color: '#EF4444', fontWeight: 500, display: 'flex', alignItems: 'center', gap: '8px', background: 'none', border: 'none', cursor: 'pointer', padding: 0 }
          }, 'Eliminar mi cuenta')
        )
      )
    )
  );
}

Object.assign(window, { AuthModal, ProfileScreen });
// cache bust Thu 11 Jun 2026 01:11:17 BST
