/* Shared components: Icons, Sidebar, Brand, Progress, Badge, Toast, Modal */

// ============ ICONS (Lucide-style, stroke 1.75) ============
const Icon = ({ d, size = 18, stroke = 1.75, fill, extra, ...rest }) => (
  <svg width={size} height={size} viewBox="0 0 24 24" fill={fill || 'none'}
       stroke="currentColor" strokeWidth={stroke} strokeLinecap="round" strokeLinejoin="round" {...rest}>
    {typeof d === 'string' ? <path d={d} /> : d}
    {extra}
  </svg>
);

const I = {
  home: (p) => <Icon {...p} d="M3 12 12 3l9 9M5 10v10h14V10" />,
  play: (p) => <Icon {...p} d="M6 4l14 8-14 8V4z" />,
  book: (p) => <Icon {...p} d="M4 19.5A2.5 2.5 0 0 1 6.5 17H20V4H6.5A2.5 2.5 0 0 0 4 6.5v13zM4 19.5V22h16" />,
  chat: (p) => <Icon {...p} d="M3 5h18v12H8l-5 4V5z" />,
  award: (p) => <Icon {...p} d="M12 2a6 6 0 1 1 0 12 6 6 0 0 1 0-12zM8 13l-2 9 6-3 6 3-2-9" />,
  user: (p) => <Icon {...p} d="M12 12a4 4 0 1 0 0-8 4 4 0 0 0 0 8zM4 20a8 8 0 1 1 16 0" />,
  users: (p) => <Icon {...p} d="M16 21v-2a4 4 0 0 0-4-4H5a4 4 0 0 0-4 4v2M8.5 11a4 4 0 1 0 0-8 4 4 0 0 0 0 8zM23 21v-2a4 4 0 0 0-3-3.87M17 3.13a4 4 0 0 1 0 7.75" />,
  logout: (p) => <Icon {...p} d="M9 21H5a2 2 0 0 1-2-2V5a2 2 0 0 1 2-2h4M16 17l5-5-5-5M21 12H9" />,
  check: (p) => <Icon {...p} d="M20 6 9 17l-5-5" />,
  checkCircle: (p) => <Icon {...p} d="M12 22a10 10 0 1 0 0-20 10 10 0 0 0 0 20zM8 12l3 3 5-6" />,
  circle: (p) => <Icon {...p} d="M12 22a10 10 0 1 0 0-20 10 10 0 0 0 0 20z" />,
  lock: (p) => <Icon {...p} d="M5 11h14v10H5zM8 11V7a4 4 0 1 1 8 0v4" />,
  search: (p) => <Icon {...p} d="M11 19a8 8 0 1 0 0-16 8 8 0 0 0 0 16zm10 2-4.3-4.3" />,
  bell: (p) => <Icon {...p} d="M18 8a6 6 0 0 0-12 0c0 7-3 9-3 9h18s-3-2-3-9M13.7 21a2 2 0 0 1-3.4 0" />,
  flame: (p) => <Icon {...p} d="M8.5 14.5A2.5 2.5 0 0 0 11 17c2 0 3-1 3.5-2.5C16 12 14 8 12 6c0 2-4 4-4 8 0 .5 0 .5.5.5zM12 2c1 2 3 4 3 7a3 3 0 0 1-6 0c0-2 1-2 1-4" />,
  chevronLeft: (p) => <Icon {...p} d="M15 18l-6-6 6-6" />,
  chevronRight: (p) => <Icon {...p} d="M9 18l6-6-6-6" />,
  chevronDown: (p) => <Icon {...p} d="M6 9l6 6 6-6" />,
  chevronUp: (p) => <Icon {...p} d="M18 15l-6-6-6 6" />,
  x: (p) => <Icon {...p} d="M18 6 6 18M6 6l12 12" />,
  plus: (p) => <Icon {...p} d="M12 5v14M5 12h14" />,
  edit: (p) => <Icon {...p} d="M11 4H4a2 2 0 0 0-2 2v14a2 2 0 0 0 2 2h14a2 2 0 0 0 2-2v-7M18.5 2.5a2.1 2.1 0 0 1 3 3L12 15l-4 1 1-4 9.5-9.5z" />,
  trash: (p) => <Icon {...p} d="M3 6h18M8 6V4a2 2 0 0 1 2-2h4a2 2 0 0 1 2 2v2M19 6l-1 14a2 2 0 0 1-2 2H8a2 2 0 0 1-2-2L5 6" />,
  download: (p) => <Icon {...p} d="M21 15v4a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2v-4M7 10l5 5 5-5M12 15V3" />,
  upload: (p) => <Icon {...p} d="M21 15v4a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2v-4M17 8l-5-5-5 5M12 3v12" />,
  link: (p) => <Icon {...p} d="M10 13a5 5 0 0 0 7 0l3-3a5 5 0 0 0-7-7l-1 1M14 11a5 5 0 0 0-7 0l-3 3a5 5 0 0 0 7 7l1-1" />,
  file: (p) => <Icon {...p} d="M14 2H6a2 2 0 0 0-2 2v16a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V8l-6-6zM14 2v6h6" />,
  filePdf: (p) => <Icon {...p} d="M14 2H6a2 2 0 0 0-2 2v16a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V8l-6-6zM14 2v6h6M9 15h6M9 18h4" />,
  text: (p) => <Icon {...p} d="M4 7V4h16v3M9 20h6M12 4v16" />,
  clock: (p) => <Icon {...p} d="M12 22a10 10 0 1 0 0-20 10 10 0 0 0 0 20zM12 6v6l4 2" />,
  calendar: (p) => <Icon {...p} d="M19 4H5a2 2 0 0 0-2 2v14a2 2 0 0 0 2 2h14a2 2 0 0 0 2-2V6a2 2 0 0 0-2-2zM16 2v4M8 2v4M3 10h18" />,
  video: (p) => <Icon {...p} d="M23 7l-7 5 7 5V7zM14 5H3a2 2 0 0 0-2 2v10a2 2 0 0 0 2 2h11a2 2 0 0 0 2-2V7a2 2 0 0 0-2-2z" />,
  settings: (p) => <Icon {...p} d="M12 15a3 3 0 1 0 0-6 3 3 0 0 0 0 6zM19.4 15a1.7 1.7 0 0 0 .3 1.8l.1.1a2 2 0 1 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 1 1-4 0v-.1a1.7 1.7 0 0 0-1-1.5 1.7 1.7 0 0 0-1.8.3l-.1.1a2 2 0 1 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 1 1 0-4h.1a1.7 1.7 0 0 0 1.5-1 1.7 1.7 0 0 0-.3-1.8l-.1-.1a2 2 0 1 1 2.8-2.8l.1.1a1.7 1.7 0 0 0 1.8.3h.1a1.7 1.7 0 0 0 1-1.5V3a2 2 0 1 1 4 0v.1a1.7 1.7 0 0 0 1 1.5 1.7 1.7 0 0 0 1.8-.3l.1-.1a2 2 0 1 1 2.8 2.8l-.1.1a1.7 1.7 0 0 0-.3 1.8v.1a1.7 1.7 0 0 0 1.5 1H21a2 2 0 1 1 0 4h-.1a1.7 1.7 0 0 0-1.5 1z" />,
  barChart: (p) => <Icon {...p} d="M3 21V10M9 21V4M15 21v-8M21 21v-13" />,
  trendUp: (p) => <Icon {...p} d="M23 6l-9.5 9.5-5-5L1 18M17 6h6v6" />,
  trendDown: (p) => <Icon {...p} d="M23 18l-9.5-9.5-5 5L1 6M17 18h6v-6" />,
  alert: (p) => <Icon {...p} d="M10.3 3.9 1.8 18a2 2 0 0 0 1.7 3h17a2 2 0 0 0 1.7-3L13.7 3.9a2 2 0 0 0-3.4 0zM12 9v4M12 17h.01" />,
  info: (p) => <Icon {...p} d="M12 22a10 10 0 1 0 0-20 10 10 0 0 0 0 20zM12 16v-4M12 8h.01" />,
  star: (p) => <Icon {...p} d="M12 2l3.09 6.26L22 9.27l-5 4.87 1.18 6.88L12 17.77l-6.18 3.25L7 14.14 2 9.27l6.91-1.01L12 2z" />,
  sparkle: (p) => <Icon {...p} d="M12 3l1.5 4.5L18 9l-4.5 1.5L12 15l-1.5-4.5L6 9l4.5-1.5L12 3zM19 14l.7 2.3L22 17l-2.3.7L19 20l-.7-2.3L16 17l2.3-.7L19 14z" />,
  dragHandle: (p) => <Icon {...p} d="M9 6h.01M9 12h.01M9 18h.01M15 6h.01M15 12h.01M15 18h.01" />,
  menu: (p) => <Icon {...p} d="M3 12h18M3 6h18M3 18h18" />,
  eye: (p) => <Icon {...p} d="M1 12s4-8 11-8 11 8 11 8-4 8-11 8-11-8-11-8zM12 15a3 3 0 1 0 0-6 3 3 0 0 0 0 6z" />,
  eyeOff: (p) => <Icon {...p} d="M1 1l22 22M17.9 17.9A10 10 0 0 1 12 20C5 20 1 12 1 12a20 20 0 0 1 5.1-6M9.9 4.2A10 10 0 0 1 12 4c7 0 11 8 11 8a20 20 0 0 1-3.2 4.2M14.1 14.1a3 3 0 1 1-4.2-4.2" />,
  send: (p) => <Icon {...p} d="M22 2 11 13M22 2l-7 20-4-9-9-4 20-7z" />,
  filter: (p) => <Icon {...p} d="M22 3H2l8 9v7l4 2v-9l8-9z" />,
  mail: (p) => <Icon {...p} d="M4 4h16c1 0 2 1 2 2v12c0 1-1 2-2 2H4c-1 0-2-1-2-2V6c0-1 1-2 2-2zM22 6 12 13 2 6" />,
  shield: (p) => <Icon {...p} d="M12 22s8-4 8-10V5l-8-3-8 3v7c0 6 8 10 8 10z" />,
  globe: (p) => <Icon {...p} d="M12 22a10 10 0 1 0 0-20 10 10 0 0 0 0 20zM2 12h20M12 2a15 15 0 0 1 0 20M12 2a15 15 0 0 0 0 20" />,
  monitor: (p) => <Icon {...p} d="M20 3H4a2 2 0 0 0-2 2v11a2 2 0 0 0 2 2h16a2 2 0 0 0 2-2V5a2 2 0 0 0-2-2zM8 21h8M12 18v3" />,
  lightning: (p) => <Icon {...p} d="M13 2 3 14h9l-1 8 10-12h-9l1-8z" />,
  trophy: (p) => <Icon {...p} d="M6 9a6 6 0 0 0 12 0V3H6v6zM6 9H3a3 3 0 0 1 0-6h3M18 9h3a3 3 0 0 0 0-6h-3M12 15v6M8 21h8" />,
  flag: (p) => <Icon {...p} d="M4 22V4c3-2 7 2 10 0s4-2 6 0v10c-2-2-3 0-6 0s-7-2-10 0" />,
  zap: (p) => <Icon {...p} d="M13 2 3 14h7l-2 8 10-12h-7l2-8z" />,
  target: (p) => <Icon {...p} d="M12 22a10 10 0 1 0 0-20 10 10 0 0 0 0 20zM12 18a6 6 0 1 0 0-12 6 6 0 0 0 0 12zM12 14a2 2 0 1 0 0-4 2 2 0 0 0 0 4z" />,
  save: (p) => <Icon {...p} d="M19 21H5a2 2 0 0 1-2-2V5a2 2 0 0 1 2-2h11l5 5v11a2 2 0 0 1-2 2zM17 21v-8H7v8M7 3v5h8" />,
  external: (p) => <Icon {...p} d="M18 13v6a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2V8a2 2 0 0 1 2-2h6M15 3h6v6M10 14L21 3" />,
  sliders: (p) => <Icon {...p} d="M4 21V14M4 10V3M12 21V12M12 8V3M20 21v-5M20 12V3M1 14h6M9 8h6M17 16h6" />,
};

// ============ BRAND LOCKUP ============
// Official symbol + typographic wordmark (honest fallback — the full lockup
// PNG is not in the repo; see ASSETS.md).
function BrandLockup({ dark = true, size = 'md' }) {
  const scale = size === 'sm' ? 0.85 : size === 'lg' ? 1.25 : 1;
  return (
    <div style={{ display: 'flex', alignItems: 'center', gap: 10 * scale }}>
      <img src={FC_ASSETS.simbolo} alt="Fluência Contábil"
           style={{ width: 36 * scale, height: 36 * scale, objectFit: 'contain', flexShrink: 0 }} />
      <div style={{ display: 'flex', flexDirection: 'column', lineHeight: 1 }}>
        <div style={{
          fontSize: 13 * scale, fontWeight: 700, letterSpacing: '0.14em',
          color: dark ? '#FFFFFF' : '#1B2A4A', textTransform: 'uppercase',
        }}>
          Fluência Contábil
        </div>
        <div style={{
          fontSize: 9.5 * scale, letterSpacing: '0.08em', marginTop: 4,
          color: dark ? '#C8A84B' : '#A88A32', textTransform: 'uppercase', fontWeight: 500,
        }}>
          Contabilidade para quem quer ser fluente
        </div>
      </div>
    </div>
  );
}

// ============ SIDEBAR ============
function Sidebar({ area, user, route, onNavigate, onLogout }) {
  const alunoItems = [
    { id: 'dashboard', icon: I.home, label: 'Dashboard' },
    { id: 'aulas', icon: I.play, label: 'Aulas' },
    { id: 'duvidas', icon: I.chat, label: 'Dúvidas', badge: 3 },
    { id: 'certificado', icon: I.award, label: 'Certificado' },
    ...(user && user.plano === 'anual' ? [{ id: 'mentoria', icon: I.sparkle, label: 'Mentoria', gold: true }] : []),
    { id: 'perfil', icon: I.user, label: 'Perfil' },
  ];
  const adminItems = [
    { id: 'admin', icon: I.home, label: 'Dashboard' },
    { id: 'admin-aulas', icon: I.play, label: 'Aulas' },
    { id: 'admin-alunos', icon: I.users, label: 'Alunos', badge: 247 },
    { id: 'admin-duvidas', icon: I.chat, label: 'Dúvidas', badge: 14 },
    { id: 'admin-metricas', icon: I.barChart, label: 'Métricas' },
    { id: 'admin-config', icon: I.settings, label: 'Configurações' },
  ];
  const items = area === 'admin' ? adminItems : alunoItems;

  return (
    <aside className={'fc-sidebar' + (area === 'admin' ? ' admin' : '')}>
      <div className="fc-sidebar-brand">
        <img src={FC_ASSETS.simbolo} alt="Fluência Contábil" />
        <div className="fc-sidebar-brand-text">
          <div className="fc-sidebar-brand-name">Fluência<br/>Contábil</div>
          <div className="fc-sidebar-brand-tag">
            {area === 'admin' ? 'Painel Admin' : 'Área do Aluno'}
          </div>
        </div>
      </div>

      <nav className="fc-sidebar-nav">
        <div className="fc-sidebar-section-label">
          {area === 'admin' ? 'Gestão' : 'Meus estudos'}
        </div>
        {items.map(it => {
          const IconEl = it.icon;
          return (
            <div key={it.id}
                 className={'fc-nav-item' + (route === it.id ? ' active' : '')}
                 onClick={() => onNavigate(it.id)}>
              <IconEl size={18} />
              <span>{it.label}</span>
              {it.badge != null && <span className="nav-badge">{it.badge}</span>}
              {it.gold && <I.star size={14} style={{ marginLeft: 'auto', color: '#C8A84B' }} />}
            </div>
          );
        })}
      </nav>

      <div className="fc-sidebar-foot">
        <div className="fc-avatar">
          {area === 'admin'
            ? <img src={FC_ASSETS.foto} alt="Prof. Vinícius Ferraz" />
            : (user ? user.primeiroNome.charAt(0) : '?')}
        </div>
        <div style={{ flex: 1, minWidth: 0 }}>
          <div className="fc-sidebar-user-name" style={{ overflow: 'hidden', textOverflow: 'ellipsis', whiteSpace: 'nowrap' }}>
            {area === 'admin' ? 'Prof. Vinícius' : (user ? user.primeiroNome : '')}
          </div>
          <div className="fc-sidebar-user-plan">
            {area === 'admin' ? 'Fundador' : (user ? user.planoLabel : '')}
          </div>
        </div>
        <button className="fc-sidebar-logout" title="Sair" onClick={onLogout}>
          <I.logout size={16} />
        </button>
      </div>
    </aside>
  );
}

// ============ CARD / PROGRESS / BADGE ============
function Card({ children, style, className = '', ...rest }) {
  return <div className={'fc-card ' + className} style={style} {...rest}>{children}</div>;
}

function Progress({ value = 0, size = 'md', label, rightLabel }) {
  const cls = size === 'sm' ? 'fc-progress fc-progress-sm' : size === 'xs' ? 'fc-progress fc-progress-xs' : 'fc-progress';
  return (
    <div>
      {(label || rightLabel) && (
        <div style={{ display: 'flex', justifyContent: 'space-between', marginBottom: 6, fontSize: 12, color: 'var(--fc-gray-600)' }}>
          <span>{label}</span>
          <span style={{ fontWeight: 600, color: 'var(--fc-azul-profundo)' }}>{rightLabel}</span>
        </div>
      )}
      <div className={cls}>
        <div className="fc-progress-bar" style={{ width: Math.min(100, value) + '%' }} />
      </div>
    </div>
  );
}

function Badge({ tone = 'gold', children, icon: IconEl }) {
  return (
    <span className={'fc-badge fc-badge-' + tone}>
      {IconEl && <IconEl size={11} />}
      {children}
    </span>
  );
}

// ============ TOAST ============
const ToastCtx = React.createContext(null);
function ToastProvider({ children }) {
  const [toasts, setToasts] = React.useState([]);
  const push = React.useCallback((msg, opts = {}) => {
    const id = Math.random();
    setToasts(ts => [...ts, { id, msg, gold: opts.gold, icon: opts.icon }]);
    setTimeout(() => setToasts(ts => ts.filter(t => t.id !== id)), 3200);
  }, []);
  return (
    <ToastCtx.Provider value={push}>
      {children}
      <div className="fc-toast-host">
        {toasts.map(t => (
          <div key={t.id} className={'fc-toast' + (t.gold ? ' fc-toast-gold' : '')}>
            {t.icon ? <t.icon size={16} /> : <I.check size={16} />}
            <span>{t.msg}</span>
          </div>
        ))}
      </div>
    </ToastCtx.Provider>
  );
}
const useToast = () => React.useContext(ToastCtx);

// ============ MODAL ============
function Modal({ open, onClose, title, children, footer, wide }) {
  if (!open) return null;
  return (
    <div className="fc-modal-backdrop" onClick={onClose}>
      <div className="fc-modal" style={wide ? { maxWidth: 720 } : {}} onClick={e => e.stopPropagation()}>
        <div className="fc-modal-hd">
          <h3 className="fc-h3" style={{ margin: 0 }}>{title}</h3>
          <button onClick={onClose} className="fc-btn-ghost" style={{ padding: 4, borderRadius: 6 }}><I.x size={18} /></button>
        </div>
        <div className="fc-modal-bd">{children}</div>
        {footer && <div className="fc-modal-ft">{footer}</div>}
      </div>
    </div>
  );
}

// ============ VIDEO PLAYER MOCK ============
function VideoPlayer({ aulaTitulo, email }) {
  return (
    <div className="fc-video-placeholder">
      <div className="fc-watermark">{email}</div>
      <div className="fc-video-meta">
        Fluência Contábil · {aulaTitulo}
      </div>
      <div className="fc-video-play"><I.play size={28} fill="#1B2A4A" /></div>
    </div>
  );
}

// ============ EMPTY STATE ============
function EmptyState({ icon: IconEl = I.info, title, description, cta }) {
  return (
    <div className="fc-empty">
      <div className="fc-empty-icon"><IconEl size={24} /></div>
      <div className="fc-h4" style={{ marginBottom: 6 }}>{title}</div>
      <div className="fc-small" style={{ maxWidth: 340, margin: '0 auto 12px' }}>{description}</div>
      {cta}
    </div>
  );
}

// ============ TAG / STATUS PILLS ============
function StatusPill({ status }) {
  const map = {
    ativo:        { tone: 'green',  label: 'Ativo' },
    expirado:     { tone: 'gray',   label: 'Expirado' },
    cancelado:    { tone: 'red',    label: 'Cancelado' },
    inadimplente: { tone: 'yellow', label: 'Inadimplente' },
    'inativo-14d':{ tone: 'yellow', label: 'Inativo 14d+' },
    cortesia:     { tone: 'blue',   label: 'Cortesia' },
    rascunho:     { tone: 'gray',   label: 'Rascunho' },
    publicada:    { tone: 'green',  label: 'Publicada' },
  };
  const it = map[status] || { tone: 'gray', label: status };
  return <Badge tone={it.tone}>{it.label}</Badge>;
}

// ============ Export to window ============
Object.assign(window, {
  I, Icon, BrandLockup, Sidebar, Card, Progress, Badge,
  ToastProvider, useToast, Modal, VideoPlayer, EmptyState, StatusPill,
});
