// Testimonials.jsx
// To swap a monogram for a real logo, set `logo: "assets/logos/aplo.svg"` on the entry.
const QUOTES = [
  {
    q: 'Fabrice is genuinely curious and knowledgeable about crypto. Combined with his two decades of trading floor experience, he was the perfect bridge for Aplo to reach both TradFi and crypto-natives.',
    company: 'Aplo',
    who: 'Oliver Yates',
    role: 'CEO',
    sector: 'Crypto prime brokerage',
    status: 'Acquired',
    logo: null,
  },
  {
    q: 'L\u2019accompagnement de Fabrice a \u00e9t\u00e9 d\u00e9terminant dans les premiers mois d\u2019Aircap. Son recul, sa disponibilit\u00e9 et la pertinence de ses conseils nous ont aid\u00e9s \u00e0 structurer notre positionnement et \u00e0 avancer avec bien plus de clart\u00e9. Un mentor exigeant et bienveillant, dont je recommande l\u2019accompagnement sans r\u00e9serve.',
    company: 'Aircap',
    who: 'Gr\u00e9goire Bloch-Escoffier',
    role: 'CEO',
    sector: 'Fintech',
    status: 'Early stage',
    logo: null,
    url: null,
  },
  {
    q: 'Quand une bo\u00eete grandit aussi vite, on a rarement le recul n\u00e9cessaire sur ses propres d\u00e9cisions. Fabrice a jou\u00e9 ce r\u00f4le de sparring partner pour Qevlar d\u00e8s nos d\u00e9buts \u00e0 Platform58 : un entrepreneur qui \u00e9tait d\u00e9j\u00e0 pass\u00e9 par l\u00e0, capable de nous \u00e9pauler autant sur le commercial que sur l\u2019op\u00e9rationnel, et surtout de challenger nos choix avant qu\u2019ils ne deviennent des probl\u00e8mes.',
    company: 'Qevlar',
    who: 'Ahmed Achchak',
    role: 'CEO',
    sector: 'Agentic AI \u00b7 Cybersecurity',
    status: '$44M raised',
    logo: null,
    url: 'https://www.qevlar.com',
  },
  {
    q: 'Nos \u00e9changes avec Fabrice dans le cadre du programme Platform58 de La Banque Postale ont \u00e9t\u00e9 tr\u00e8s utiles pour Skypher. Ses conseils ont toujours \u00e9t\u00e9 concrets et pertinents, et il a su nous challenger de mani\u00e8re constructive, tout en continuant \u00e0 nous suivre avec attention apr\u00e8s le programme.',
    company: 'Skypher',
    who: 'Gaspard de Lacroix-Vaubois',
    role: 'CEO',
    sector: 'SaaS \u00b7 Security',
    status: 'Funded',
    logo: null,
    url: 'https://skypher.co',
  },
  {
    q: 'J\u2019ai eu la chance d\u2019\u00eatre accompagn\u00e9 par Fabrice dans le cadre du programme Wilco. C\u2019est un excellent sparring partner, avec une vraie exp\u00e9rience de l\u2019entrepreneuriat et des enjeux de scale. Nos \u00e9changes ont \u00e9t\u00e9 tr\u00e8s concrets et plusieurs de ses conseils ont pu \u00eatre appliqu\u00e9s directement au d\u00e9veloppement du business.',
    company: 'Reasy',
    who: 'Mathieu Tse',
    role: 'Co-Founder',
    sector: 'Fintech',
    status: 'Early stage',
    logo: null,
    url: 'https://reasy.fr',
  },
  {
    q: 'Tr\u00e8s t\u00f4t dans la vie de Qantev, l\u2019exp\u00e9rience de Fabrice nous a \u00e9t\u00e9 pr\u00e9cieuse pour mieux aborder les discussions complexes avec nos clients enterprise et affiner notre offre produit.',
    company: 'Qantev',
    who: 'Tarik Dadi',
    role: 'CEO',
    sector: 'AI \u00b7 Insurance',
    status: 'Series A',
    logo: null,
    url: 'https://qantev.com',
  },
  {
    q: 'Fabrice est un mentor de confiance qui challenge toujours au bon niveau, avec une vraie vision business. Il apporte une valeur concr\u00e8te aussi bien sur le commercial, l\u2019op\u00e9rationnel que les enjeux de croissance.',
    company: 'Vokse',
    who: 'Audine Pean',
    role: 'CEO',
    sector: 'SaaS',
    status: 'Early stage',
    logo: null,
    url: 'https://vokse.eu',
  },
  {
    q: 'Most advisors give you frameworks. Fabrice gave us real context on the European market and always pushed to open doors through the right introductions \u2014 he doesn\u2019t waste your time with anything else.',
    company: 'Symbiotic Security',
    who: 'Jerome Robert',
    role: 'CEO',
    sector: 'Cybersecurity \u00b7 NY',
    status: 'Seed',
    logo: null,
    url: 'https://symbioticsec.ai',
  },
  {
    q: 'Quote to come.',
    company: 'TwoWay',
    who: 'Chirine Bourgerie',
    role: 'CEO',
    sector: 'Fintech',
    status: '\u20ac1.5M raised',
    logo: null,
    url: 'https://twoway.finance',
    placeholder: true,
  },
  {
    q: 'Fabrice a tout du mentor parfait : une capacit\u00e9 \u00e0 challenger le statu quo, un v\u00e9cu d\u2019entrepreneur qu\u2019il met au service des fondateurs pour les aider \u00e0 prendre du recul, et une \u00e9coute pr\u00e9cieuse dans les moments difficiles.',
    company: 'WeatherMind.ai',
    who: 'Mehdi Gaaied',
    role: 'CEO',
    sector: 'AI \u00b7 Climate',
    status: 'Early stage',
    logo: null,
    url: null,
  },
  {
    q: 'J\u2019ai eu le plaisir de travailler avec Fabrice dans le cadre de l\u2019acc\u00e9l\u00e9rateur P58 de La Poste pour Circulae. Fabrice allie une excellente \u00e9coute \u00e0 une grande intelligence d\u2019analyse, avec une forte expertise des secteurs fintech et startup. Toujours disponible et de tr\u00e8s bon conseil, il apporte une vraie valeur strat\u00e9gique et humaine dans l\u2019accompagnement des projets.',
    company: 'Circulae',
    who: 'David Gascoin',
    role: 'CEO',
    sector: 'Climate \u00b7 Circular economy',
    status: '\u20ac550K raised',
    logo: null,
    url: 'https://circulae.com',
  },
  {
    q: 'Quote to come.',
    company: 'Uncovery',
    who: 'Adrien Petit',
    role: 'CEO',
    sector: 'Data \u00b7 Analytics',
    status: 'Acquired',
    logo: null,
    url: 'https://www.uncovery.io',
    placeholder: true,
  },
];

const monogram = (name) => {
  const parts = name.trim().split(/\s+/);
  if (parts.length >= 2) return (parts[0][0] + parts[1][0]).toUpperCase();
  return name.slice(0, 2).toUpperCase();
};

const LogoChip = ({ company, url }) => {
  const [stage, setStage] = React.useState(0);
  let domain = null;
  try { if (url) domain = new URL(url).hostname.replace(/^www\./, ''); } catch {}
  const sources = domain ? [
    'https://logo.clearbit.com/' + domain,
    'https://www.google.com/s2/favicons?domain=' + domain + '&sz=128',
  ] : [];
  if (!domain || stage >= sources.length) {
    return <span className="bp-logo-chip__mono">{monogram(company)}</span>;
  }
  return (
    <img
      src={sources[stage]}
      alt={company + ' logo'}
      loading="lazy"
      onError={() => setStage(stage + 1)}
    />
  );
};

const slotId = (company) => 'logo-' + (company || 'co').toLowerCase().replace(/[^a-z0-9]+/g, '-').replace(/^-|-$/g, '');

const Testimonials = ({ override, override2, override3, override4, override5, override6, override7, override8, override9, override10, override11, override12 }) => {
  const list = QUOTES.map((q, i) => {
    if (i === 0 && override) return { ...q, ...override };
    if (i === 1 && override2) return { ...q, ...override2 };
    if (i === 2 && override3) return { ...q, ...override3 };
    if (i === 3 && override4) return { ...q, ...override4 };
    if (i === 4 && override5) return { ...q, ...override5 };
    if (i === 5 && override6) return { ...q, ...override6 };
    if (i === 6 && override7) return { ...q, ...override7 };
    if (i === 7 && override8) return { ...q, ...override8 };
    if (i === 8 && override9) return { ...q, ...override9 };
    if (i === 9 && override10) return { ...q, ...override10 };
    if (i === 10 && override11) return { ...q, ...override11 };
    if (i === 11 && override12) return { ...q, ...override12 };
    return q;
  });
  return (
  <section className="bp-section" id="testimonials">
    <div className="bp-section__head">
      <span className="bp-eyebrow">{useT().testimonials.eyebrow}</span>
      <h2 className="bp-section__title">{useT().testimonials.title}</h2>
    </div>
    <div className="bp-testimonials">
      {list.map((t, i) => (
        <figure key={i} className={"bp-testimonial " + (t.placeholder ? "is-placeholder" : "")}>
          <header className="bp-testimonial__head">
            <div className="bp-testimonial__head-row">
              {t.url ? (
                <a className="bp-logo-chip bp-logo-chip--link" href={t.url} target="_blank" rel="noopener" aria-label={t.company + ' website'}>
                  <LogoChip company={t.company} url={t.url} />
                </a>
              ) : (
                <div className="bp-logo-chip">
                  <LogoChip company={t.company} url={t.url} />
                </div>
              )}
              <div className="bp-testimonial__co">
                <div className="bp-testimonial__company">{t.company}</div>
                <div className="bp-testimonial__sector">{t.sector}</div>
              </div>
            </div>
            <div className="bp-testimonial__tags">
              {String(t.status || '').split(/\s+[\u2014\-\u00b7]\s+/).filter(Boolean).map((s, j) => {
                const isHighlight = /acquired|acquis|ipo|sold|exit/i.test(s);
                return (
                  <span key={j} className={"bp-tag bp-tag--status " + (isHighlight ? 'bp-tag--accent' : '')}>{s}</span>
                );
              })}
            </div>
          </header>
          <blockquote className="bp-testimonial__q">
            <span className="bp-testimonial__mark">&ldquo;</span>{t.q}<span className="bp-testimonial__mark">&rdquo;</span>
          </blockquote>
          <figcaption className="bp-testimonial__cap">
            <div className="bp-testimonial__who" data-comment-anchor="cc-2">{t.who}, {t.role}</div>
          </figcaption>
        </figure>
      ))}
    </div>
  </section>
  );
};
window.Testimonials = Testimonials;
