/* =========================================================
   FitPlan — App React
   Todas as telas, componentes reutilizáveis e navegação.
   ========================================================= */

const { useState, useEffect, useMemo, useRef, useCallback } = React;
const FP = window.FP;

/* =========================================================
   ÍCONES (SVG inline, traço fino estilo premium)
   ========================================================= */
const Icon = ({ name, className = 'w-6 h-6', stroke = 1.6 }) => {
  const common = {
    xmlns: 'http://www.w3.org/2000/svg',
    fill: 'none',
    viewBox: '0 0 24 24',
    strokeWidth: stroke,
    stroke: 'currentColor',
    strokeLinecap: 'round',
    strokeLinejoin: 'round',
    className,
  };
  const paths = {
    home:   <><path d="M3 11.5 12 4l9 7.5"/><path d="M5 10v9a1 1 0 0 0 1 1h4v-6h4v6h4a1 1 0 0 0 1-1v-9"/></>,
    meal:   <><path d="M5 3v9a3 3 0 0 0 3 3v6"/><path d="M8 3v6"/><path d="M11 3v6"/><path d="M16 3c-1.5 0-3 2-3 5s1.5 5 3 5v8"/></>,
    dumbbell: <><path d="M2 9v6"/><path d="M22 9v6"/><path d="M5 6v12"/><path d="M19 6v12"/><path d="M5 12h14"/></>,
    check:  <><path d="M5 12.5 10 17.5 19 7.5"/></>,
    user:   <><circle cx="12" cy="8" r="4"/><path d="M4 21c1.5-4 5-6 8-6s6.5 2 8 6"/></>,
    plus:   <><path d="M12 5v14"/><path d="M5 12h14"/></>,
    minus:  <><path d="M5 12h14"/></>,
    flame:  <><path d="M12 2c1 4 5 5 5 10a5 5 0 0 1-10 0c0-2 1-3 2-4-1 4 3 5 3-3 0-1 0-2 0-3z"/></>,
    drop:   <><path d="M12 3s6 6 6 11a6 6 0 1 1-12 0c0-5 6-11 6-11z"/></>,
    bolt:   <><path d="M13 2 4 14h7l-1 8 9-12h-7l1-8z"/></>,
    arrowR: <><path d="M5 12h14"/><path d="m13 6 6 6-6 6"/></>,
    arrowL: <><path d="M19 12H5"/><path d="m11 18-6-6 6-6"/></>,
    book:   <><path d="M4 5a2 2 0 0 1 2-2h12v18H6a2 2 0 0 1-2-2z"/><path d="M4 5v14"/></>,
    target: <><circle cx="12" cy="12" r="9"/><circle cx="12" cy="12" r="5"/><circle cx="12" cy="12" r="1.5" fill="currentColor"/></>,
    settings: <><circle cx="12" cy="12" r="3"/><path d="M19.4 15a1.7 1.7 0 0 0 .3 1.8l.1.1a2 2 0 0 1-2.8 2.8l-.1-.1a1.7 1.7 0 0 0-1.8-.3 1.7 1.7 0 0 0-1 1.5V21a2 2 0 0 1-4 0v-.1a1.7 1.7 0 0 0-1.1-1.5 1.7 1.7 0 0 0-1.8.3l-.1.1a2 2 0 0 1-2.8-2.8l.1-.1a1.7 1.7 0 0 0 .3-1.8 1.7 1.7 0 0 0-1.5-1H3a2 2 0 0 1 0-4h.1A1.7 1.7 0 0 0 4.6 9a1.7 1.7 0 0 0-.3-1.8l-.1-.1a2 2 0 0 1 2.8-2.8l.1.1a1.7 1.7 0 0 0 1.8.3H9a1.7 1.7 0 0 0 1-1.5V3a2 2 0 0 1 4 0v.1c0 .7.4 1.3 1 1.5h.1a1.7 1.7 0 0 0 1.8-.3l.1-.1a2 2 0 0 1 2.8 2.8l-.1.1a1.7 1.7 0 0 0-.3 1.8V9c.2.6.8 1 1.5 1H21a2 2 0 0 1 0 4h-.1c-.7 0-1.3.4-1.5 1z"/></>,
    edit:   <><path d="M12 20h9"/><path d="M16.5 3.5a2.1 2.1 0 0 1 3 3L7 19l-4 1 1-4z"/></>,
    chevR:  <><path d="m9 6 6 6-6 6"/></>,
    chevL:  <><path d="m15 6-6 6 6 6"/></>,
    sparkle:<><path d="M12 3v4"/><path d="M12 17v4"/><path d="M3 12h4"/><path d="M17 12h4"/><path d="m6 6 2.5 2.5"/><path d="m15.5 15.5 2.5 2.5"/><path d="m6 18 2.5-2.5"/><path d="m15.5 8.5 2.5-2.5"/></>,
    swap:   <><path d="M7 7h11"/><path d="m15 4 3 3-3 3"/><path d="M17 17H6"/><path d="m9 20-3-3 3-3"/></>,
    play:   <><path d="M6 4v16l14-8z"/></>,
    clock:  <><circle cx="12" cy="12" r="9"/><path d="M12 7v5l3 2"/></>,
    chart:  <><path d="M3 3v18h18"/><path d="M7 15l4-6 4 4 5-8"/></>,
    camera: <><path d="M5 7h2l2-3h6l2 3h2a2 2 0 0 1 2 2v9a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2V9a2 2 0 0 1 2-2z"/><circle cx="12" cy="13" r="4"/></>,
    moon:   <><path d="M21 12.8A9 9 0 1 1 11.2 3a7 7 0 0 0 9.8 9.8z"/></>,
    leaf:   <><path d="M5 21c0-9 7-16 16-16-1 9-7 15-16 16z"/><path d="M5 21c4-4 7-7 11-11"/></>,
    apple:  <><path d="M12 7c-2-3-6-2-7 1-1 5 3 12 7 12s8-7 7-12c-1-3-5-4-7-1z"/><path d="M12 7v-2c0-1 1-2 2-2"/></>,
    fire:   <><path d="M12 2c1 3 5 4 5 9a5 5 0 1 1-10 0c0-2 1-3 2-4-.5 3 2 4 3-2 0-1 0-2 0-3z"/></>,
    weight: <><circle cx="12" cy="13" r="8"/><path d="M9 7h6l1-3H8z"/><path d="M12 11v4"/></>,
    bell:   <><path d="M6 8a6 6 0 1 1 12 0c0 7 3 9 3 9H3s3-2 3-9z"/><path d="M10 21a2 2 0 0 0 4 0"/></>,
    bellOff:<><path d="M2 2l20 20"/><path d="M6 8a6 6 0 0 1 9.7-4.7"/><path d="M18 8c0 7 3 9 3 9H7"/><path d="M10 21a2 2 0 0 0 4 0"/></>,
    x:      <><path d="M6 6l12 12"/><path d="M18 6L6 18"/></>,
  };
  return <svg {...common}>{paths[name] || null}</svg>;
};

/* =========================================================
   PRIMITIVOS DE UI
   ========================================================= */

const Card = ({ className = '', children, onClick }) => (
  <div
    onClick={onClick}
    className={`bg-surface rounded-3xl shadow-soft ${onClick ? 'cursor-pointer active:scale-[.99] transition' : ''} ${className}`}
  >
    {children}
  </div>
);

const Pill = ({ active, children, onClick, className = '' }) => (
  <button
    onClick={onClick}
    className={`px-4 py-2 rounded-full text-sm font-medium whitespace-nowrap transition
      ${active
        ? 'bg-brand text-white shadow-soft'
        : 'bg-surface text-ink-soft border border-line hover:border-brand'} ${className}`}
  >
    {children}
  </button>
);

const Button = ({ children, onClick, variant = 'primary', className = '', size = 'md', icon, type='button' }) => {
  const base = 'inline-flex items-center justify-center gap-2 font-semibold rounded-2xl transition active:scale-[.98] disabled:opacity-50';
  const sizes = { sm: 'px-3 py-2 text-sm', md: 'px-5 py-3 text-sm', lg: 'px-6 py-4 text-base' };
  const variants = {
    primary:  'bg-brand text-white hover:bg-brand-light shadow-pop',
    accent:   'bg-accent text-brand-dark hover:brightness-105 shadow-soft',
    ghost:    'bg-brand-tint text-brand hover:bg-brand/10',
    outline:  'bg-surface text-ink border border-line hover:border-brand',
    danger:   'bg-danger/10 text-danger border border-danger/30 hover:bg-danger/20',
  };
  return (
    <button type={type} onClick={onClick} className={`${base} ${sizes[size]} ${variants[variant]} ${className}`}>
      {icon && <Icon name={icon} className="w-5 h-5" />}
      {children}
    </button>
  );
};

const ProgressBar = ({ value, max = 100, color = 'bg-brand', track = 'bg-line', height = 'h-2' }) => {
  const pct = Math.min(100, Math.max(0, (value / max) * 100));
  return (
    <div className={`w-full ${track} rounded-full overflow-hidden ${height}`}>
      <div className={`${color} ${height} rounded-full transition-all duration-500`} style={{ width: `${pct}%` }} />
    </div>
  );
};

const Ring = ({
  value, max = 100, size = 120, stroke = 10, label, sublabel,
  color = '#9A6CD1',
  trackColor = '#ECE6F4',
  labelClass = 'text-ink',
  sublabelClass = 'text-ink-muted',
}) => {
  const radius = (size - stroke) / 2;
  const circ = 2 * Math.PI * radius;
  const pct = Math.min(1, Math.max(0, value / max));
  const offset = circ * (1 - pct);
  return (
    <div className="relative" style={{ width: size, height: size }}>
      <svg width={size} height={size} className="-rotate-90">
        <circle cx={size/2} cy={size/2} r={radius} stroke={trackColor} strokeWidth={stroke} fill="none" />
        <circle
          cx={size/2} cy={size/2} r={radius}
          stroke={color} strokeWidth={stroke} fill="none"
          strokeDasharray={circ} strokeDashoffset={offset}
          strokeLinecap="round"
          style={{ transition: 'stroke-dashoffset 600ms ease' }}
        />
      </svg>
      <div className="absolute inset-0 flex flex-col items-center justify-center">
        <div className={`text-2xl font-bold leading-tight ${labelClass}`}>{label}</div>
        {sublabel && <div className={`text-[11px] uppercase tracking-wider mt-1 ${sublabelClass}`}>{sublabel}</div>}
      </div>
    </div>
  );
};

const Section = ({ title, action, children, className = '' }) => (
  <section className={`mb-6 ${className}`}>
    {(title || action) && (
      <div className="flex items-end justify-between mb-3 px-1">
        {title && <h2 className="text-lg font-bold text-ink">{title}</h2>}
        {action}
      </div>
    )}
    {children}
  </section>
);

const Stat = ({ value, label, color = 'text-brand', icon }) => (
  <div className="flex flex-col items-center gap-1">
    {icon && <div className="text-ink-muted">{icon}</div>}
    <div className={`font-bold text-lg ${color}`}>{value}</div>
    <div className="text-[11px] text-ink-muted uppercase tracking-wider">{label}</div>
  </div>
);

/* Logo — usa logo-icon.png / logo-full.png se existirem na pasta;
   senão, mostra um placeholder elegante com a letra F.
   Sempre preserva aspect ratio (height: auto) para não distorcer a imagem. */
const Logo = ({ variant = 'icon', size = 120, className = '' }) => {
  const [failed, setFailed] = useState(false);
  const src = variant === 'full' ? 'logo-full.png' : 'logo-icon.png';

  if (failed) {
    return (
      <div
        className={`rounded-3xl bg-gradient-to-br from-brand to-brand-dark text-white font-extrabold flex items-center justify-center shadow-pop ${className}`}
        style={{ width: size, height: size, fontSize: size * 0.42 }}
      >
        <span className="bg-gradient-to-br from-accent to-white bg-clip-text text-transparent">F</span>
      </div>
    );
  }

  return (
    <img
      src={src}
      alt="FitsPlan"
      onError={() => setFailed(true)}
      className={`object-contain ${className}`}
      style={{ width: size, height: 'auto', maxHeight: size * 1.2 }}
    />
  );
};

/* Avatar — círculo com foto (se houver) ou inicial. Usado em todo o app.
   Para upload, usa <label> envolvendo o input — funciona em iOS, Android e desktop
   sem precisar de JS programático (que falha no iOS Safari por restrições de gesto). */
const Avatar = ({ user, size = 48, onChange, editable = false }) => {
  const [busy, setBusy] = useState(false);
  const initial = (user.name || 'U').slice(0, 1).toUpperCase();
  const fontSize = Math.max(12, Math.round(size * 0.36));

  const handleFile = async (e) => {
    const file = e.target.files?.[0];
    if (!file || !onChange) return;
    setBusy(true);
    try {
      const dataUrl = await resizeImageToDataUrl(file, 360);
      onChange(dataUrl);
    } catch (err) {
      console.error('Erro ao processar imagem:', err);
      alert('Não foi possível carregar essa imagem. Tente outra.');
    } finally {
      setBusy(false);
      e.target.value = ''; // permite reupload do mesmo arquivo
    }
  };

  const Inner = (
    <div
      className={`relative rounded-full bg-gradient-to-br from-brand to-brand-dark text-white font-bold flex items-center justify-center shadow-soft overflow-hidden shrink-0
        ${editable ? 'cursor-pointer active:scale-95 transition' : ''}`}
      style={{ width: size, height: size, fontSize }}
    >
      {user.avatar ? (
        <img src={user.avatar} alt={user.name} className="w-full h-full object-cover" />
      ) : (
        <span>{initial}</span>
      )}
      {editable && (
        <div className={`absolute inset-0 bg-ink/45 flex items-center justify-center transition ${busy ? 'opacity-100' : 'opacity-0 hover:opacity-100 sm:opacity-0'}`}>
          <Icon name="camera" className="text-white" stroke={2} style={{ width: size * 0.42, height: size * 0.42 }} />
        </div>
      )}
      {editable && !user.avatar && (
        /* Indicador permanente no canto pra mobile (sem hover) */
        <div className="absolute bottom-0 right-0 w-1/3 h-1/3 rounded-full bg-accent text-brand-dark flex items-center justify-center border-2 border-surface" style={{ minWidth: 18, minHeight: 18 }}>
          <Icon name="plus" className="w-3/4 h-3/4" stroke={3} />
        </div>
      )}
    </div>
  );

  if (!editable) return Inner;

  return (
    <label className="inline-block cursor-pointer">
      {Inner}
      <input
        type="file"
        accept="image/*"
        capture="user"
        onChange={handleFile}
        className="sr-only"
        style={{ position: 'absolute', width: 1, height: 1, padding: 0, margin: -1, overflow: 'hidden', clip: 'rect(0,0,0,0)', whiteSpace: 'nowrap', border: 0 }}
      />
    </label>
  );
};

/* Reduz a foto antes de salvar no localStorage (cap em maxSide px, JPEG 0.85). */
function resizeImageToDataUrl(file, maxSide = 360) {
  return new Promise((resolve, reject) => {
    const img = new Image();
    const reader = new FileReader();
    reader.onload = () => { img.src = reader.result; };
    reader.onerror = reject;
    img.onload = () => {
      const ratio = Math.min(1, maxSide / Math.max(img.width, img.height));
      const w = Math.round(img.width * ratio);
      const h = Math.round(img.height * ratio);
      const canvas = document.createElement('canvas');
      canvas.width = w; canvas.height = h;
      const ctx = canvas.getContext('2d');
      ctx.drawImage(img, 0, 0, w, h);
      resolve(canvas.toDataURL('image/jpeg', 0.85));
    };
    img.onerror = reject;
    reader.readAsDataURL(file);
  });
}

/* ExerciseIcon — ilustração 3D + emoji fallback do exercício, sobre gradient pastel. */
const ExerciseIcon = ({ name, size = 56, className = '' }) => {
  const info = FP.exerciseInfo(name);
  const [loaded, setLoaded] = useState(false);
  const [failed, setFailed] = useState(false);
  return (
    <div
      className={`relative rounded-2xl bg-gradient-to-br from-brand-tint to-accent-soft overflow-hidden flex items-center justify-center shrink-0 ${className}`}
      style={{ width: size, height: size }}
    >
      {(!loaded || failed) && (
        <span style={{ fontSize: size * 0.5 }}>{info.emoji}</span>
      )}
      {info.illu && !failed && (
        <img
          src={info.illu}
          alt={name}
          loading="lazy"
          onLoad={() => setLoaded(true)}
          onError={() => setFailed(true)}
          className={`absolute inset-0 w-full h-full object-contain p-1 transition-opacity duration-300 ${loaded ? 'opacity-100' : 'opacity-0'}`}
        />
      )}
    </div>
  );
};

/* IMCBar — barrinha colorida horizontal com marcador na posição do IMC do usuário. */
const IMCBar = ({ imc }) => {
  const pct = FP.imcBarPosition(imc);
  return (
    <div className="relative pt-1 pb-6">
      <div className="h-2.5 rounded-full overflow-hidden flex">
        <div className="bg-info/70"   style={{ width: '14%' }} title="Magreza" />
        <div className="bg-accent"    style={{ width: '26%' }} title="Saudável" />
        <div className="bg-warn/80"   style={{ width: '20%' }} title="Sobrepeso" />
        <div className="bg-warn"      style={{ width: '20%' }} title="Obesidade I" />
        <div className="bg-danger/80" style={{ width: '20%' }} title="Obesidade II+" />
      </div>
      <div
        className="absolute top-0 -translate-x-1/2 w-4 h-4 rounded-full bg-white border-[3px] border-brand-dark shadow-pop transition-all duration-700"
        style={{ left: `${pct}%` }}
      />
      <div className="flex justify-between text-[10px] text-ink-faint mt-1.5">
        <span>15</span><span>18.5</span><span>25</span><span>30</span><span>35</span><span>40</span>
      </div>
    </div>
  );
};

/* IMCCard — card resumo do IMC, reutilizável (dashboard, perfil, progresso). */
const IMCCard = ({ weight, height, compact = false }) => {
  const imc = FP.calcIMC(weight, height);
  const cat = FP.imcCategory(imc);
  const range = FP.healthyWeightRange(height);
  return (
    <Card className={`${compact ? 'p-4' : 'p-5'}`}>
      <div className="flex items-center justify-between mb-2">
        <div>
          <div className="text-xs text-ink-muted uppercase tracking-widest">Seu IMC</div>
          <div className="flex items-baseline gap-2 mt-0.5">
            <span className={`text-3xl font-extrabold ${cat.text}`}>{imc.toFixed(2)}</span>
            <span className={`text-xs px-2 py-0.5 rounded-full font-semibold ${cat.bg} ${cat.text}`}>{cat.short}</span>
          </div>
        </div>
        {!compact && (
          <div className="w-12 h-12 rounded-2xl bg-brand-tint flex items-center justify-center">
            <Icon name="weight" className="w-6 h-6 text-brand" />
          </div>
        )}
      </div>
      <IMCBar imc={imc} />
      {!compact && (
        <div className="mt-3 text-[12px] text-ink-muted">
          Faixa saudável para sua altura: <b className="text-brand-dark">{range.min}–{range.max} kg</b>
        </div>
      )}
    </Card>
  );
};

/* RecipeImage — ilustração 3D centralizada sobre um gradient pastel.
   Fallback elegante para emoji enquanto carrega ou se a URL falhar. */
const RecipeImage = ({ recipe, className = '', emojiSize = 'text-4xl', pad = 'p-2' }) => {
  const [loaded, setLoaded] = useState(false);
  const [error, setError] = useState(false);
  const src = recipe.illustration || recipe.image;
  return (
    <div className={`relative overflow-hidden bg-gradient-to-br ${recipe.gradient} ${className}`}>
      {(!loaded || error) && (
        <div className={`absolute inset-0 flex items-center justify-center ${emojiSize}`}>
          {recipe.emoji}
        </div>
      )}
      {src && !error && (
        <img
          src={src}
          alt={recipe.name}
          loading="lazy"
          onLoad={() => setLoaded(true)}
          onError={() => setError(true)}
          className={`relative w-full h-full object-contain ${pad} transition-opacity duration-500 ${loaded ? 'opacity-100' : 'opacity-0'}`}
        />
      )}
    </div>
  );
};

/* =========================================================
   ONBOARDING (multi-step)
   ========================================================= */

const Onboarding = ({ onFinish }) => {
  const [step, setStep] = useState(0);
  const [data, setData] = useState({
    name: '',
    age: 28,
    sex: 'f',
    height: 168,
    weight: 70,
    targetWeight: 65,
    goal: 'emagrecimento',
    activity: 'moderado',
    days: 4,
    diet: 'normal',
    dislikes: '',
  });

  const update = (k, v) => setData(prev => ({ ...prev, [k]: v }));

  const steps = [
    { id: 'welcome',    title: 'Bem-vindo ao FitsPlan' },
    { id: 'goal',       title: 'Qual o seu objetivo?' },     // ← agora vem ANTES das medidas
    { id: 'identity',   title: 'Vamos te conhecer' },
    { id: 'body',       title: 'Sobre seu corpo' },
    { id: 'imc',        title: 'Seu IMC' },
    { id: 'activity',   title: 'Seu nível de atividade' },
    { id: 'frequency',  title: 'Quantos dias por semana?' },
    { id: 'diet',       title: 'Suas preferências' },
    { id: 'dislikes',   title: 'Algo que você não gosta?' },
    { id: 'finish',     title: 'Tudo pronto!' },
  ];

  const safeStep = Math.min(Math.max(0, step), steps.length - 1);
  const current = steps[safeStep];
  const isLast = safeStep === steps.length - 1;
  const isFirst = safeStep === 0;

  const canAdvance = () => {
    if (current.id === 'identity') return data.name.trim().length >= 2 && data.age > 0;
    return true;
  };

  const next = () => {
    if (!canAdvance()) return;
    if (isLast) {
      const dislikes = (data.dislikes || '').split(',').map(s => s.trim()).filter(Boolean);
      onFinish({ ...data, dislikes });
    } else {
      setStep(s => Math.min(s + 1, steps.length - 1));
    }
  };
  const back = () => setStep(s => Math.max(0, s - 1));

  return (
    <div className="min-h-[100dvh] flex flex-col bg-canvas">
      {/* Header com progresso */}
      <div className="px-6 pt-8 pb-4">
        <div className="flex items-center gap-3 mb-6">
          {!isFirst && (
            <button onClick={back} className="p-2 rounded-full hover:bg-surface">
              <Icon name="chevL" className="w-5 h-5 text-ink-muted" />
            </button>
          )}
          <div className="flex-1 flex gap-1.5">
            {steps.map((s, i) => (
              <div key={s.id} className={`h-1 flex-1 rounded-full transition-all ${i <= safeStep ? 'bg-brand' : 'bg-line'}`} />
            ))}
          </div>
        </div>
      </div>

      {/* Conteúdo */}
      <div className="flex-1 px-6 pb-6 anim-fade-up" key={safeStep}>
        {current.id === 'welcome' && <WelcomeStep />}
        {current.id === 'identity' && <IdentityStep data={data} update={update} />}
        {current.id === 'body' && <BodyStep data={data} update={update} />}
        {current.id === 'imc' && <IMCStep data={data} />}
        {current.id === 'goal' && <GoalStep data={data} update={update} />}
        {current.id === 'activity' && <ActivityStep data={data} update={update} />}
        {current.id === 'frequency' && <FrequencyStep data={data} update={update} />}
        {current.id === 'diet' && <DietStep data={data} update={update} />}
        {current.id === 'dislikes' && <DislikesStep data={data} update={update} />}
        {current.id === 'finish' && <FinishStep data={data} />}
      </div>

      {/* Footer (sem borda — visual mais clean) */}
      <div className="px-6 pt-2 pb-8 bg-gradient-to-t from-canvas via-canvas to-transparent">
        <Button onClick={next} size="lg" className="w-full" icon={isLast ? 'check' : 'arrowR'}>
          {isFirst ? 'Começar' : isLast ? 'Criar meu plano' : 'Continuar'}
        </Button>
      </div>
    </div>
  );
};

const WelcomeStep = () => (
  <div className="flex flex-col items-center justify-center text-center pt-2">
    <Logo variant="icon" size={220} className="mb-6" />
    <h1 className="text-[1.625rem] font-extrabold text-ink leading-[1.15] mb-3 max-w-[340px] text-balance">
      Seu Plano Alimentar e Treino, do seu Jeito.
    </h1>
    <p className="text-ink-muted leading-relaxed max-w-xs text-[15px]">
      Personalizado em minutos.
    </p>
    <div className="mt-8 grid grid-cols-3 gap-2.5 w-full max-w-[280px]">
      <MiniBadge emoji="🥗" label="Alimentação" />
      <MiniBadge emoji="💪" label="Treinos" />
      <MiniBadge emoji="✨" label="Hábitos" />
    </div>
  </div>
);

const MiniBadge = ({ emoji, label }) => (
  <div className="bg-surface rounded-2xl p-3 text-center shadow-soft">
    <div className="text-2xl mb-1">{emoji}</div>
    <div className="text-[11px] text-ink-muted leading-tight font-medium">{label}</div>
  </div>
);

const StepHeader = ({ title, subtitle }) => (
  <div className="mb-8 mt-2">
    <h1 className="text-[28px] font-extrabold text-ink leading-tight mb-2">{title}</h1>
    {subtitle && <p className="text-ink-muted text-[15px] leading-snug">{subtitle}</p>}
  </div>
);

const TextField = ({ label, value, onChange, type = 'text', placeholder, suffix, min, max }) => {
  // Para inputs number, mantemos a string crua durante a edição. Assim o usuário
  // pode apagar o valor todo (incluindo o "0") sem o React reescrever automaticamente.
  const isNum = type === 'number';
  const handleChange = (e) => {
    const raw = e.target.value;
    if (!isNum) return onChange(raw);
    if (raw === '') return onChange('');
    // Aceita "0", "0.5", "12", etc — apenas números válidos
    if (/^-?\d*\.?\d*$/.test(raw)) {
      onChange(raw === '.' ? raw : (raw.endsWith('.') ? raw : Number(raw)));
    }
  };
  const handleFocus = (e) => e.target.select();
  const handleBlur = (e) => {
    if (!isNum) return;
    if (e.target.value === '' || e.target.value === '.') onChange(0);
  };
  return (
    <label className="block">
      <span className="text-xs font-semibold text-ink-muted uppercase tracking-wider">{label}</span>
      <div className="mt-1.5 flex items-center bg-surface border border-line rounded-2xl px-4 py-3 focus-within:border-brand transition-colors">
        <input
          type={isNum ? 'text' : type}
          inputMode={isNum ? 'decimal' : undefined}
          value={value === undefined || value === null ? '' : value}
          onChange={handleChange}
          onFocus={handleFocus}
          onBlur={handleBlur}
          min={min} max={max}
          placeholder={placeholder}
          className="flex-1 min-w-0 bg-transparent outline-none text-ink font-medium"
        />
        {suffix && <span className="text-ink-muted text-sm ml-2 shrink-0">{suffix}</span>}
      </div>
    </label>
  );
};

const IdentityStep = ({ data, update }) => (
  <>
    <StepHeader title="Vamos te conhecer" subtitle="Esses dados ajudam a personalizar seu plano." />
    <div className="space-y-4">
      <TextField label="Nome" value={data.name} onChange={v => update('name', v)} placeholder="Como podemos te chamar?" />
      <TextField label="Idade" value={data.age} onChange={v => update('age', v)} type="number" suffix="anos" />
      <div>
        <span className="text-xs font-semibold text-ink-muted uppercase tracking-wider">Sexo</span>
        <div className="mt-1.5 grid grid-cols-3 gap-2">
          {FP.SEX.map(s => (
            <button
              key={s.id}
              onClick={() => update('sex', s.id)}
              className={`py-3 rounded-2xl text-sm font-semibold border transition
                ${data.sex === s.id
                  ? 'bg-brand text-white border-brand'
                  : 'bg-surface text-ink-soft border-line hover:border-brand/40'}`}
            >
              {s.label}
            </button>
          ))}
        </div>
      </div>
    </div>
  </>
);

const BodyStep = ({ data, update }) => (
  <>
    <StepHeader title="Sobre seu corpo" subtitle="Não se preocupe, você pode atualizar quando quiser." />
    <div className="space-y-4">
      <div className="grid grid-cols-2 gap-3">
        <TextField label="Altura" value={data.height} onChange={v => update('height', v)} type="number" suffix="cm" />
        <TextField label="Peso atual" value={data.weight} onChange={v => update('weight', v)} type="number" suffix="kg" />
      </div>
      <TextField label="Peso desejado" value={data.targetWeight} onChange={v => update('targetWeight', v)} type="number" suffix="kg" />

      <Card className="p-4 bg-brand-tint border border-brand/10">
        <div className="flex items-start gap-3">
          <div className="text-2xl">🌱</div>
          <p className="text-sm text-brand-dark leading-relaxed">
            Vamos calcular suas calorias e macros automaticamente com base no seu objetivo e atividade.
          </p>
        </div>
      </Card>
    </div>
  </>
);

const IMCStep = ({ data }) => {
  const imc = FP.calcIMC(data.weight, data.height);
  const cat = FP.imcCategory(imc);
  const range = FP.healthyWeightRange(data.height);
  const w = Number(data.weight) || 0;
  const diffMin = +(w - range.min).toFixed(1);
  const diffMax = +(w - range.max).toFixed(1);
  return (
    <>
      <StepHeader title="Seu IMC" subtitle="Calculado a partir do seu peso e altura, com 2 casas decimais." />
      <Card className="p-6 text-center">
        <div className="text-xs text-ink-muted uppercase tracking-widest mb-2">Índice de Massa Corporal</div>
        <div className={`text-6xl font-extrabold ${cat.text}`}>{imc.toFixed(2)}</div>
        <div className={`inline-block mt-3 px-4 py-1.5 rounded-full font-semibold text-sm ${cat.bg} ${cat.text}`}>
          {cat.label}
        </div>
        <div className="mt-6"><IMCBar imc={imc} /></div>
        <p className={`text-xs ${cat.text} mt-4 max-w-xs mx-auto leading-relaxed font-medium`}>
          {cat.desc}
        </p>
      </Card>

      {/* Faixa de peso saudável personalizada */}
      <Card className="p-4 mt-3 bg-accent-soft border border-accent/30">
        <div className="flex items-start gap-3">
          <div className="text-2xl">⚖️</div>
          <div className="flex-1">
            <div className="text-xs uppercase tracking-wider text-brand-dark font-semibold">Faixa saudável para sua altura</div>
            <div className="text-lg font-extrabold text-brand-dark mt-0.5">{range.min} – {range.max} kg</div>
            <div className="text-[12px] text-brand-dark/80 mt-1 leading-snug">
              {imc < 18.5 && `Faltam ~${Math.abs(diffMin).toFixed(1)} kg para você entrar na faixa saudável.`}
              {imc >= 18.5 && imc < 25 && `Você está dentro da faixa saudável. Foque em manter ou ajustar composição corporal.`}
              {imc >= 25 && `Para chegar na faixa saudável, perder ~${diffMax.toFixed(1)} kg seria o objetivo.`}
            </div>
          </div>
        </div>
      </Card>

      {/* Cálculo explícito */}
      <Card className="p-4 mt-3 border border-line">
        <div className="text-xs text-ink-muted uppercase tracking-wider mb-2">Como calculamos</div>
        <div className="font-mono text-[13px] text-ink leading-relaxed">
          IMC = {w} ÷ ({(data.height/100).toFixed(2)})²
          <br />
          IMC = {w} ÷ {((data.height/100) ** 2).toFixed(4)}
          <br />
          <b>IMC = {imc.toFixed(2)} kg/m²</b>
        </div>
      </Card>

      <p className="text-[11px] text-ink-faint text-center mt-3 leading-relaxed">
        IMC é uma referência geral. Composição corporal e % de gordura são complementos mais precisos.
      </p>
    </>
  );
};

const GoalStep = ({ data, update }) => (
  <>
    <StepHeader title="Qual o seu objetivo?" subtitle="Você pode trocar a qualquer momento." />
    <div className="space-y-2.5">
      {FP.GOALS.map(g => {
        const active = data.goal === g.id;
        return (
          <button
            key={g.id}
            onClick={() => update('goal', g.id)}
            className={`w-full flex items-center gap-4 p-4 rounded-2xl border transition text-left
              ${active ? 'bg-brand text-white border-brand shadow-pop' : 'bg-surface border-line hover:border-brand/40'}`}
          >
            <div className={`w-12 h-12 rounded-2xl flex items-center justify-center text-2xl ${active ? 'bg-white/15' : 'bg-brand-tint'}`}>
              {g.emoji}
            </div>
            <div className="flex-1">
              <div className={`font-bold ${active ? 'text-white' : 'text-ink'}`}>{g.label}</div>
              <div className={`text-xs ${active ? 'text-white/75' : 'text-ink-muted'}`}>{g.tag}</div>
            </div>
            {active && <Icon name="check" className="w-5 h-5" />}
          </button>
        );
      })}
    </div>
  </>
);

const ActivityStep = ({ data, update }) => (
  <>
    <StepHeader title="Seu nível de atividade" subtitle="Conta tudo: trabalho, esporte e o cotidiano." />
    <div className="space-y-2.5">
      {FP.ACTIVITY.map(a => {
        const active = data.activity === a.id;
        return (
          <button
            key={a.id}
            onClick={() => update('activity', a.id)}
            className={`w-full p-4 rounded-2xl border transition text-left
              ${active ? 'bg-brand text-white border-brand shadow-pop' : 'bg-surface border-line hover:border-brand/40'}`}
          >
            <div className={`font-bold ${active ? 'text-white' : 'text-ink'}`}>{a.label}</div>
            <div className={`text-xs mt-0.5 ${active ? 'text-white/75' : 'text-ink-muted'}`}>{a.desc}</div>
          </button>
        );
      })}
    </div>
  </>
);

const FrequencyStep = ({ data, update }) => (
  <>
    <StepHeader title="Quantos dias por semana?" subtitle="Vamos distribuir treino + descanso." />
    <Card className="p-6 mb-6 text-center">
      <div className="text-6xl font-extrabold text-brand">{data.days}</div>
      <div className="text-ink-muted text-sm mt-1">dias de treino por semana</div>
      <input
        type="range" min="1" max="7" value={data.days}
        onChange={e => update('days', Number(e.target.value))}
        className="fp-range mt-6"
      />
      <div className="flex justify-between mt-2 text-[11px] text-ink-faint">
        <span>1</span><span>2</span><span>3</span><span>4</span><span>5</span><span>6</span><span>7</span>
      </div>
    </Card>
    <div className="grid grid-cols-7 gap-1.5">
      {['S','T','Q','Q','S','S','D'].map((d, i) => (
        <div key={i} className={`text-center text-xs py-2 rounded-xl font-bold
          ${i < data.days ? 'bg-accent text-brand-dark' : 'bg-surface text-ink-faint border border-line'}`}>
          {d}
        </div>
      ))}
    </div>
  </>
);

const DietStep = ({ data, update }) => (
  <>
    <StepHeader title="Suas preferências" subtitle="Vamos respeitar o que faz sentido pra você." />
    <div className="grid grid-cols-2 gap-2.5">
      {FP.DIETS.map(d => {
        const active = data.diet === d.id;
        return (
          <button
            key={d.id}
            onClick={() => update('diet', d.id)}
            className={`p-4 rounded-2xl border text-left transition
              ${active ? 'bg-brand text-white border-brand shadow-pop' : 'bg-surface border-line hover:border-brand/40'}`}
          >
            <div className="text-2xl">{d.emoji}</div>
            <div className={`mt-2 font-semibold ${active ? 'text-white' : 'text-ink'}`}>{d.label}</div>
          </button>
        );
      })}
    </div>
  </>
);

const DislikesStep = ({ data, update }) => (
  <>
    <StepHeader title="Algo que você não gosta?" subtitle="Separe por vírgula. Vamos evitar nas suas receitas." />
    <Card className="p-2">
      <textarea
        rows={4}
        value={data.dislikes}
        onChange={e => update('dislikes', e.target.value)}
        placeholder="Ex: brócolis, atum, abóbora..."
        className="w-full p-3 bg-transparent outline-none text-ink resize-none"
      />
    </Card>
    <div className="mt-4 flex flex-wrap gap-2">
      {['Brócolis', 'Pimentão', 'Atum', 'Cebola', 'Tomate'].map(s => (
        <button
          key={s}
          onClick={() => {
            const current = data.dislikes ? data.dislikes + ', ' : '';
            update('dislikes', current + s);
          }}
          className="px-3 py-1.5 rounded-full text-xs bg-brand-tint text-brand font-medium hover:bg-brand/10"
        >
          + {s}
        </button>
      ))}
    </div>
  </>
);

const FinishStep = ({ data }) => {
  const macros = FP.calcMacros(data);
  const goal = FP.GOALS.find(g => g.id === data.goal);
  return (
    <div className="text-center pt-6">
      <div className="w-20 h-20 rounded-full bg-accent text-brand-dark flex items-center justify-center text-3xl mx-auto mb-5 shadow-pop">
        ✨
      </div>
      <h1 className="text-2xl font-extrabold text-ink mb-2">Tudo pronto, {data.name || 'você'}!</h1>
      <p className="text-ink-muted text-sm mb-8 max-w-xs mx-auto">
        Aqui está seu plano inicial para <b>{goal?.label.toLowerCase()}</b>. Bora começar?
      </p>
      <Card className="p-6 text-left">
        <div className="flex items-center justify-between mb-4">
          <div>
            <div className="text-xs text-ink-muted uppercase tracking-wider">Meta diária</div>
            <div className="text-3xl font-extrabold text-brand">{macros.calories} kcal</div>
          </div>
          <div className="text-4xl">{goal?.emoji}</div>
        </div>
        <div className="grid grid-cols-3 gap-3 pt-4 border-t border-line">
          <Stat value={`${macros.protein}g`} label="Proteína" color="text-brand" />
          <Stat value={`${macros.carbs}g`}  label="Carbs"     color="text-gold" />
          <Stat value={`${macros.fat}g`}    label="Gordura"   color="text-info" />
        </div>
      </Card>
    </div>
  );
};

/* =========================================================
   STORIES (fotos de progresso 24h)
   ========================================================= */

const StoriesRow = ({ user, history, setHistory }) => {
  const [viewerStart, setViewerStart] = useState(null);
  const stories = FP.activeStories(history?.stories);

  const onAddPhoto = async (e) => {
    const file = e.target.files?.[0];
    if (!file) return;
    try {
      const dataUrl = await resizeImageToDataUrl(file, 900); // formato story (alta resolução)
      const next = FP.addStory(history, dataUrl);
      setHistory(next);
      // Mock: simula engajamento dos amigos depois de uns segundos pra demo ficar viva.
      // Em produção isso vem via Realtime do Supabase.
      setTimeout(() => {
        setHistory(prev => FP.simulateFriendEngagement(prev));
      }, 4000);
    } catch (err) {
      alert('Não foi possível carregar essa imagem.');
    }
    e.target.value = '';
  };

  return (
    <>
      <div className="flex gap-3 overflow-x-auto no-scrollbar -mx-1 px-1 pb-1">
        {/* Botão "adicionar story" */}
        <label className="flex flex-col items-center gap-1.5 cursor-pointer shrink-0">
          <div className="relative w-[72px] h-[72px] rounded-full bg-surface border-2 border-dashed border-brand/40 flex items-center justify-center text-brand">
            <Icon name="plus" className="w-6 h-6" stroke={2.4} />
            <input type="file" accept="image/*" capture="environment" onChange={onAddPhoto}
              className="absolute inset-0 opacity-0 cursor-pointer" />
          </div>
          <span className="text-[11px] text-ink-muted font-medium">Adicionar</span>
        </label>

        {/* Stories ativos */}
        {stories.map((s, i) => (
          <button
            key={s.id}
            onClick={() => setViewerStart(i)}
            className="flex flex-col items-center gap-1.5 shrink-0 active:scale-95 transition"
          >
            <div className="relative w-[72px] h-[72px] rounded-full p-[2.5px] bg-gradient-to-br from-brand via-accent to-brand-dark">
              <div className="w-full h-full rounded-full overflow-hidden bg-canvas">
                <img src={s.dataUrl} alt="story" className="w-full h-full object-cover" />
              </div>
            </div>
            <span className="text-[11px] text-ink-muted font-medium">
              {timeAgo(s.createdAt)}
            </span>
          </button>
        ))}
      </div>

      {viewerStart !== null && (
        <StoriesViewer
          stories={stories}
          startIndex={viewerStart}
          user={user}
          history={history}
          setHistory={setHistory}
          onClose={() => setViewerStart(null)}
          onDelete={(id) => {
            setHistory(FP.removeStory(history, id));
            const remaining = stories.filter(s => s.id !== id);
            if (remaining.length === 0) setViewerStart(null);
          }}
        />
      )}
    </>
  );
};

function timeAgo(ts) {
  const minutes = Math.floor((Date.now() - ts) / 60000);
  if (minutes < 1)   return 'agora';
  if (minutes < 60)  return `${minutes}min`;
  const hours = Math.floor(minutes / 60);
  if (hours < 24)    return `${hours}h`;
  return 'expirado';
}

const StoriesViewer = ({ stories, startIndex, user, history, setHistory, onClose, onDelete }) => {
  const [idx, setIdx] = useState(startIndex);
  const [progress, setProgress] = useState(0);
  const [paused, setPaused] = useState(false);
  const [openInfo, setOpenInfo] = useState(null); // 'views' | 'likes' | 'comments' | null
  const [comment, setComment] = useState('');

  // Lê a versão "fresca" do story do history (engajamento muda em tempo real)
  const story = history?.stories?.find(s => s.id === stories[idx]?.id) || stories[idx];

  useEffect(() => {
    document.body.style.overflow = 'hidden';
    return () => { document.body.style.overflow = ''; };
  }, []);

  // Auto-advance a cada 6s (pausa se algum painel/comentário aberto)
  useEffect(() => {
    setProgress(0);
    if (paused || openInfo) return;
    const start = Date.now();
    const dur = 6000;
    const tick = setInterval(() => {
      const p = Math.min(1, (Date.now() - start) / dur);
      setProgress(p);
      if (p >= 1) {
        clearInterval(tick);
        if (idx < stories.length - 1) setIdx(idx + 1);
        else onClose();
      }
    }, 50);
    return () => clearInterval(tick);
  }, [idx, stories.length, onClose, paused, openInfo]);

  if (!story) return null;

  const views    = story.views    || [];
  const likes    = story.likes    || [];
  const comments = story.comments || [];

  const myLike = likes.find(l => l.userId === 'me');
  const toggleLike = () => {
    setHistory(FP.toggleStoryLike(history, story.id, { userId: 'me', name: user.name, avatar: user.avatar }));
  };
  const sendComment = () => {
    if (!comment.trim()) return;
    setHistory(FP.addStoryComment(history, story.id, { userId: 'me', name: user.name, avatar: user.avatar }, comment));
    setComment('');
  };

  return (
    <div className="fixed inset-0 z-[60] bg-ink/95 flex flex-col anim-fade-up">
      {/* Barras de progresso no topo */}
      <div className="flex gap-1 px-3 pt-3 z-10">
        {stories.map((_, i) => (
          <div key={i} className="flex-1 h-0.5 rounded-full bg-white/25 overflow-hidden">
            <div className="h-full bg-white" style={{
              width: i < idx ? '100%' : i === idx ? `${progress * 100}%` : '0%',
              transition: i === idx ? 'none' : undefined,
            }} />
          </div>
        ))}
      </div>

      {/* Header */}
      <div className="flex items-center justify-between px-4 py-3 z-10">
        <div className="flex items-center gap-2.5">
          <Avatar user={user} size={36} />
          <div>
            <div className="text-white text-sm font-semibold leading-tight">{user.name} {user.username && <span className="text-white/50 font-normal">@{user.username}</span>}</div>
            <div className="text-white/60 text-[11px]">{timeAgo(story.createdAt)} • desaparece em {Math.max(0, 24 - Math.floor((Date.now() - story.createdAt) / 3600000))}h</div>
          </div>
        </div>
        <div className="flex items-center gap-2">
          <button
            onClick={() => { if (confirm('Apagar este story?')) onDelete(story.id); }}
            className="w-9 h-9 rounded-full bg-white/15 text-white flex items-center justify-center hover:bg-danger/40"
            aria-label="Apagar"
          >
            🗑️
          </button>
          <button onClick={onClose} className="w-9 h-9 rounded-full bg-white/15 text-white flex items-center justify-center">
            <Icon name="x" className="w-5 h-5" />
          </button>
        </div>
      </div>

      {/* Imagem em formato story (9:16) — flex-1 min-h-0 deixa shrinkar */}
      <div className="flex-1 min-h-0 flex items-center justify-center px-3 relative">
        <div className="relative h-full max-h-full" style={{ aspectRatio: '9 / 16' }}>
          <div className="h-full rounded-3xl overflow-hidden bg-ink-soft shadow-pop">
            <img src={story.dataUrl} alt="story" className="w-full h-full object-cover" />
          </div>
          {/* Tap zones — só dentro da imagem pra não interferir nos controles */}
          <button className="absolute left-0 top-0 bottom-0 w-1/3"  onClick={() => setIdx(Math.max(0, idx - 1))} aria-label="Anterior" />
          <button className="absolute right-0 top-0 bottom-0 w-1/3" onClick={() => idx < stories.length - 1 ? setIdx(idx + 1) : onClose()} aria-label="Próximo" />
        </div>
      </div>

      {/* Stats + ações */}
      <div className="px-4 pt-3 pb-4 z-10 max-w-[460px] mx-auto w-full">
        {/* Counters clicáveis */}
        <div className="flex items-center justify-between gap-3 mb-3">
          <div className="flex items-center gap-3 text-white/85 text-sm">
            <button onClick={() => setOpenInfo(openInfo === 'views' ? null : 'views')} className="inline-flex items-center gap-1.5 hover:text-white">
              👁 <b>{views.length}</b>
            </button>
            <button onClick={() => setOpenInfo(openInfo === 'likes' ? null : 'likes')} className="inline-flex items-center gap-1.5 hover:text-white">
              ❤️ <b>{likes.length}</b>
            </button>
            <button onClick={() => setOpenInfo(openInfo === 'comments' ? null : 'comments')} className="inline-flex items-center gap-1.5 hover:text-white">
              💬 <b>{comments.length}</b>
            </button>
          </div>
          <button
            onClick={toggleLike}
            className={`w-10 h-10 rounded-full flex items-center justify-center text-xl transition active:scale-90 ${myLike ? 'bg-danger/85' : 'bg-white/15 hover:bg-white/25'}`}
            aria-label="Curtir"
          >
            {myLike ? '❤️' : '🤍'}
          </button>
        </div>

        {/* Painel de info expandido */}
        {openInfo && (
          <div className="bg-white/10 rounded-2xl backdrop-blur-md max-h-[35vh] overflow-y-auto mb-3 anim-fade-up">
            {openInfo === 'views' && (
              <EngagementList items={views} emptyText="Ninguém viu ainda" emoji="👁" />
            )}
            {openInfo === 'likes' && (
              <EngagementList items={likes} emptyText="Nenhuma curtida ainda" emoji="❤️" />
            )}
            {openInfo === 'comments' && (
              <div className="p-3 space-y-2">
                {comments.length === 0 && (
                  <div className="text-center text-white/60 text-sm py-4">Nenhum comentário ainda.</div>
                )}
                {comments.map(c => (
                  <div key={c.id} className="flex items-start gap-2.5">
                    <Avatar user={{ name: c.name, avatar: c.avatar }} size={32} />
                    <div className="flex-1 min-w-0">
                      <div className="text-white/85 text-xs"><b className="text-white">{c.name}</b> · {timeAgo(c.ts)}</div>
                      <div className="text-white text-sm leading-snug">{c.text}</div>
                    </div>
                  </div>
                ))}
              </div>
            )}
          </div>
        )}

        {/* Input de comentário */}
        <div className="flex items-center gap-2">
          <input
            value={comment}
            onChange={e => setComment(e.target.value)}
            onFocus={() => setPaused(true)}
            onBlur={() => setPaused(false)}
            onKeyDown={e => e.key === 'Enter' && sendComment()}
            placeholder="Comentar…"
            className="flex-1 px-4 py-2.5 bg-white/10 text-white placeholder-white/50 rounded-full outline-none text-sm border border-white/15"
          />
          <button
            onClick={sendComment}
            disabled={!comment.trim()}
            className="w-10 h-10 rounded-full bg-brand text-white flex items-center justify-center disabled:opacity-40 active:scale-95"
          >
            <Icon name="arrowR" className="w-5 h-5" stroke={2.4} />
          </button>
        </div>
      </div>
    </div>
  );
};

// Lista compacta de quem visualizou ou curtiu
const EngagementList = ({ items, emptyText, emoji }) => {
  if (items.length === 0) {
    return <div className="text-center text-white/60 text-sm py-6">{emptyText}</div>;
  }
  return (
    <div className="p-3 space-y-2">
      {items.map((it, i) => (
        <div key={(it.userId || 'x') + i} className="flex items-center gap-2.5">
          <Avatar user={{ name: it.name, avatar: it.avatar }} size={32} />
          <div className="flex-1 min-w-0">
            <div className="text-white text-sm font-semibold truncate">{it.name}</div>
            <div className="text-white/60 text-[11px]">{timeAgo(it.ts)}</div>
          </div>
          <span className="text-base">{emoji}</span>
        </div>
      ))}
    </div>
  );
};

/* =========================================================
   COMUNIDADE: Lista de amigos + chat
   (Demo local. Para conectar usuários reais entre si, plugar backend.)
   ========================================================= */

const FriendsScreen = ({ user, history, setHistory }) => {
  const friends = history?.friends || [];
  const [openChat, setOpenChat] = useState(null);
  const [openAdd, setOpenAdd] = useState(false);

  return (
    <div className="px-5 pt-3 pb-32 anim-fade-up">
      {/* Banner explicativo */}
      <Card className="p-4 mb-4 bg-gradient-to-br from-brand-tint to-accent-soft border border-brand/10">
        <div className="flex items-start gap-3">
          <div className="text-2xl">💬</div>
          <div>
            <div className="text-sm font-bold text-brand-dark">Conecte com outros usuários</div>
            <div className="text-xs text-ink-muted leading-snug mt-0.5">
              Adicione pessoas, troque dicas e mantenha a motivação em alta.
            </div>
          </div>
        </div>
      </Card>

      <Button onClick={() => setOpenAdd(true)} className="w-full mb-5" icon="plus">Adicionar amigo</Button>

      {friends.length === 0 ? (
        <Card className="p-8 text-center">
          <div className="text-5xl mb-3">👋</div>
          <div className="font-bold text-ink">Nenhum amigo ainda</div>
          <div className="text-sm text-ink-muted mt-1 max-w-xs mx-auto">
            Toque em "Adicionar amigo" para começar a conectar.
          </div>
        </Card>
      ) : (
        <div className="space-y-2">
          {friends.map(f => {
            const msgs = history?.messages?.[f.id] || [];
            const last = msgs[msgs.length - 1];
            const unread = last && last.from === f.id;
            return (
              <Card key={f.id} className="p-3 flex items-center gap-3" onClick={() => setOpenChat(f)}>
                <div className="relative">
                  <Avatar user={{ name: f.name, avatar: f.avatar }} size={48} />
                  {f.online && (
                    <span className="absolute bottom-0 right-0 w-3 h-3 rounded-full bg-accent border-2 border-surface" />
                  )}
                </div>
                <div className="flex-1 min-w-0">
                  <div className="font-semibold text-ink truncate">{f.name}</div>
                  <div className="text-xs text-ink-muted truncate">
                    {last ? (last.from === 'me' ? 'Você: ' : '') + last.text : f.bio || 'Toque para conversar'}
                  </div>
                </div>
                {unread && <span className="w-2.5 h-2.5 rounded-full bg-brand shrink-0" />}
                <Icon name="chevR" className="w-5 h-5 text-ink-faint shrink-0" />
              </Card>
            );
          })}
        </div>
      )}

      {openAdd && (
        <AddFriendSheet
          user={user}
          history={history}
          setHistory={setHistory}
          onClose={() => setOpenAdd(false)}
        />
      )}

      {openChat && (
        <ChatSheet
          friend={openChat}
          history={history}
          setHistory={setHistory}
          onClose={() => setOpenChat(null)}
        />
      )}
    </div>
  );
};

const AddFriendSheet = ({ user, history, setHistory, onClose }) => {
  useEffect(() => {
    document.body.style.overflow = 'hidden';
    return () => { document.body.style.overflow = ''; };
  }, []);

  const [tab, setTab] = useState('username'); // 'username' | 'sugestoes'
  const [usernameInput, setUsernameInput] = useState('');
  const [searchResult, setSearchResult] = useState(null); // null | 'not_found' | {user}
  const [search, setSearch] = useState('');

  const friendIds = new Set((history?.friends || []).map(f => f.id));
  const filteredSuggestions = FP.MOCK_SUGGESTIONS.filter(s =>
    !friendIds.has(s.id) && (!search.trim() || s.name.toLowerCase().includes(search.toLowerCase()))
  );

  const add = (s) => {
    setHistory(FP.addFriend(history, s));
  };

  const searchUsername = () => {
    const found = FP.findUserByUsername(usernameInput);
    if (!found) { setSearchResult('not_found'); return; }
    if (found.username === user?.username) { setSearchResult('self'); return; }
    setSearchResult({ user: found, alreadyFriend: friendIds.has(found.id) });
  };

  const copyMyHandle = () => {
    if (!user?.username) return;
    navigator.clipboard?.writeText('@' + user.username);
    alert('@' + user.username + ' copiado!');
  };

  return (
    <div className="fixed inset-0 z-50 flex items-end justify-center bg-ink/40 backdrop-blur-sm" onClick={onClose}>
      <div onClick={(e) => e.stopPropagation()} className="w-full max-w-[460px] bg-surface rounded-t-3xl max-h-[85dvh] overflow-y-auto anim-pop">
        <div className="sticky top-0 bg-surface pt-3 pb-2 z-10 flex justify-center">
          <div className="w-12 h-1.5 bg-line rounded-full" />
        </div>

        <div className="px-5 pb-5">
          <div className="flex items-center justify-between mb-1">
            <h2 className="text-2xl font-extrabold text-ink">Adicionar amigo</h2>
            <button onClick={onClose} className="w-9 h-9 rounded-full bg-canvas flex items-center justify-center">
              <Icon name="x" className="w-5 h-5 text-ink-muted" />
            </button>
          </div>

          {/* Card "compartilhar meu @" */}
          {user?.username && (
            <Card className="p-3 mb-4 bg-gradient-to-br from-brand-tint to-accent-soft border border-brand/10 flex items-center justify-between">
              <div>
                <div className="text-[10px] uppercase tracking-wider text-brand-dark font-bold">Seu @ pra compartilhar</div>
                <div className="text-lg font-extrabold text-brand-dark">@{user.username}</div>
              </div>
              <button onClick={copyMyHandle} className="px-3 py-2 rounded-xl bg-brand text-white text-xs font-semibold shadow-soft active:scale-95">
                Copiar
              </button>
            </Card>
          )}

          {/* Pills */}
          <div className="flex gap-2 mb-4">
            <Pill active={tab === 'username'} onClick={() => setTab('username')}>Por @usuário</Pill>
            <Pill active={tab === 'sugestoes'} onClick={() => setTab('sugestoes')}>Sugestões</Pill>
          </div>

          {tab === 'username' ? (
            <div>
              <div className="bg-canvas rounded-2xl border border-line px-4 py-3 flex items-center gap-1 mb-3">
                <span className="text-ink-muted font-bold">@</span>
                <input
                  value={usernameInput}
                  onChange={e => { setUsernameInput(e.target.value); setSearchResult(null); }}
                  onKeyDown={e => e.key === 'Enter' && searchUsername()}
                  placeholder="usuario_da_pessoa"
                  autoCapitalize="off"
                  autoCorrect="off"
                  className="flex-1 bg-transparent outline-none text-sm text-ink"
                />
                <button onClick={searchUsername} disabled={!usernameInput.trim()}
                  className="px-3 py-1.5 rounded-xl bg-brand text-white text-xs font-semibold disabled:opacity-40">
                  Buscar
                </button>
              </div>
              <p className="text-[11px] text-ink-faint mb-3">
                Peça o @ da pessoa pra ela. Ex: <b>fernanda</b>, <b>pedrorun</b>.
              </p>

              {searchResult === 'not_found' && (
                <Card className="p-5 text-center">
                  <div className="text-3xl mb-2">🤔</div>
                  <div className="font-semibold text-ink text-sm">Usuário não encontrado</div>
                  <div className="text-xs text-ink-muted mt-1">Confira a grafia do @ ou peça pra pessoa enviar.</div>
                </Card>
              )}
              {searchResult === 'self' && (
                <Card className="p-5 text-center">
                  <div className="text-3xl mb-2">😄</div>
                  <div className="font-semibold text-ink text-sm">Esse é você mesmo!</div>
                  <div className="text-xs text-ink-muted mt-1">Compartilhe o seu @ acima com quem quiser te adicionar.</div>
                </Card>
              )}
              {searchResult && searchResult.user && (
                <Card className="p-3 flex items-center gap-3 anim-fade-up">
                  <Avatar user={{ name: searchResult.user.name, avatar: searchResult.user.avatar }} size={44} />
                  <div className="flex-1 min-w-0">
                    <div className="font-semibold text-ink">{searchResult.user.name}</div>
                    <div className="text-xs text-ink-muted truncate">@{searchResult.user.username} • {searchResult.user.bio}</div>
                  </div>
                  {searchResult.alreadyFriend ? (
                    <span className="text-xs text-ink-muted px-3 py-1.5 rounded-xl bg-canvas">Já é amigo</span>
                  ) : (
                    <Button size="sm" onClick={() => { add(searchResult.user); setSearchResult({ ...searchResult, alreadyFriend: true }); }} icon="plus">
                      Adicionar
                    </Button>
                  )}
                </Card>
              )}
            </div>
          ) : (
            <>
              <div className="bg-canvas rounded-2xl border border-line px-4 py-3 flex items-center gap-2 mb-4">
                <span className="text-ink-faint">🔎</span>
                <input
                  value={search}
                  onChange={e => setSearch(e.target.value)}
                  placeholder="Buscar pelo nome..."
                  className="flex-1 bg-transparent outline-none text-sm text-ink"
                />
              </div>

              {filteredSuggestions.length === 0 ? (
                <Card className="p-6 text-center text-sm text-ink-muted">Ninguém encontrado.</Card>
              ) : (
                <div className="space-y-2">
                  {filteredSuggestions.map(s => (
                    <Card key={s.id} className="p-3 flex items-center gap-3">
                      <Avatar user={{ name: s.name, avatar: s.avatar }} size={44} />
                      <div className="flex-1 min-w-0">
                        <div className="font-semibold text-ink">{s.name}</div>
                        <div className="text-xs text-ink-muted truncate">@{s.username} • {s.bio}</div>
                      </div>
                      <Button size="sm" onClick={() => add(s)} icon="plus">Adicionar</Button>
                    </Card>
                  ))}
                </div>
              )}
            </>
          )}

          <p className="text-[11px] text-ink-faint text-center mt-6 leading-relaxed">
            🔌 Modo demo (busca limitada). Backend Supabase ativa busca em todos os usuários reais.
          </p>
        </div>
      </div>
    </div>
  );
};

const ChatSheet = ({ friend, history, setHistory, onClose }) => {
  const [text, setText] = useState('');
  const messages = history?.messages?.[friend.id] || [];
  const scrollRef = useRef(null);

  useEffect(() => {
    document.body.style.overflow = 'hidden';
    return () => { document.body.style.overflow = ''; };
  }, []);

  useEffect(() => {
    scrollRef.current?.scrollTo({ top: scrollRef.current.scrollHeight, behavior: 'smooth' });
  }, [messages.length]);

  const send = () => {
    const t = text.trim();
    if (!t) return;
    setHistory(FP.sendMessage(history, friend.id, t));
    setText('');
    // Mock: amigo "responde" depois de 1.5s
    setTimeout(() => {
      setHistory(prev => FP.mockReply(prev, friend.id));
    }, 1500);
  };

  return (
    <div className="fixed inset-0 z-50 bg-canvas flex flex-col anim-fade-up">
      {/* Header do chat */}
      <header className="px-4 py-3 bg-surface border-b border-line flex items-center gap-3 shrink-0">
        <button onClick={onClose} className="w-9 h-9 rounded-full hover:bg-canvas flex items-center justify-center">
          <Icon name="chevL" className="w-5 h-5 text-ink-soft" />
        </button>
        <div className="relative">
          <Avatar user={{ name: friend.name, avatar: friend.avatar }} size={40} />
          {friend.online && <span className="absolute bottom-0 right-0 w-2.5 h-2.5 rounded-full bg-accent border-2 border-surface" />}
        </div>
        <div className="flex-1 min-w-0">
          <div className="font-bold text-ink leading-tight">{friend.name}</div>
          <div className="text-[11px] text-ink-muted">{friend.online ? 'online' : 'offline'} • {friend.bio}</div>
        </div>
      </header>

      {/* Mensagens */}
      <div ref={scrollRef} className="flex-1 overflow-y-auto px-4 py-4 space-y-2">
        {messages.length === 0 && (
          <div className="text-center text-sm text-ink-muted mt-12">
            <div className="text-4xl mb-2">👋</div>
            Diga oi pra {friend.name.split(' ')[0]}!
          </div>
        )}
        {messages.map(m => {
          const mine = m.from === 'me';
          return (
            <div key={m.id} className={`flex ${mine ? 'justify-end' : 'justify-start'}`}>
              <div className={`max-w-[78%] px-3.5 py-2 rounded-2xl text-sm leading-snug
                ${mine
                  ? 'bg-brand text-white rounded-br-md'
                  : 'bg-surface text-ink rounded-bl-md border border-line'}`}>
                {m.text}
                <div className={`text-[10px] mt-0.5 ${mine ? 'text-white/65' : 'text-ink-faint'}`}>
                  {new Date(m.ts).toLocaleTimeString('pt-BR', { hour: '2-digit', minute: '2-digit' })}
                </div>
              </div>
            </div>
          );
        })}
      </div>

      {/* Input */}
      <div className="px-3 py-3 bg-surface border-t border-line flex items-center gap-2 shrink-0">
        <input
          value={text}
          onChange={e => setText(e.target.value)}
          onKeyDown={e => e.key === 'Enter' && send()}
          placeholder="Mensagem..."
          className="flex-1 px-4 py-2.5 bg-canvas rounded-full outline-none text-sm text-ink"
        />
        <button
          onClick={send}
          disabled={!text.trim()}
          className="w-10 h-10 rounded-full bg-brand text-white flex items-center justify-center disabled:opacity-40 active:scale-95 transition"
        >
          <Icon name="arrowR" className="w-5 h-5" stroke={2.4} />
        </button>
      </div>
    </div>
  );
};

/* =========================================================
   PAINEL DE NOTIFICAÇÕES (bottom sheet)
   ========================================================= */

const NotificationsSheet = ({ notifications, onClose, onAction, dismissedIds, onDismiss }) => {
  useEffect(() => {
    document.body.style.overflow = 'hidden';
    return () => { document.body.style.overflow = ''; };
  }, []);

  const visible = notifications.filter(n => !dismissedIds.includes(n.id));

  const accentClass = (a) => {
    switch (a) {
      case 'info':   return 'bg-info/10 text-info';
      case 'gold':   return 'bg-gold-soft text-gold';
      case 'accent': return 'bg-accent-soft text-brand-dark';
      default:       return 'bg-brand-tint text-brand-dark';
    }
  };

  return (
    <div className="fixed inset-0 z-50 flex items-end justify-center bg-ink/40 backdrop-blur-sm" onClick={onClose}>
      <div
        onClick={(e) => e.stopPropagation()}
        className="w-full max-w-[460px] bg-surface rounded-t-3xl max-h-[85dvh] overflow-y-auto anim-pop"
      >
        <div className="sticky top-0 bg-surface pt-3 pb-2 z-10 flex justify-center">
          <div className="w-12 h-1.5 bg-line rounded-full" />
        </div>

        <div className="px-5 pb-5 flex items-center justify-between">
          <div>
            <div className="text-xs text-ink-muted uppercase tracking-widest">Inbox</div>
            <h2 className="text-2xl font-extrabold text-ink">Notificações</h2>
          </div>
          <button onClick={onClose} className="w-9 h-9 rounded-full bg-canvas flex items-center justify-center text-ink-muted">
            <Icon name="x" className="w-5 h-5" />
          </button>
        </div>

        <div className="px-5 pb-8 space-y-3">
          {visible.length === 0 ? (
            <Card className="p-8 text-center">
              <div className="text-5xl mb-3">🎉</div>
              <div className="font-bold text-ink">Tudo em dia!</div>
              <div className="text-sm text-ink-muted mt-1">Nada pendente por agora.</div>
            </Card>
          ) : (
            visible.map(n => (
              <Card key={n.id} className="p-4 flex gap-3 items-start">
                <div className={`w-11 h-11 rounded-2xl flex items-center justify-center text-2xl shrink-0 ${accentClass(n.accent)}`}>
                  {n.emoji}
                </div>
                <div className="flex-1 min-w-0">
                  <div className="flex items-start justify-between gap-2">
                    <div className="font-semibold text-ink leading-tight">{n.title}</div>
                    <button onClick={() => onDismiss(n.id)} className="text-ink-faint hover:text-ink-muted shrink-0 -mt-0.5">
                      <Icon name="x" className="w-4 h-4" stroke={2} />
                    </button>
                  </div>
                  <div className="text-sm text-ink-muted mt-1 leading-snug">{n.body}</div>
                  {n.cta && (
                    <button
                      onClick={() => { onAction(n.cta.action); onClose(); }}
                      className="mt-2 text-sm font-semibold text-brand hover:text-brand-dark"
                    >
                      {n.cta.label} →
                    </button>
                  )}
                </div>
              </Card>
            ))
          )}
        </div>
      </div>
    </div>
  );
};

/* =========================================================
   TELA: LOGIN (após o quiz, antes de entrar no app)
   ========================================================= */

const LoginScreen = ({ pendingUser, onComplete }) => {
  const [email, setEmail] = useState(pendingUser?.email || '');
  const [touched, setTouched] = useState(false);

  const isValid = /^[^\s@]+@[^\s@]+\.[^\s@]+$/.test(email.trim());

  const loginEmail = () => {
    setTouched(true);
    if (!isValid) return;
    onComplete({ ...pendingUser, email: email.trim(), loggedIn: true });
  };

  return (
    <div className="min-h-[100dvh] flex flex-col bg-canvas px-6 py-10 anim-fade-up">
      <div className="flex-1 flex flex-col items-center justify-center text-center max-w-sm mx-auto w-full">
        <Logo variant="icon" size={180} className="mb-4" />
        <h1 className="text-[28px] font-extrabold text-ink leading-tight mb-2">
          Bem-vindo, {pendingUser?.name?.split(' ')[0] || 'você'}!
        </h1>
        <p className="text-ink-muted text-[15px] mb-8 max-w-[280px]">
          Crie sua conta para guardar seu plano, progresso e fotos em todos os dispositivos.
        </p>

        <div className="w-full space-y-3">
          <TextField
            label="Seu e-mail"
            value={email}
            onChange={(v) => { setEmail(v); setTouched(false); }}
            placeholder="voce@exemplo.com"
          />
          {touched && !isValid && (
            <div className="text-xs text-danger text-left -mt-1">
              Digite um e-mail válido (ex: voce@exemplo.com)
            </div>
          )}
          <Button onClick={loginEmail} size="lg" className="w-full" icon="arrowR">
            Continuar
          </Button>
        </div>
      </div>

      <p className="text-[11px] text-ink-faint text-center max-w-[280px] mx-auto leading-relaxed">
        Ao continuar você aceita nossos <span className="text-brand-dark underline">Termos</span> e <span className="text-brand-dark underline">Política de Privacidade</span>.
      </p>
    </div>
  );
};

/* =========================================================
   TELA: DASHBOARD (Hoje)
   ========================================================= */

const TodayScreen = ({ user, today, setToday, onNavigate, history, dismissedNotifs, setDismissedNotifs }) => {
  const macros = useMemo(() => FP.calcMacros(user), [user]);
  const meals = useMemo(() => FP.planForGoal(user.goal, user.diet, user.dislikes), [user]);
  const notifications = useMemo(() => FP.getNotifications(user, today, history), [user, today, history]);
  const visibleNotifs = notifications.filter(n => !dismissedNotifs.includes(n.id));
  const [openNotifs, setOpenNotifs] = useState(false);

  const handleNotifAction = (action) => {
    switch (action) {
      case 'add-water': setToday({ ...today, water: (today.water || 0) + 1 }); break;
      case 'go-workout':  onNavigate('workout');  break;
      case 'go-meal':     onNavigate('meal');     break;
      case 'go-habits':   onNavigate('habits');   break;
      case 'go-progress': onNavigate('progress'); break;
    }
  };

  // Soma calorias e macros já consumidos
  const consumed = useMemo(() => {
    let kcal = 0, p = 0, c = 0, f = 0;
    meals.forEach(m => {
      if (today.meals[m.slot]) {
        kcal += m.recipe.kcal; p += m.recipe.p; c += m.recipe.c; f += m.recipe.f;
      }
    });
    return { kcal, p, c, f };
  }, [meals, today.meals]);

  const waterTarget = useMemo(() => Math.max(6, Math.round(FP.recommendedWater(user) * 4)), [user]); // copos (250ml)
  const habitsDone = Object.keys(today.habits || {}).filter(k => today.habits[k]).length;

  const workoutPlan = useMemo(() => FP.workoutPlanForGoal(user.goal, user.days), [user]);
  const todayDayIdx = (new Date().getDay() + 6) % 7; // segunda = 0
  const todaysWorkout = workoutPlan.weekly[todayDayIdx];

  const setWater = (n) => setToday({ ...today, water: Math.max(0, Math.min(waterTarget, n)) });

  return (
    <div className="px-5 pt-6 pb-32 anim-fade-up">
      {/* Saudação */}
      <header className="mb-6 flex items-start justify-between">
        <div>
          <div className="text-xs text-ink-muted uppercase tracking-widest">{greetingTime()}</div>
          <h1 className="text-3xl font-extrabold text-ink leading-tight">{user.name?.split(' ')[0] || 'Olá'}!</h1>
          <p className="text-ink-muted text-sm mt-1">{prettyDate()}</p>
        </div>
        <div className="flex items-center gap-2">
          <button
            onClick={() => setOpenNotifs(true)}
            className="relative w-12 h-12 rounded-full bg-surface border border-line flex items-center justify-center text-ink-soft hover:border-brand active:scale-95 transition"
            aria-label="Notificações"
          >
            <Icon name="bell" className="w-5 h-5" />
            {visibleNotifs.length > 0 && (
              <span className="absolute -top-1 -right-1 min-w-[20px] h-5 px-1 rounded-full bg-accent text-brand-dark text-[10px] font-extrabold flex items-center justify-center border-2 border-canvas">
                {visibleNotifs.length}
              </span>
            )}
          </button>
          <button onClick={() => onNavigate('profile')} className="active:scale-95 transition">
            <Avatar user={user} size={48} />
          </button>
        </div>
      </header>

      {openNotifs && (
        <NotificationsSheet
          notifications={notifications}
          dismissedIds={dismissedNotifs}
          onAction={handleNotifAction}
          onDismiss={(id) => setDismissedNotifs([...dismissedNotifs, id])}
          onClose={() => setOpenNotifs(false)}
        />
      )}

      {/* Card principal de calorias */}
      <Card className="p-6 mb-5 bg-gradient-to-br from-brand to-brand-dark text-white relative overflow-hidden">
        <div className="absolute -top-16 -right-16 w-48 h-48 bg-accent/20 rounded-full blur-2xl" />
        <div className="relative flex items-center gap-5">
          <Ring
            value={consumed.kcal} max={macros.calories}
            size={120} stroke={11}
            label={`${consumed.kcal}`} sublabel="kcal"
            color="#D5F379"
            trackColor="rgba(255,255,255,0.18)"
            labelClass="text-gelo"
            sublabelClass="text-abacate"
          />
          <div className="flex-1">
            <div className="text-white/70 text-xs uppercase tracking-widest">Meta do dia</div>
            <div className="text-2xl font-extrabold">{macros.calories} kcal</div>
            <div className="text-white/70 text-sm mt-1">
              Faltam <b className="text-accent">{Math.max(0, macros.calories - consumed.kcal)} kcal</b>
            </div>
          </div>
        </div>
        <div className="grid grid-cols-3 gap-3 mt-5 pt-5 border-t border-white/10">
          <MacroBar label="Proteína" value={consumed.p} max={macros.protein} color="bg-accent" />
          <MacroBar label="Carbs"    value={consumed.c} max={macros.carbs}   color="bg-gold" />
          <MacroBar label="Gordura"  value={consumed.f} max={macros.fat}     color="bg-info" />
        </div>
      </Card>

      {/* Linha de mini-cards: água + hábitos */}
      <div className="grid grid-cols-2 gap-3 mb-5">
        <Card className="p-4">
          <div className="flex items-center justify-between mb-2">
            <Icon name="drop" className="w-5 h-5 text-info" />
            <div className="text-xs text-ink-muted">{today.water}/{waterTarget}</div>
          </div>
          <div className="text-sm font-semibold text-ink">Água</div>
          <div className="text-xs text-ink-muted mb-2">{(today.water * 0.25).toFixed(2)}L hoje</div>
          <ProgressBar value={today.water} max={waterTarget} color="bg-info" />
          <div className="flex gap-2 mt-3">
            <button onClick={() => setWater(today.water - 1)} className="flex-1 py-1.5 rounded-xl bg-line text-ink-muted text-sm">–</button>
            <button onClick={() => setWater(today.water + 1)} className="flex-1 py-1.5 rounded-xl bg-info/15 text-info text-sm font-semibold">+ copo</button>
          </div>
        </Card>

        <Card className="p-4">
          <div className="flex items-center justify-between mb-2">
            <Icon name="check" className="w-5 h-5 text-brand" />
            <div className="text-xs text-ink-muted">{habitsDone}/{FP.HABITS.length}</div>
          </div>
          <div className="text-sm font-semibold text-ink">Hábitos</div>
          <div className="text-xs text-ink-muted mb-2">do seu dia</div>
          <ProgressBar value={habitsDone} max={FP.HABITS.length} color="bg-brand" />
          <button
            onClick={() => onNavigate('habits')}
            className="mt-3 w-full py-1.5 rounded-xl bg-brand-tint text-brand text-sm font-semibold"
          >
            Ver hábitos
          </button>
        </Card>
      </div>

      {/* IMC */}
      <Section title="Sua saúde">
        <IMCCard weight={user.weight} height={user.height} compact />
      </Section>

      {/* Treino do dia */}
      <Section
        title="Treino de hoje"
        action={<button onClick={() => onNavigate('workout')} className="text-sm text-brand font-semibold">Ver tudo</button>}
      >
        {todaysWorkout?.rest ? (
          <Card className="p-5 flex items-center gap-4">
            <div className="w-14 h-14 rounded-2xl bg-brand-tint flex items-center justify-center text-2xl">😴</div>
            <div>
              <div className="font-bold text-ink">Dia de descanso</div>
              <div className="text-xs text-ink-muted">Recuperação ativa: caminhada leve.</div>
            </div>
          </Card>
        ) : (
          <Card className="p-5">
            <div className="flex items-start gap-4">
              <div className="w-14 h-14 rounded-2xl bg-accent text-brand-dark flex items-center justify-center">
                <Icon name="dumbbell" className="w-7 h-7" />
              </div>
              <div className="flex-1">
                <div className="text-xs text-ink-muted">{todaysWorkout?.workout?.group}</div>
                <div className="font-bold text-ink leading-tight">{todaysWorkout?.workout?.name}</div>
                <div className="flex gap-3 mt-1.5 text-xs text-ink-muted">
                  <span className="inline-flex items-center gap-1"><Icon name="clock" className="w-3.5 h-3.5" /> {todaysWorkout?.workout?.duration} min</span>
                  <span className="inline-flex items-center gap-1"><Icon name="flame" className="w-3.5 h-3.5" /> ~{todaysWorkout?.workout?.kcal} kcal</span>
                  <span>•</span>
                  <span>{todaysWorkout?.workout?.exercises.length} exercícios</span>
                </div>
              </div>
            </div>
            <Button onClick={() => onNavigate('workout')} className="w-full mt-4" icon="play">
              {today.workoutDone ? 'Treino concluído' : 'Iniciar treino'}
            </Button>
          </Card>
        )}
      </Section>

      {/* Plano alimentar resumo */}
      <Section
        title="Plano alimentar"
        action={<button onClick={() => onNavigate('meal')} className="text-sm text-brand font-semibold">Ver tudo</button>}
      >
        <div className="space-y-3">
          {meals.slice(0, 3).map(m => (
            <MealRow
              key={m.slot}
              meal={m}
              done={!!today.meals[m.slot]}
              onToggle={() => setToday({ ...today, meals: { ...today.meals, [m.slot]: !today.meals[m.slot] } })}
            />
          ))}
        </div>
      </Section>
    </div>
  );
};

const MacroBar = ({ label, value, max, color }) => (
  <div className="min-w-0">
    <div className="flex items-baseline gap-1 mb-1.5">
      <span className="text-[10px] text-white/80 uppercase tracking-wider truncate">{label}</span>
    </div>
    <div className="text-xs text-white/90 font-semibold mb-1.5">
      {value}<span className="text-white/60 font-normal">/{max}g</span>
    </div>
    <ProgressBar value={value} max={max} color={color} track="bg-white/10" height="h-1.5" />
  </div>
);

const MealRow = ({ meal, done, onToggle }) => (
  <Card className="p-3 flex items-center gap-3">
    <RecipeImage recipe={meal.recipe} className="w-14 h-14 rounded-2xl shrink-0" emojiSize="text-2xl" />
    <div className="flex-1 min-w-0">
      <div className="text-xs text-ink-muted">{meal.label} • {meal.time}</div>
      <div className="font-semibold text-ink truncate">{meal.recipe.name}</div>
      <div className="text-xs text-ink-muted">{meal.recipe.kcal} kcal • {meal.recipe.p}g prot</div>
    </div>
    <button
      onClick={(e) => { e.stopPropagation(); onToggle(); }}
      className={`w-9 h-9 rounded-full border-2 flex items-center justify-center transition shrink-0
        ${done ? 'bg-accent border-accent text-brand-dark' : 'border-line text-ink-faint'}`}
    >
      <Icon name="check" className="w-4 h-4" stroke={2.5} />
    </button>
  </Card>
);

/* =========================================================
   TELA: PLANO ALIMENTAR
   ========================================================= */

const MealPlanScreen = ({ user, today, setToday }) => {
  const meals = useMemo(() => FP.planForGoal(user.goal, user.diet, user.dislikes), [user]);
  const [openMeal, setOpenMeal] = useState(null);
  const macros = useMemo(() => FP.calcMacros(user), [user]);

  const goal = FP.GOALS.find(g => g.id === user.goal);

  const replaceMeal = (slot) => {
    const candidates = FP.RECIPES.filter(r => {
      const matchesDiet = user.diet === 'normal' || (r.diet || []).includes(user.diet);
      const tagFit = slot === 'cafe' ? r.tags.includes('cafe')
                    : slot === 'almoco' ? r.tags.includes('almoco')
                    : slot === 'jantar' ? r.tags.includes('jantar')
                    : true;
      return matchesDiet && tagFit;
    });
    const target = openMeal;
    if (!target) return;
    const next = candidates[Math.floor(Math.random() * candidates.length)];
    if (!next) return;
    setOpenMeal({ ...target, recipe: next });
  };

  return (
    <div className="px-5 pt-3 pb-32 anim-fade-up">
      {/* Banner do objetivo */}
      <Card className="p-4 mb-5 flex items-center gap-3 bg-gradient-to-br from-brand-tint to-accent-soft border border-brand/10">
        <div className="text-3xl">{goal?.emoji}</div>
        <div className="flex-1">
          <div className="text-xs text-brand font-semibold uppercase tracking-wider">Foco</div>
          <div className="font-bold text-ink leading-tight">{goal?.label}</div>
          <div className="text-xs text-ink-muted">{macros.calories} kcal • {macros.protein}p / {macros.carbs}c / {macros.fat}g</div>
        </div>
      </Card>

      <div className="space-y-3">
        {meals.map(m => (
          <MealCardFull
            key={m.slot}
            meal={m}
            done={!!today.meals[m.slot]}
            onToggle={() => setToday({ ...today, meals: { ...today.meals, [m.slot]: !today.meals[m.slot] } })}
            onOpen={() => setOpenMeal(m)}
          />
        ))}
      </div>

      {openMeal && (
        <RecipeSheet
          meal={openMeal}
          recipe={openMeal.recipe}
          done={!!today.meals[openMeal.slot]}
          onClose={() => setOpenMeal(null)}
          onToggle={() => {
            setToday({ ...today, meals: { ...today.meals, [openMeal.slot]: !today.meals[openMeal.slot] } });
          }}
          onReplace={() => replaceMeal(openMeal.slot)}
        />
      )}
    </div>
  );
};

const MealCardFull = ({ meal, done, onToggle, onOpen }) => (
  <Card className="overflow-hidden">
    <div className="flex" onClick={onOpen}>
      <RecipeImage recipe={meal.recipe} className="w-24 shrink-0" emojiSize="text-4xl" />
      <div className="flex-1 p-4">
        <div className="flex items-center justify-between">
          <div className="text-xs text-ink-muted">{meal.label} • {meal.time}</div>
          <button
            onClick={(e) => { e.stopPropagation(); onToggle(); }}
            className={`w-8 h-8 rounded-full border-2 flex items-center justify-center transition
              ${done ? 'bg-accent border-accent text-brand-dark' : 'border-line text-ink-faint'}`}
          >
            <Icon name="check" className="w-4 h-4" stroke={2.5} />
          </button>
        </div>
        <div className="font-bold text-ink mt-1 leading-tight">{meal.recipe.name}</div>
        <div className="flex gap-3 mt-2 text-xs text-ink-muted">
          <span className="inline-flex items-center gap-1"><Icon name="flame" className="w-3.5 h-3.5" /> {meal.recipe.kcal}</span>
          <span>{meal.recipe.p}p</span>
          <span>{meal.recipe.c}c</span>
          <span>{meal.recipe.f}g</span>
        </div>
      </div>
    </div>
  </Card>
);

const RecipeSheet = ({ meal, recipe, done, onClose, onToggle, onReplace }) => {
  useEffect(() => {
    document.body.style.overflow = 'hidden';
    return () => { document.body.style.overflow = ''; };
  }, []);

  return (
    <div className="fixed inset-0 z-50 flex items-end justify-center bg-ink/40 backdrop-blur-sm" onClick={onClose}>
      <div
        onClick={(e) => e.stopPropagation()}
        className="w-full max-w-[460px] bg-surface rounded-t-3xl max-h-[92dvh] overflow-y-auto anim-pop relative"
      >
        <div className="sticky top-0 bg-surface pt-3 pb-2 z-10 flex justify-center">
          <div className="w-12 h-1.5 bg-line rounded-full" />
        </div>

        <RecipeImage recipe={recipe} className="mx-5 rounded-3xl h-56" emojiSize="text-7xl" />

        <div className="px-5 pt-5 pb-6">
          <div className="text-xs text-ink-muted uppercase tracking-widest">{meal?.label || 'Receita'}</div>
          <h2 className="text-2xl font-extrabold text-ink mt-1">{recipe.name}</h2>

          <div className="grid grid-cols-4 gap-2 mt-5 mb-6">
            <div className="bg-brand-tint rounded-2xl p-3 text-center">
              <div className="text-lg font-bold text-brand">{recipe.kcal}</div>
              <div className="text-[10px] text-brand uppercase">kcal</div>
            </div>
            <div className="bg-accent-soft rounded-2xl p-3 text-center">
              <div className="text-lg font-bold text-brand-dark">{recipe.p}g</div>
              <div className="text-[10px] text-brand-dark uppercase">prot</div>
            </div>
            <div className="bg-gold-soft rounded-2xl p-3 text-center">
              <div className="text-lg font-bold text-gold">{recipe.c}g</div>
              <div className="text-[10px] text-gold uppercase">carbs</div>
            </div>
            <div className="bg-info/10 rounded-2xl p-3 text-center">
              <div className="text-lg font-bold text-info">{recipe.f}g</div>
              <div className="text-[10px] text-info uppercase">gord</div>
            </div>
          </div>

          <div className="flex gap-2 text-xs text-ink-muted mb-6">
            <span className="inline-flex items-center gap-1.5 px-2.5 py-1 bg-line/50 rounded-full">
              <Icon name="clock" className="w-3.5 h-3.5" /> {recipe.time} min
            </span>
            {recipe.benefits?.slice(0,2).map((b, i) => (
              <span key={i} className="inline-flex items-center px-2.5 py-1 bg-brand-tint text-brand rounded-full">
                {b}
              </span>
            ))}
          </div>

          <Section title="Ingredientes">
            <Card className="p-4">
              <ul className="space-y-2">
                {recipe.ingredients.map((ing, i) => (
                  <li key={i} className="flex items-start gap-2.5 text-sm text-ink">
                    <span className="w-1.5 h-1.5 rounded-full bg-accent mt-2 shrink-0" />
                    {ing}
                  </li>
                ))}
              </ul>
            </Card>
          </Section>

          <Section title="Modo de preparo">
            <div className="space-y-2">
              {recipe.steps.map((step, i) => (
                <Card key={i} className="p-4 flex gap-3">
                  <div className="w-7 h-7 rounded-full bg-brand text-white text-sm font-bold flex items-center justify-center shrink-0">
                    {i+1}
                  </div>
                  <div className="text-sm text-ink leading-relaxed pt-0.5">{step}</div>
                </Card>
              ))}
            </div>
          </Section>

          {recipe.benefits?.length > 0 && (
            <Section title="Benefícios">
              <div className="flex flex-wrap gap-2">
                {recipe.benefits.map((b, i) => (
                  <span key={i} className="px-3 py-1.5 rounded-full text-xs bg-brand-tint text-brand font-semibold">
                    {b}
                  </span>
                ))}
              </div>
            </Section>
          )}
        </div>

        {/* Bottom action bar — sticky inside scroll container so it stays visible */}
        <div className="sticky bottom-0 inset-x-0 p-4 bg-surface/95 backdrop-blur border-t border-line flex gap-2">
          <Button variant="outline" onClick={onReplace} icon="swap" className="flex-1">Trocar</Button>
          <Button onClick={onToggle} icon="check" className="flex-[1.4]">
            {done ? 'Desmarcar' : 'Marcar consumido'}
          </Button>
        </div>
      </div>
    </div>
  );
};

/* =========================================================
   TELA: BIBLIOTECA DE RECEITAS
   ========================================================= */

const RecipeLibraryScreen = () => {
  const cats = [
    { id: 'all', label: 'Todas', tag: null },
    { id: 'cafe', label: 'Café da manhã', tag: 'cafe' },
    { id: 'almoco', label: 'Almoço', tag: 'almoco' },
    { id: 'jantar', label: 'Jantar', tag: 'jantar' },
    { id: 'lanche', label: 'Lanches', tag: 'lanche' },
    { id: 'pre', label: 'Pré-treino', tag: 'pre-treino' },
    { id: 'pos', label: 'Pós-treino', tag: 'pos-treino' },
    { id: 'lc', label: 'Low carb', tag: 'lowcarb' },
    { id: 'ap', label: 'Alta proteína', tag: 'alta-proteina' },
    { id: 'cong', label: 'Para congelar', tag: 'congelar' },
  ];
  const [active, setActive] = useState('all');
  const [search, setSearch] = useState('');
  const [open, setOpen] = useState(null);

  const list = useMemo(() => {
    const cat = cats.find(c => c.id === active);
    return FP.RECIPES.filter(r => {
      const tagOk = !cat?.tag || r.tags.includes(cat.tag);
      const s = search.trim().toLowerCase();
      const sOk = !s || r.name.toLowerCase().includes(s);
      return tagOk && sOk;
    });
  }, [active, search]);

  return (
    <>
      <div className="px-5 pt-2 pb-3">
        <div className="bg-surface rounded-2xl border border-line px-4 py-3 flex items-center gap-2">
          <span className="text-ink-faint">🔎</span>
          <input
            value={search}
            onChange={e => setSearch(e.target.value)}
            placeholder="Buscar receita..."
            className="flex-1 bg-transparent outline-none text-sm text-ink"
          />
        </div>
      </div>

      <div className="px-2 pb-3 overflow-x-auto no-scrollbar">
        <div className="flex gap-2 px-3">
          {cats.map(c => (
            <Pill key={c.id} active={active === c.id} onClick={() => setActive(c.id)}>{c.label}</Pill>
          ))}
        </div>
      </div>

      <div className="px-5 pb-32">
        {list.length === 0 ? (
          <Card className="p-8 text-center text-ink-muted">Nenhuma receita encontrada.</Card>
        ) : (
          <div className="grid grid-cols-2 gap-3">
            {list.map(r => (
              <RecipeCard key={r.id} recipe={r} onClick={() => setOpen(r)} />
            ))}
          </div>
        )}
      </div>

      {open && (
        <RecipeSheet
          recipe={open}
          done={false}
          onClose={() => setOpen(null)}
          onToggle={() => setOpen(null)}
          onReplace={() => {
            const others = FP.RECIPES.filter(r => r.id !== open.id);
            setOpen(others[Math.floor(Math.random() * others.length)]);
          }}
        />
      )}
    </>
  );
};

const RecipeCard = ({ recipe, onClick }) => (
  <Card onClick={onClick} className="overflow-hidden">
    <RecipeImage recipe={recipe} className="h-28" emojiSize="text-4xl" />
    <div className="p-3">
      <div className="font-bold text-ink text-sm leading-tight line-clamp-2 min-h-[2.5em]">{recipe.name}</div>
      <div className="flex items-center justify-between mt-2 text-[11px] text-ink-muted">
        <span className="inline-flex items-center gap-1"><Icon name="clock" className="w-3 h-3" />{recipe.time}m</span>
        <span className="inline-flex items-center gap-1"><Icon name="flame" className="w-3 h-3" />{recipe.kcal}kcal</span>
      </div>
    </div>
  </Card>
);

/* =========================================================
   TELA: TREINO
   ========================================================= */

/* ExerciseRow — linha de exercício clicável que expande pra mostrar
   ilustração 3D grande + passo-a-passo de execução. */
const ExerciseRow = ({ index, exercise }) => {
  const [open, setOpen] = useState(false);
  const info = FP.exerciseInfo(exercise.name);

  return (
    <div className={`rounded-2xl bg-canvas overflow-hidden transition ${open ? 'ring-1 ring-brand/30' : ''}`}>
      <button
        onClick={() => setOpen(o => !o)}
        className="w-full flex items-start gap-3 p-3 text-left active:bg-line/40 transition"
      >
        <div className="w-8 h-8 rounded-full bg-brand text-white text-sm font-bold flex items-center justify-center shrink-0">
          {index + 1}
        </div>
        <ExerciseIcon name={exercise.name} size={48} />
        <div className="flex-1 min-w-0">
          <div className="flex items-center gap-1.5">
            <div className="font-semibold text-ink text-sm flex-1">{exercise.name}</div>
            <Icon name={open ? 'chevL' : 'chevR'} className={`w-4 h-4 text-ink-faint transition-transform ${open ? '-rotate-90' : 'rotate-90'}`} />
          </div>
          <div className="text-xs text-ink-muted mt-0.5">{exercise.note}</div>
          <div className="flex gap-2 mt-1.5 text-[11px] flex-wrap">
            <span className="px-2 py-0.5 rounded-full bg-brand-tint text-brand font-semibold">{exercise.sets} séries</span>
            <span className="px-2 py-0.5 rounded-full bg-accent-soft text-brand-dark font-semibold">{exercise.reps} reps</span>
            <span className="px-2 py-0.5 rounded-full bg-line text-ink-muted">desc {exercise.rest}</span>
          </div>
        </div>
      </button>

      {open && (
        <div className="px-3 pb-4 pt-1 anim-fade-up">
          {/* Hero da ilustração */}
          <div className="rounded-2xl bg-gradient-to-br from-brand-tint to-accent-soft p-4 mb-3 flex items-center justify-center">
            <ExerciseIcon name={exercise.name} size={140} />
          </div>

          <div className="text-[10px] uppercase tracking-widest text-brand font-bold mb-2">{info.label} • Como executar</div>
          <ol className="space-y-2">
            {info.steps.map((step, i) => (
              <li key={i} className="flex gap-2.5 text-sm text-ink leading-snug">
                <span className="w-5 h-5 rounded-full bg-brand text-white text-[11px] font-bold flex items-center justify-center shrink-0 mt-0.5">{i+1}</span>
                <span>{step}</span>
              </li>
            ))}
          </ol>

          {/* Resumo de carga */}
          <div className="mt-3 grid grid-cols-3 gap-2 pt-3 border-t border-line">
            <div className="text-center">
              <div className="text-[10px] text-ink-faint uppercase tracking-wider">Séries</div>
              <div className="font-bold text-ink">{exercise.sets}</div>
            </div>
            <div className="text-center">
              <div className="text-[10px] text-ink-faint uppercase tracking-wider">Reps</div>
              <div className="font-bold text-ink">{exercise.reps}</div>
            </div>
            <div className="text-center">
              <div className="text-[10px] text-ink-faint uppercase tracking-wider">Descanso</div>
              <div className="font-bold text-ink">{exercise.rest}</div>
            </div>
          </div>
        </div>
      )}
    </div>
  );
};


const WorkoutScreen = ({ user, today, setToday }) => {
  const plan = useMemo(() => FP.workoutPlanForGoal(user.goal, user.days), [user]);
  const todayIdx = (new Date().getDay() + 6) % 7;
  const [selected, setSelected] = useState(todayIdx);

  // Sempre que o dia mudar (rollover automático), realinha a seleção pra hoje
  useEffect(() => { setSelected(todayIdx); }, [todayIdx]);

  const day = plan.weekly[selected];
  const goal = FP.GOALS.find(g => g.id === user.goal);

  return (
    <div className="px-5 pt-6 pb-32 anim-fade-up">
      <header className="mb-5">
        <div className="text-xs text-ink-muted uppercase tracking-widest">Seu plano semanal</div>
        <h1 className="text-2xl font-extrabold text-ink">Treino</h1>
        <p className="text-xs text-ink-muted mt-1">Toque em qualquer dia para ver o treino daquele dia.</p>
      </header>

      <Card className="p-4 mb-5 flex items-center gap-3 bg-gradient-to-br from-brand to-brand-dark text-white">
        <div className="w-12 h-12 rounded-2xl bg-white/15 flex items-center justify-center text-2xl">{goal?.emoji}</div>
        <div className="flex-1">
          <div className="text-white/70 text-xs uppercase tracking-wider">Foco</div>
          <div className="font-bold leading-tight">{goal?.label}</div>
          <div className="text-white/70 text-xs">{user.days}x por semana</div>
        </div>
      </Card>

      {/* Semana — botões maiores e com feedback de toque pra mobile */}
      <div className="grid grid-cols-7 gap-1.5 mb-5">
        {plan.weekly.map((d, i) => (
          <button
            key={i}
            type="button"
            onClick={() => setSelected(i)}
            className={`flex flex-col items-center justify-between gap-1 py-3 rounded-2xl border-2 transition active:scale-95 select-none
              ${selected === i
                ? 'border-brand bg-brand text-white shadow-pop'
                : 'border-transparent bg-surface text-ink-soft hover:border-brand/30'}`}
            style={{ touchAction: 'manipulation', minHeight: 64 }}
          >
            <span className={`text-[10px] uppercase tracking-wider font-bold ${selected === i ? 'text-white/85' : 'text-ink-faint'}`}>{d.day}</span>
            <span className="text-xl leading-none">{d.rest ? '😴' : '🏋️'}</span>
            {i === todayIdx && <span className={`w-1.5 h-1.5 rounded-full ${selected === i ? 'bg-accent' : 'bg-brand'}`} />}
          </button>
        ))}
      </div>

      {/* Detalhe do dia */}
      {day.rest ? (
        <Card className="p-8 text-center">
          <div className="text-5xl mb-3">😴</div>
          <div className="font-bold text-ink text-lg">Dia de descanso</div>
          <div className="text-sm text-ink-muted mt-1 max-w-xs mx-auto">
            Aproveite para alongar, caminhar ou descansar bem. A recuperação faz parte do treino.
          </div>
        </Card>
      ) : (
        <Card className="overflow-hidden">
          <div className="p-5 bg-brand-tint">
            <div className="text-xs text-brand uppercase tracking-widest font-semibold">{day.workout.group}</div>
            <div className="text-xl font-extrabold text-ink mt-1">{day.workout.name}</div>
            <div className="flex gap-3 mt-2 text-xs text-ink-muted">
              <span className="inline-flex items-center gap-1"><Icon name="clock" className="w-3.5 h-3.5" />{day.workout.duration} min</span>
              <span className="inline-flex items-center gap-1"><Icon name="flame" className="w-3.5 h-3.5" />~{day.workout.kcal} kcal</span>
              <span>{day.workout.exercises.length} exercícios</span>
            </div>
          </div>
          <div className="p-4 space-y-2">
            {day.workout.exercises.map((e, i) => (
              <ExerciseRow key={i} index={i} exercise={e} />
            ))}
          </div>
          {selected === todayIdx && (
            <div className="p-4 border-t border-line">
              <Button
                onClick={() => setToday({ ...today, workoutDone: !today.workoutDone })}
                icon={today.workoutDone ? 'check' : 'play'}
                className="w-full"
                variant={today.workoutDone ? 'accent' : 'primary'}
              >
                {today.workoutDone ? 'Concluído ✓' : 'Marcar treino como concluído'}
              </Button>
            </div>
          )}
        </Card>
      )}

      {/* Outros treinos da biblioteca */}
      <Section title="Outros treinos do seu plano" className="mt-6">
        <div className="space-y-3">
          {plan.library.map((w, i) => (
            <Card key={i} className="p-4 flex items-center gap-3">
              <div className="w-12 h-12 rounded-2xl bg-accent-soft flex items-center justify-center">
                <Icon name="dumbbell" className="w-6 h-6 text-brand" />
              </div>
              <div className="flex-1">
                <div className="font-semibold text-ink text-sm">{w.name}</div>
                <div className="text-xs text-ink-muted">{w.group} • {w.duration} min • {w.exercises.length} exercícios</div>
              </div>
              <Icon name="chevR" className="w-5 h-5 text-ink-faint" />
            </Card>
          ))}
        </div>
      </Section>
    </div>
  );
};

/* =========================================================
   TELA: HÁBITOS
   ========================================================= */

const HabitsScreen = ({ today, setToday, user }) => {
  const waterTarget = useMemo(() => Math.max(6, Math.round(FP.recommendedWater(user) * 4)), [user]);

  const toggleHabit = (id) => {
    setToday({
      ...today,
      habits: { ...today.habits, [id]: !today.habits[id] },
    });
  };

  const total = FP.HABITS.length;
  const done = FP.HABITS.filter(h => h.id === 'agua' ? (today.water || 0) >= waterTarget : !!today.habits[h.id]).length;
  const weekProgress = Math.round((done / total) * 100);

  return (
    <div className="px-5 pt-6 pb-32 anim-fade-up">
      <header className="mb-5">
        <div className="text-xs text-ink-muted uppercase tracking-widest">Sua rotina</div>
        <h1 className="text-2xl font-extrabold text-ink">Hábitos</h1>
      </header>

      <Card className="p-6 mb-5 bg-gradient-to-br from-brand to-brand-dark text-white">
        <div className="flex items-center gap-5">
          <Ring value={done} max={total} size={100} stroke={9} color="#D5F379"
            label={`${done}/${total}`} sublabel="hoje"
            trackColor="rgba(255,255,255,0.18)"
            labelClass="text-gelo"
            sublabelClass="text-abacate" />
          <div className="flex-1">
            <div className="text-white/70 text-xs uppercase tracking-widest">Progresso do dia</div>
            <div className="text-3xl font-extrabold mt-1">{weekProgress}%</div>
            <div className="text-white/70 text-xs mt-1">Continue assim 💪</div>
          </div>
        </div>
      </Card>

      <Section title="Hoje">
        <div className="space-y-2.5">
          {FP.HABITS.map(h => {
            const isWater = h.id === 'agua';
            const checked = isWater ? (today.water || 0) >= waterTarget : !!today.habits[h.id];
            return (
              <Card key={h.id} className="p-4 flex items-center gap-3">
                <div className="w-12 h-12 rounded-2xl bg-brand-tint flex items-center justify-center text-2xl">
                  {h.emoji}
                </div>
                <div className="flex-1">
                  <div className="font-semibold text-ink">{h.label}</div>
                  {isWater ? (
                    <div className="text-xs text-ink-muted mt-0.5">{today.water || 0}/{waterTarget} copos</div>
                  ) : (
                    <div className="text-xs text-ink-muted mt-0.5">{checked ? 'Concluído!' : 'Toque para marcar'}</div>
                  )}
                </div>
                {isWater ? (
                  <div className="flex items-center gap-1.5">
                    <button
                      onClick={() => setToday({ ...today, water: Math.max(0, (today.water || 0) - 1) })}
                      className="w-8 h-8 rounded-full bg-line text-ink-soft flex items-center justify-center"
                    >–</button>
                    <button
                      onClick={() => setToday({ ...today, water: Math.min(waterTarget, (today.water || 0) + 1) })}
                      className="w-8 h-8 rounded-full bg-info text-white flex items-center justify-center"
                    >+</button>
                  </div>
                ) : (
                  <button
                    onClick={() => toggleHabit(h.id)}
                    className={`w-9 h-9 rounded-full border-2 flex items-center justify-center transition
                      ${checked ? 'bg-accent border-accent text-brand-dark' : 'border-line text-ink-faint'}`}
                  >
                    <Icon name="check" className="w-5 h-5" stroke={2.5} />
                  </button>
                )}
              </Card>
            );
          })}
        </div>
      </Section>

      <Section title="Esta semana" className="mt-6">
        <Card className="p-5">
          <div className="grid grid-cols-7 gap-2 mb-3">
            {['S','T','Q','Q','S','S','D'].map((d, i) => {
              const todayIdx = (new Date().getDay() + 6) % 7;
              const filled = i <= todayIdx;
              const pct = i === todayIdx ? weekProgress : (filled ? 60 + Math.round(Math.random()*30) : 0);
              return (
                <div key={i} className="flex flex-col items-center gap-1.5">
                  <div className="text-[10px] text-ink-muted font-bold">{d}</div>
                  <div className="w-full h-16 bg-line/60 rounded-xl overflow-hidden flex flex-col-reverse">
                    <div className="bg-accent w-full transition-all" style={{ height: `${pct}%` }} />
                  </div>
                  <div className="text-[10px] text-ink-faint">{pct}%</div>
                </div>
              );
            })}
          </div>
          <div className="text-xs text-ink-muted text-center">Média da semana: <b className="text-brand">72%</b></div>
        </Card>
      </Section>
    </div>
  );
};

/* =========================================================
   TELA: PROGRESSO
   ========================================================= */

const ProgressScreen = ({ user, today, history }) => {
  const meals = useMemo(() => FP.planForGoal(user.goal, user.diet, user.dislikes), [user]);

  // Histórico real do localStorage. Se ainda só tem 1 ponto (recém-cadastrado),
  // complementa visualmente com pontos sintéticos para a curva fazer sentido.
  const realWeights = (history?.weights || []).map(w => ({ week: w.date.slice(5), weight: w.weight, imc: w.imc }));
  const points = realWeights.length >= 4
    ? realWeights.slice(-8)
    : [...FP.fakeHistory(user.weight).slice(0, 8 - realWeights.length).map((p, i) => ({ ...p, synthetic: true })), ...realWeights];

  const mealsDone = Object.values(today.meals || {}).filter(Boolean).length;
  const habitsDone = Object.values(today.habits || {}).filter(Boolean).length;

  // Variação
  const start = points[0]?.weight || user.weight;
  const current = Number(user.weight);
  const goal = Number(user.targetWeight);
  const totalGoal = Math.abs(goal - start) || 1;
  const traveled = Math.abs(current - start);
  const pct = Math.min(100, Math.round((traveled / totalGoal) * 100));

  return (
    <div className="px-5 pt-6 pb-32 anim-fade-up">
      <header className="mb-5">
        <div className="text-xs text-ink-muted uppercase tracking-widest">Sua jornada</div>
        <h1 className="text-2xl font-extrabold text-ink">Progresso</h1>
      </header>

      {/* Card peso */}
      <Card className="p-6 mb-5 bg-gradient-to-br from-brand to-brand-dark text-white">
        <div className="flex items-center justify-between">
          <div>
            <div className="text-xs text-white/70 uppercase tracking-widest">Peso atual</div>
            <div className="text-4xl font-extrabold">{current} <span className="text-lg font-semibold text-white/70">kg</span></div>
          </div>
          <Icon name="weight" className="w-9 h-9 text-accent" />
        </div>
        <div className="grid grid-cols-3 gap-3 pt-5 mt-5 border-t border-white/10 text-center">
          <div>
            <div className="text-[11px] text-white/70 uppercase">Inicial</div>
            <div className="font-bold">{start} kg</div>
          </div>
          <div>
            <div className="text-[11px] text-white/70 uppercase">Meta</div>
            <div className="font-bold text-accent">{goal} kg</div>
          </div>
          <div>
            <div className="text-[11px] text-white/70 uppercase">Variação</div>
            <div className="font-bold">{(current - start).toFixed(1)} kg</div>
          </div>
        </div>
        <div className="mt-4">
          <ProgressBar value={pct} max={100} color="bg-accent" track="bg-white/10" height="h-2" />
          <div className="text-xs text-white/70 mt-2 text-center">{pct}% rumo à meta</div>
        </div>
      </Card>

      {/* IMC */}
      <Section title="Seu IMC">
        <IMCCard weight={user.weight} height={user.height} />
      </Section>

      {/* Gráfico de peso */}
      <Section title={`Evolução do peso (${points.length} pontos)`}>
        <Card className="p-5">
          <Sparkline data={points.map(h => h.weight)} labels={points.map(h => h.week)} />
          {realWeights.length < 4 && (
            <div className="text-[11px] text-ink-faint text-center mt-2">
              Linha cheia: histórico real • Atualize o peso no Perfil para alimentar a evolução.
            </div>
          )}
        </Card>
      </Section>

      {/* Stats do dia */}
      <Section title="Hoje em números">
        <div className="grid grid-cols-3 gap-3">
          <Card className="p-4 text-center">
            <div className="text-2xl mb-1">🍽️</div>
            <div className="text-xl font-bold text-brand">{mealsDone}/{meals.length}</div>
            <div className="text-[11px] text-ink-muted uppercase tracking-wider">refeições</div>
          </Card>
          <Card className="p-4 text-center">
            <div className="text-2xl mb-1">🏋️</div>
            <div className="text-xl font-bold text-brand">{today.workoutDone ? '1/1' : '0/1'}</div>
            <div className="text-[11px] text-ink-muted uppercase tracking-wider">treino</div>
          </Card>
          <Card className="p-4 text-center">
            <div className="text-2xl mb-1">✅</div>
            <div className="text-xl font-bold text-brand">{habitsDone}</div>
            <div className="text-[11px] text-ink-muted uppercase tracking-wider">hábitos</div>
          </Card>
        </div>
      </Section>

      {/* Stats agregadas: semana / mês / ano */}
      {(() => {
        const periods = [
          { id: 7,   label: 'Esta semana' },
          { id: 30,  label: 'Este mês' },
          { id: 365, label: 'Este ano' },
        ];
        return (
          <Section title="Histórico" action={<span className="text-[11px] text-ink-faint">a cada 00h zera o dia</span>}>
            <div className="space-y-3">
              {periods.map(p => {
                const s = FP.aggregateStats(history, p.id);
                return (
                  <Card key={p.id} className="p-4">
                    <div className="flex items-center justify-between mb-3">
                      <div className="font-bold text-ink">{p.label}</div>
                      <div className="text-xs text-ink-muted">{s.daysActive} dia{s.daysActive !== 1 ? 's' : ''} ativos</div>
                    </div>
                    <div className="grid grid-cols-4 gap-2 text-center">
                      <div>
                        <div className="text-base font-bold text-brand">{s.meals}</div>
                        <div className="text-[10px] text-ink-muted uppercase">refeições</div>
                      </div>
                      <div>
                        <div className="text-base font-bold text-brand">{s.workouts}</div>
                        <div className="text-[10px] text-ink-muted uppercase">treinos</div>
                      </div>
                      <div>
                        <div className="text-base font-bold text-brand">{s.habits}</div>
                        <div className="text-[10px] text-ink-muted uppercase">hábitos</div>
                      </div>
                      <div>
                        <div className="text-base font-bold text-info">{(s.water * 0.25).toFixed(1)}L</div>
                        <div className="text-[10px] text-ink-muted uppercase">água</div>
                      </div>
                    </div>
                  </Card>
                );
              })}
            </div>
          </Section>
        );
      })()}

      <Section title="Fotos de progresso" action={<button className="text-sm text-brand font-semibold">+ Adicionar</button>}>
        <Card className="p-8 text-center border-2 border-dashed border-line bg-canvas">
          <div className="w-14 h-14 rounded-2xl bg-brand-tint flex items-center justify-center mx-auto mb-3">
            <Icon name="camera" className="w-7 h-7 text-brand" />
          </div>
          <div className="font-semibold text-ink">Adicione sua primeira foto</div>
          <div className="text-xs text-ink-muted mt-1 max-w-xs mx-auto">
            Compare sua evolução semana a semana de forma visual.
          </div>
        </Card>
      </Section>
    </div>
  );
};

const Sparkline = ({ data, labels }) => {
  const w = 320, h = 120, pad = 14;
  const min = Math.min(...data) - 0.5;
  const max = Math.max(...data) + 0.5;
  const range = max - min || 1;
  const xStep = (w - pad * 2) / (data.length - 1);
  const points = data.map((v, i) => {
    const x = pad + i * xStep;
    const y = pad + (h - pad * 2) - ((v - min) / range) * (h - pad * 2);
    return [x, y];
  });
  const path = points.map((p, i) => `${i === 0 ? 'M' : 'L'} ${p[0].toFixed(1)} ${p[1].toFixed(1)}`).join(' ');
  const area = `${path} L ${points[points.length-1][0]} ${h - pad} L ${pad} ${h - pad} Z`;

  return (
    <div>
      <svg viewBox={`0 0 ${w} ${h}`} className="w-full h-32">
        <defs>
          <linearGradient id="grad" x1="0" y1="0" x2="0" y2="1">
            <stop offset="0%" stopColor="#9A6CD1" stopOpacity="0.22" />
            <stop offset="100%" stopColor="#9A6CD1" stopOpacity="0" />
          </linearGradient>
        </defs>
        <path d={area} fill="url(#grad)" />
        <path d={path} stroke="#9A6CD1" strokeWidth="2.5" fill="none" strokeLinecap="round" strokeLinejoin="round" />
        {points.map((p, i) => (
          <circle key={i} cx={p[0]} cy={p[1]} r={i === points.length - 1 ? 5 : 2.5}
                  fill="#FFFFFF" stroke="#9A6CD1" strokeWidth={i === points.length - 1 ? 3 : 1.5} />
        ))}
      </svg>
      <div className="flex justify-between text-[10px] text-ink-faint mt-1 px-2">
        {labels.map((l, i) => <span key={i}>{l}</span>)}
      </div>
    </div>
  );
};

/* =========================================================
   TELA: PERFIL
   ========================================================= */

const ProfileScreen = ({ user, setUser, onReset, onNavigate, history, setHistory }) => {
  const [editing, setEditing] = useState(false);
  const [draft, setDraft] = useState(user);

  const macros = FP.calcMacros(editing ? draft : user);
  const goal = FP.GOALS.find(g => g.id === (editing ? draft : user).goal);

  const save = () => { setUser(draft); setEditing(false); };

  const u = editing ? draft : user;

  return (
    <div className="px-5 pt-6 pb-32 anim-fade-up">
      <header className="flex items-start justify-between mb-6">
        <div>
          <div className="text-xs text-ink-muted uppercase tracking-widest">Sua conta</div>
          <h1 className="text-2xl font-extrabold text-ink">Perfil</h1>
        </div>
        {editing ? (
          <div className="flex gap-2">
            <Button size="sm" variant="outline" onClick={() => { setDraft(user); setEditing(false); }}>Cancelar</Button>
            <Button size="sm" onClick={save}>Salvar</Button>
          </div>
        ) : (
          <Button size="sm" variant="ghost" onClick={() => setEditing(true)} icon="edit">Editar</Button>
        )}
      </header>

      <Card className="p-6 mb-5 text-center">
        <div className="mx-auto mb-3 w-fit">
          <Avatar
            user={u}
            size={88}
            editable
            onChange={(dataUrl) => {
              if (editing) setDraft({ ...draft, avatar: dataUrl });
              else setUser({ ...user, avatar: dataUrl });
            }}
          />
        </div>
        <div className="text-lg font-bold text-ink">{u.name || 'Usuário'}</div>
        {u.username && (
          <button
            onClick={() => {
              navigator.clipboard?.writeText('@' + u.username);
              alert('@' + u.username + ' copiado! Compartilhe com amigos para te adicionarem.');
            }}
            className="inline-flex items-center gap-1 text-xs font-semibold text-brand-dark bg-brand-tint px-2.5 py-1 rounded-full mt-1 active:scale-95 transition"
          >
            @{u.username}
            <span className="text-[10px] opacity-70">📋</span>
          </button>
        )}
        {u.email && <div className="text-xs text-ink-muted mt-1">{u.email}</div>}
        <div className="text-sm text-ink-muted mt-1">{u.age} anos • {u.height} cm • {u.weight} kg</div>
        <div className="inline-flex items-center gap-1.5 mt-3 px-3 py-1.5 bg-brand-tint text-brand text-xs font-semibold rounded-full">
          <span>{goal?.emoji}</span> {goal?.label}
        </div>
        <div className="text-[11px] text-ink-faint mt-2">Toque na foto para alterar</div>
      </Card>

      {/* Stories — fotos de progresso 24h */}
      <Section title="Seus stories" action={<span className="text-xs text-ink-faint">expiram em 24h</span>}>
        {setHistory && <StoriesRow user={u} history={history} setHistory={setHistory} />}
      </Section>

      <Card className="p-5 mb-5">
        <div className="text-xs text-ink-muted uppercase tracking-wider mb-3">Sua meta diária</div>
        <div className="flex items-end justify-between mb-3">
          <div className="text-3xl font-extrabold text-brand">{macros.calories} <span className="text-sm font-semibold text-ink-muted">kcal</span></div>
          <div className="flex gap-2 text-xs text-ink-muted">
            <span><b className="text-brand">{macros.protein}g</b> P</span>
            <span><b className="text-gold">{macros.carbs}g</b> C</span>
            <span><b className="text-info">{macros.fat}g</b> G</span>
          </div>
        </div>
        <div className="h-2 rounded-full overflow-hidden flex">
          <div className="bg-brand" style={{ width: `${(macros.protein * 4 / macros.calories) * 100}%` }} />
          <div className="bg-gold" style={{ width: `${(macros.carbs * 4 / macros.calories) * 100}%` }} />
          <div className="bg-info" style={{ width: `${(macros.fat * 9 / macros.calories) * 100}%` }} />
        </div>
      </Card>

      <Section title="Dados pessoais">
        <Card className="divide-y divide-line">
          {editing ? (
            <div className="p-4 space-y-3">
              <TextField label="Nome" value={draft.name} onChange={v => setDraft({...draft, name: v})} />
              <TextField label="Idade" value={draft.age} onChange={v => setDraft({...draft, age: v})} type="number" suffix="anos" />
              <div>
                <span className="text-xs font-semibold text-ink-muted uppercase tracking-wider">Sexo</span>
                <div className="mt-1.5 grid grid-cols-3 gap-2">
                  {FP.SEX.map(s => (
                    <button
                      key={s.id}
                      onClick={() => setDraft({...draft, sex: s.id})}
                      className={`py-2.5 rounded-xl text-xs font-semibold border ${draft.sex === s.id ? 'bg-brand text-white border-brand' : 'bg-surface border-line'}`}
                    >{s.label}</button>
                  ))}
                </div>
              </div>
              <div className="grid grid-cols-3 gap-2">
                <TextField label="Altura" value={draft.height} onChange={v => setDraft({...draft, height: v})} type="number" suffix="cm" />
                <TextField label="Peso" value={draft.weight} onChange={v => setDraft({...draft, weight: v})} type="number" suffix="kg" />
                <TextField label="Meta" value={draft.targetWeight} onChange={v => setDraft({...draft, targetWeight: v})} type="number" suffix="kg" />
              </div>
            </div>
          ) : (
            <>
              <ProfileRow label="Nome" value={u.name || '—'} />
              <ProfileRow label="Idade" value={`${u.age} anos`} />
              <ProfileRow label="Altura" value={`${u.height} cm`} />
              <ProfileRow label="Peso atual" value={`${u.weight} kg`} />
              <ProfileRow label="Meta" value={`${u.targetWeight} kg`} />
            </>
          )}
        </Card>
      </Section>

      <Section title="Objetivo e treino">
        {editing ? (
          <Card className="p-4 space-y-4">
            <div>
              <span className="text-xs font-semibold text-ink-muted uppercase tracking-wider">Objetivo</span>
              <div className="mt-2 grid grid-cols-1 gap-1.5">
                {FP.GOALS.map(g => (
                  <button
                    key={g.id}
                    onClick={() => setDraft({...draft, goal: g.id})}
                    className={`flex items-center gap-2.5 px-3 py-2.5 rounded-xl border text-left text-sm
                      ${draft.goal === g.id ? 'bg-brand text-white border-brand' : 'bg-surface border-line'}`}
                  >
                    <span className="text-lg">{g.emoji}</span>
                    <span className="font-semibold">{g.label}</span>
                  </button>
                ))}
              </div>
            </div>
            <div>
              <span className="text-xs font-semibold text-ink-muted uppercase tracking-wider">Atividade</span>
              <div className="mt-2 grid grid-cols-2 gap-1.5">
                {FP.ACTIVITY.map(a => (
                  <button
                    key={a.id}
                    onClick={() => setDraft({...draft, activity: a.id})}
                    className={`px-3 py-2 rounded-xl border text-sm font-semibold
                      ${draft.activity === a.id ? 'bg-brand text-white border-brand' : 'bg-surface border-line'}`}
                  >{a.label}</button>
                ))}
              </div>
            </div>
            <div>
              <span className="text-xs font-semibold text-ink-muted uppercase tracking-wider">Dias de treino: {draft.days}</span>
              <input
                type="range" min="1" max="7" value={draft.days}
                onChange={e => setDraft({...draft, days: Number(e.target.value)})}
                className="fp-range mt-2"
              />
            </div>
          </Card>
        ) : (
          <Card className="divide-y divide-line">
            <ProfileRow label="Objetivo" value={goal?.label} />
            <ProfileRow label="Atividade" value={FP.ACTIVITY.find(a => a.id === u.activity)?.label} />
            <ProfileRow label="Frequência" value={`${u.days}x por semana`} />
          </Card>
        )}
      </Section>

      <Section title="Preferências alimentares">
        {editing ? (
          <Card className="p-4 space-y-4">
            <div>
              <span className="text-xs font-semibold text-ink-muted uppercase tracking-wider">Dieta</span>
              <div className="mt-2 grid grid-cols-2 gap-1.5">
                {FP.DIETS.map(d => (
                  <button
                    key={d.id}
                    onClick={() => setDraft({...draft, diet: d.id})}
                    className={`px-3 py-2 rounded-xl border text-sm font-semibold flex items-center gap-2
                      ${draft.diet === d.id ? 'bg-brand text-white border-brand' : 'bg-surface border-line'}`}
                  >
                    <span>{d.emoji}</span> {d.label}
                  </button>
                ))}
              </div>
            </div>
            <TextField label="Não gosta de" value={(draft.dislikes || []).join(', ')} onChange={v => setDraft({...draft, dislikes: v.split(',').map(s => s.trim()).filter(Boolean)})} placeholder="Ex: brócolis, atum" />
          </Card>
        ) : (
          <Card className="divide-y divide-line">
            <ProfileRow label="Dieta" value={FP.DIETS.find(d => d.id === u.diet)?.label} />
            <ProfileRow label="Não gosta de" value={(u.dislikes || []).join(', ') || '—'} />
          </Card>
        )}
      </Section>

      <Section title="Atalhos">
        <Card className="p-1 divide-y divide-line">
          <button
            onClick={() => onNavigate && onNavigate('progress')}
            className="w-full flex items-center justify-between p-4 hover:bg-canvas rounded-2xl"
          >
            <div className="flex items-center gap-3">
              <div className="w-10 h-10 rounded-xl bg-brand-tint flex items-center justify-center text-brand">
                <Icon name="chart" className="w-5 h-5" />
              </div>
              <div className="text-sm font-semibold text-ink text-left">Ver evolução</div>
            </div>
            <Icon name="chevR" className="w-5 h-5 text-ink-faint" />
          </button>
          <button
            onClick={() => onNavigate && onNavigate('friends')}
            className="w-full flex items-center justify-between p-4 hover:bg-canvas rounded-2xl"
          >
            <div className="flex items-center gap-3">
              <div className="w-10 h-10 rounded-xl bg-accent-soft flex items-center justify-center text-brand-dark">
                💬
              </div>
              <div className="text-sm font-semibold text-ink text-left">Comunidade e chat</div>
            </div>
            <Icon name="chevR" className="w-5 h-5 text-ink-faint" />
          </button>
        </Card>
      </Section>

      <Section title="Conta">
        <Card className="p-1">
          <button
            onClick={() => {
              if (confirm('Refazer onboarding? Seus dados locais serão apagados.')) onReset();
            }}
            className="w-full flex items-center justify-between p-4 hover:bg-canvas rounded-2xl"
          >
            <div className="flex items-center gap-3">
              <div className="w-10 h-10 rounded-xl bg-danger/10 flex items-center justify-center text-danger">
                <Icon name="settings" className="w-5 h-5" />
              </div>
              <div className="text-sm font-semibold text-danger">Refazer onboarding</div>
            </div>
            <Icon name="chevR" className="w-5 h-5 text-ink-faint" />
          </button>
        </Card>
      </Section>

      <div className="text-center text-xs text-ink-faint mt-8">FitsPlan • MVP v0.1 • fitsplan.com</div>
    </div>
  );
};

const ProfileRow = ({ label, value }) => (
  <div className="flex items-center justify-between p-4">
    <span className="text-sm text-ink-muted">{label}</span>
    <span className="text-sm font-semibold text-ink text-right max-w-[60%] truncate">{value}</span>
  </div>
);

/* =========================================================
   TELA: LISTA DE COMPRAS
   ========================================================= */

const ShoppingScreen = ({ user, history, setHistory }) => {
  const meals = useMemo(() => FP.planForGoal(user.goal, user.diet, user.dislikes), [user]);
  const items = useMemo(() => FP.buildShoppingList(meals), [meals]);

  const checked = history.shopping?.items || [];
  const extras = history.shopping?.extras || [];
  const [newExtra, setNewExtra] = useState('');

  const toggle = (key) => {
    const set = new Set(checked);
    set.has(key) ? set.delete(key) : set.add(key);
    setHistory({ ...history, shopping: { ...history.shopping, items: [...set], extras } });
  };

  const addExtra = () => {
    if (!newExtra.trim()) return;
    const next = [...extras, { id: Date.now(), text: newExtra.trim(), done: false }];
    setHistory({ ...history, shopping: { items: checked, extras: next } });
    setNewExtra('');
  };

  const toggleExtra = (id) => {
    const next = extras.map(e => e.id === id ? { ...e, done: !e.done } : e);
    setHistory({ ...history, shopping: { items: checked, extras: next } });
  };

  const removeExtra = (id) => {
    setHistory({ ...history, shopping: { items: checked, extras: extras.filter(e => e.id !== id) } });
  };

  const clearChecked = () => {
    setHistory({ ...history, shopping: { items: [], extras: extras.map(e => ({ ...e, done: false })) } });
  };

  // Agrupa por "categoria" simples olhando palavras-chave nos ingredientes
  const categorize = (text) => {
    const t = text.toLowerCase();
    if (/(frango|peito|carne|atum|salm|ovo|whey|claras)/.test(t)) return { id: 'prot', label: 'Proteínas', emoji: '🥩' };
    if (/(banana|maçã|fruta|laranja|morango|berry)/.test(t)) return { id: 'fruta', label: 'Frutas', emoji: '🍎' };
    if (/(brócolis|espinafre|alface|tomate|pepino|cenoura|abacate|legume|verdura|abobrinha|aspargo|salada|rúcula|cebola|alho)/.test(t)) return { id: 'veg', label: 'Verduras e legumes', emoji: '🥦' };
    if (/(arroz|aveia|quinoa|batata|pão|wrap|grão|massa|granola)/.test(t)) return { id: 'carb', label: 'Carboidratos', emoji: '🍞' };
    if (/(leite|iogurte|queijo|manteiga|coco)/.test(t)) return { id: 'lac', label: 'Laticínios e bebidas', emoji: '🥛' };
    if (/(azeite|óleo|sal|pimenta|tempero|canela|mel|limão|tahine|homus|amendoim|chia)/.test(t)) return { id: 'temp', label: 'Temperos e extras', emoji: '🧂' };
    return { id: 'outros', label: 'Outros', emoji: '🛒' };
  };

  const grouped = useMemo(() => {
    const map = new Map();
    items.forEach(item => {
      const cat = categorize(item.text);
      if (!map.has(cat.id)) map.set(cat.id, { ...cat, items: [] });
      map.get(cat.id).items.push(item);
    });
    return Array.from(map.values());
  }, [items]);

  const total = items.length;
  const done = items.filter(i => checked.includes(i.text.toLowerCase())).length;
  const extrasDone = extras.filter(e => e.done).length;
  const allDone = total + extras.length;
  const allChecked = done + extrasDone;

  return (
    <div className="px-5 pt-3 pb-32 anim-fade-up">
      {/* Resumo */}
      <Card className="p-5 mb-5 bg-gradient-to-br from-brand to-brand-dark text-white">
        <div className="flex items-center gap-4">
          <Ring value={allChecked} max={Math.max(1, allDone)} size={84} stroke={8}
            label={`${allChecked}/${allDone}`} sublabel="itens" color="#D5F379"
            trackColor="rgba(255,255,255,0.18)"
            labelClass="text-gelo"
            sublabelClass="text-abacate" />
          <div className="flex-1">
            <div className="text-white/70 text-xs uppercase tracking-widest">Lista da semana</div>
            <div className="text-xl font-extrabold leading-tight">Compras do plano</div>
            <div className="text-white/70 text-xs mt-1">Gerada do seu plano alimentar</div>
          </div>
        </div>
        {allChecked > 0 && (
          <button
            onClick={clearChecked}
            className="mt-4 w-full py-2 rounded-xl bg-white/10 text-white/90 text-xs font-semibold hover:bg-white/15"
          >
            Limpar marcados
          </button>
        )}
      </Card>

      {/* Adicionar item extra */}
      <Card className="p-3 mb-5 flex gap-2">
        <input
          value={newExtra}
          onChange={e => setNewExtra(e.target.value)}
          onKeyDown={e => e.key === 'Enter' && addExtra()}
          placeholder="Adicionar item à lista..."
          className="flex-1 px-3 py-2 bg-transparent outline-none text-sm text-ink"
        />
        <button
          onClick={addExtra}
          disabled={!newExtra.trim()}
          className="px-4 py-2 rounded-xl bg-brand text-white text-sm font-semibold disabled:opacity-40"
        >+</button>
      </Card>

      {/* Itens extras (manuais) */}
      {extras.length > 0 && (
        <Section title="Meus itens">
          <div className="space-y-2">
            {extras.map(e => (
              <Card key={e.id} className="p-3 flex items-center gap-3">
                <button
                  onClick={() => toggleExtra(e.id)}
                  className={`w-7 h-7 rounded-full border-2 flex items-center justify-center shrink-0
                    ${e.done ? 'bg-accent border-accent text-brand-dark' : 'border-line text-ink-faint'}`}
                >
                  <Icon name="check" className="w-4 h-4" stroke={2.5} />
                </button>
                <div className={`flex-1 text-sm ${e.done ? 'line-through text-ink-faint' : 'text-ink'}`}>{e.text}</div>
                <button onClick={() => removeExtra(e.id)} className="text-ink-faint text-lg px-2">×</button>
              </Card>
            ))}
          </div>
        </Section>
      )}

      {/* Itens do plano agrupados por categoria */}
      {grouped.map(cat => (
        <Section key={cat.id} title={`${cat.emoji} ${cat.label}`}>
          <Card className="divide-y divide-line">
            {cat.items.map((item, i) => {
              const key = item.text.toLowerCase();
              const isDone = checked.includes(key);
              return (
                <div key={i} className="p-3 flex items-center gap-3">
                  <button
                    onClick={() => toggle(key)}
                    className={`w-7 h-7 rounded-full border-2 flex items-center justify-center shrink-0
                      ${isDone ? 'bg-accent border-accent text-brand-dark' : 'border-line text-ink-faint'}`}
                  >
                    <Icon name="check" className="w-4 h-4" stroke={2.5} />
                  </button>
                  <div className="flex-1 min-w-0">
                    <div className={`text-sm ${isDone ? 'line-through text-ink-faint' : 'text-ink'}`}>{item.text}</div>
                    {item.recipes.length > 1 && (
                      <div className="text-[10px] text-ink-faint mt-0.5">Usado em {item.recipes.length} receitas</div>
                    )}
                  </div>
                </div>
              );
            })}
          </Card>
        </Section>
      ))}

      {grouped.length === 0 && extras.length === 0 && (
        <Card className="p-8 text-center text-ink-muted text-sm">
          Sua lista de compras está vazia.
        </Card>
      )}
    </div>
  );
};

/* =========================================================
   LAYOUT + NAVEGAÇÃO INFERIOR
   ========================================================= */

const TABS = [
  { id: 'today',    label: 'Hoje',        icon: 'home' },
  { id: 'meal',     label: 'Alimentação', icon: 'meal' },
  { id: 'workout',  label: 'Treino',      icon: 'dumbbell' },
  { id: 'habits',   label: 'Hábitos',     icon: 'check' },
  { id: 'profile',  label: 'Perfil',      icon: 'user' },
];

const SUB_TABS = {
  meal: [
    { id: 'plan',    label: 'Meu plano' },
    { id: 'library', label: 'Receitas' },
  ],
};

const BottomNav = ({ active, onChange }) => (
  <nav className="fixed bottom-0 left-0 right-0 z-40 max-w-[460px] mx-auto fp-frost border-t border-line/60">
    <div className="grid grid-cols-5 px-2 pt-2 pb-3">
      {TABS.map(t => {
        const isActive = active === t.id;
        return (
          <button
            key={t.id}
            onClick={() => onChange(t.id)}
            className="flex flex-col items-center gap-1 py-1.5 transition"
          >
            <div className={`relative px-3 py-1.5 rounded-2xl transition ${isActive ? 'bg-brand text-white' : 'text-ink-faint'}`}>
              <Icon name={t.icon} className="w-5 h-5" />
            </div>
            <span className={`text-[10px] font-semibold ${isActive ? 'text-brand' : 'text-ink-faint'}`}>{t.label}</span>
          </button>
        );
      })}
    </div>
  </nav>
);

/* =========================================================
   APP ROOT
   ========================================================= */

const App = () => {
  const [state, setState] = useState(() => {
    const loaded = FP.loadState();
    return loaded ? FP.rolloverDayIfNeeded(loaded) : null;
  });
  const [pendingUser, setPendingUser] = useState(null); // dados do quiz aguardando login
  const [tab, setTab] = useState('today');
  const [mealSubtab, setMealSubtab] = useState('plan');
  const [dismissedNotifs, setDismissedNotifs] = useState([]); // session-scoped (refresh = aparecem de novo)

  // Persistência reativa
  useEffect(() => {
    if (state) FP.saveState(state);
  }, [state]);

  // Verificação de meia-noite: a cada 60s checa se virou o dia.
  // Se virou, salva o dia anterior em history.days e zera "today".
  useEffect(() => {
    if (!state) return;
    const id = setInterval(() => {
      setState(prev => prev ? FP.rolloverDayIfNeeded(prev) : prev);
    }, 60_000);
    return () => clearInterval(id);
  }, [state?.todayDate]);

  // Quiz finalizado → guarda os dados temporariamente e mostra tela de login
  const finishOnboarding = (userData) => {
    setPendingUser(userData);
  };

  // Login concluído (ou pulado) → cria estado final e entra no app
  const finishLogin = (userData) => {
    const imc = FP.calcIMC(userData.weight, userData.height);
    const history = FP.emptyHistory();
    history.weights = FP.appendWeight(history, userData.weight, imc);
    // Gera username único baseado no nome (pode ser editado depois no perfil)
    const userWithHandle = {
      ...userData,
      username: userData.username || FP.generateUsername(userData.name),
    };
    const initial = {
      user: userWithHandle,
      today: FP.emptyToday(),
      todayDate: FP.todayKey(),
      history,
      createdAt: Date.now(),
    };
    setState(initial);
    setPendingUser(null);
    setTab('today');
  };

  // Atualiza usuário e, se peso mudou, registra ponto novo no histórico
  const setUser = (newUser) => setState(prev => {
    const prevWeight = Number(prev?.user?.weight);
    const nextWeight = Number(newUser.weight);
    let history = prev.history || FP.emptyHistory();
    if (nextWeight && nextWeight !== prevWeight) {
      const imc = FP.calcIMC(nextWeight, newUser.height);
      history = { ...history, weights: FP.appendWeight(history, nextWeight, imc) };
    }
    return { ...prev, user: newUser, history };
  });

  const setToday = (newToday) => setState(prev => ({ ...prev, today: newToday }));
  const setHistory = (newHistory) => setState(prev => ({ ...prev, history: newHistory }));

  const reset = () => {
    FP.clearState();
    setState(null);
  };

  // 1) Onboarding (quiz)
  if (!state || !state.user) {
    if (pendingUser) {
      return (
        <div className="fp-shell">
          <LoginScreen pendingUser={pendingUser} onComplete={finishLogin} />
        </div>
      );
    }
    return (
      <div className="fp-shell">
        <Onboarding onFinish={finishOnboarding} />
      </div>
    );
  }

  const { user, today } = state;
  const history = state.history || FP.emptyHistory();

  return (
    <div className="fp-shell">
      {/* Conteúdo da aba */}
      <div key={tab + (tab === 'meal' ? mealSubtab : '')}>
        {tab === 'today' && (
          <TodayScreen
            user={user} today={today} setToday={setToday} onNavigate={setTab}
            history={history}
            dismissedNotifs={dismissedNotifs}
            setDismissedNotifs={setDismissedNotifs}
          />
        )}

        {tab === 'meal' && (
          <>
            <header className="px-5 pt-6 pb-2 anim-fade-up">
              <div className="text-xs text-ink-muted uppercase tracking-widest">Comida</div>
              <h1 className="text-2xl font-extrabold text-ink">Alimentação</h1>
              <div className="flex gap-2 mt-3 overflow-x-auto no-scrollbar">
                <Pill active={mealSubtab === 'plan'} onClick={() => setMealSubtab('plan')}>Meu plano</Pill>
                <Pill active={mealSubtab === 'library'} onClick={() => setMealSubtab('library')}>Receitas</Pill>
                <Pill active={mealSubtab === 'shopping'} onClick={() => setMealSubtab('shopping')}>Compras</Pill>
              </div>
            </header>
            {mealSubtab === 'plan'     && <MealPlanScreen user={user} today={today} setToday={setToday} />}
            {mealSubtab === 'library'  && <RecipeLibraryScreen />}
            {mealSubtab === 'shopping' && <ShoppingScreen user={user} history={history} setHistory={setHistory} />}
          </>
        )}

        {tab === 'workout' && (
          <WorkoutScreen user={user} today={today} setToday={setToday} />
        )}

        {tab === 'habits' && (
          <>
            <HabitsScreen today={today} setToday={setToday} user={user} />
          </>
        )}

        {tab === 'profile' && (
          <ProfileScreen
            user={user} setUser={setUser} onReset={reset} onNavigate={setTab}
            history={history} setHistory={setHistory}
          />
        )}

        {tab === 'friends' && (
          <>
            <header className="px-5 pt-6 pb-2 anim-fade-up flex items-center gap-3">
              <button onClick={() => setTab('profile')} className="w-9 h-9 rounded-full bg-surface border border-line flex items-center justify-center">
                <Icon name="chevL" className="w-5 h-5 text-ink-soft" />
              </button>
              <div>
                <div className="text-xs text-ink-muted uppercase tracking-widest">Comunidade</div>
                <h1 className="text-2xl font-extrabold text-ink">Amigos</h1>
              </div>
            </header>
            <FriendsScreen user={user} history={history} setHistory={setHistory} />
          </>
        )}

        {tab === 'progress' && (
          <ProgressScreen user={user} today={today} history={history} />
        )}
      </div>

      <BottomNav active={['progress','friends'].includes(tab) ? 'profile' : tab} onChange={setTab} />
    </div>
  );
};

/* ---------- helpers UI ---------- */
function greetingTime() {
  const h = new Date().getHours();
  if (h < 12) return 'Bom dia';
  if (h < 18) return 'Boa tarde';
  return 'Boa noite';
}
function prettyDate() {
  return new Date().toLocaleDateString('pt-BR', { weekday: 'long', day: 'numeric', month: 'long' });
}

/* ---------- Mount ---------- */
const root = ReactDOM.createRoot(document.getElementById('root'));
root.render(<App />);
