// Réglages d'entreprise (émetteur) — identité, facturation électronique (BT-34),
// adresse, mentions légales (capital, RCS), régime de TVA, séries de numérotation.
// Champs BLOQUANTS à l'enregistrement : raison sociale, SIREN (9), SIRET (14,
// cohérent SIREN), courriel vendeur, adresse + pays, TVA intra hors franchise. Le format de série n'est PAS figé —
// « à confirmer (expert-comptable) », en attente de revue comptable.
// window.OryzeShared.CompanySettings
(function () {
  const { Input, Select, Button, SegmentedControl } = window.OryzeDesignSystem_78c60a;
  const Ic = window.OryzeIcons;

  const kick = { fontFamily: "var(--font-mono)", fontSize: 10.5, letterSpacing: "0.08em", textTransform: "uppercase", color: "var(--text-muted)" };
  const err = { fontSize: 12.5, color: "var(--fin-negative)", fontWeight: 600, marginTop: 6 };
  const help = { fontSize: 12, color: "var(--text-subtle)", marginTop: 6, lineHeight: 1.45 };

  const LEGAL_FORMS = ["EI", "EURL", "SARL", "SASU", "SAS", "SA"].map((v) => ({ value: v, label: v }));
  const REGIMES = [
    { value: "franchise", label: "Franchise en base", note: "TVA non applicable, art. 293 B du CGI — la mention sera portée sur les factures." },
    { value: "simplifie", label: "Réel simplifié", note: "Déclaration annuelle CA12 + acomptes semestriels." },
    { value: "normal", label: "Réel normal", note: "Déclaration CA3 mensuelle ou trimestrielle." },
  ];

  function Section({ title, first = false, children }) {
    return (
      <div style={{ display: "flex", flexDirection: "column", gap: 12, paddingTop: first ? 0 : 18, borderTop: first ? "none" : "var(--border-hair) solid var(--line-divider)" }}>
        <div style={kick}>{title}</div>
        {children}
      </div>
    );
  }

  function CompanySettings({ onClose, embedded = false, compact = false }) {
    const S = window.OryzeSeller;
    const [name, setName] = React.useState(S.name);
    const [legalForm, setLegalForm] = React.useState(S.legalForm || "SASU");
    const [siren, setSiren] = React.useState(S.siren);
    const [siret, setSiret] = React.useState(S.siret || "");
    const [tvaIntra, setTvaIntra] = React.useState(S.tvaIntra || "");
    const [email, setEmail] = React.useState(S.email || "");
    const [street, setStreet] = React.useState(S.street || "");
    const [zip, setZip] = React.useState(S.zip || "");
    const [city, setCity] = React.useState(S.city || "");
    const [country, setCountry] = React.useState(S.country || "FR");
    const [capital, setCapital] = React.useState(S.capital || "");
    const [rcs, setRcs] = React.useState(S.rcs || "");
    const [regime, setRegime] = React.useState(S.vatRegime || "simplifie");
    const [serieFormats, setSerieFormats] = React.useState({});
    const [errors, setErrors] = React.useState({});
    const [saved, setSaved] = React.useState(false);

    const regimeNote = (REGIMES.find((r) => r.value === regime) || {}).note;

    function validate() {
      const e = {};
      if (!name.trim()) e.name = "La raison sociale est requise.";
      if (siren.replace(/\D/g, "").length !== 9) e.siren = "SIREN invalide — 9 chiffres (mention 2026).";
      if (siret.replace(/\D/g, "").length !== 14) e.siret = "SIRET invalide — 14 chiffres (siège).";
      else if (siren.replace(/\D/g, "").length === 9 && !siret.replace(/\D/g, "").startsWith(siren.replace(/\D/g, ""))) e.siret = "Incohérent — le SIRET du siège commence par le SIREN.";
      if (regime !== "franchise" && !tvaIntra.trim()) e.tvaIntra = "Requis hors franchise en base (mention 2026).";
      if (!email.trim()) e.email = "Adresse électronique vendeur requise (BT-34) — elle bloque la finalisation de toute facture.";
      else if (!/^[^\s@]+@[^\s@]+\.[^\s@]+$/.test(email.trim())) e.email = "Format de courriel invalide.";
      if (!street.trim() || !zip.trim() || !city.trim()) e.address = "Adresse postale complète requise — rue, code postal et ville.";
      if (!country) e.address = e.address || "Le pays est requis.";
      return e;
    }

    function save() {
      const e = validate();
      setErrors(e);
      if (Object.keys(e).length) return;
      Object.assign(S, {
        name: name.trim(), legalForm, siren: siren.trim(), siret: siret.trim(),
        tvaIntra: tvaIntra.trim(), email: email.trim(),
        street: street.trim(), zip: zip.trim(), city: city.trim(), country,
        address: street.trim() + ", " + zip.trim() + " " + city.trim(),
        capital: capital.trim(), rcs: rcs.trim(), vatRegime: regime,
      });
      setSaved(true);
      setTimeout(() => { if (embedded) setSaved(false); else onClose && onClose(); }, 1200);
    }

    if (saved) {
      return (
        <div style={{ display: "flex", flexDirection: "column", alignItems: "center", gap: 12, padding: "34px 0 26px", textAlign: "center" }}>
          <span style={{ width: 44, height: 44, display: "flex", alignItems: "center", justifyContent: "center", background: "var(--oryze-mint)", border: "var(--border-key) solid var(--line-keyline)", borderRadius: "var(--radius-md)", color: "var(--oryze-mint-ink)" }}>
            <Ic.check size={22} />
          </span>
          <div style={{ fontWeight: 700, fontSize: 19, letterSpacing: "-0.02em" }}>Réglages enregistrés</div>
          <div style={{ fontSize: 13.5, color: "var(--text-muted)", maxWidth: 380, lineHeight: 1.5 }}>
            Ces informations alimentent l'en-tête, les mentions légales et le profil Factur-X de chaque facture.
          </div>
        </div>
      );
    }

    return (
      <div style={{ display: "flex", flexDirection: "column", gap: 18 }}>
        {/* Identité */}
        <Section title="Identité" first>
          <div style={{ display: "grid", gridTemplateColumns: compact ? "1fr" : "minmax(0,1fr) 130px", gap: 12 }}>
            <Input label="Raison sociale *" value={name} onChange={(e) => setName(e.target.value)} error={errors.name || null} />
            <Select label="Forme juridique" value={legalForm} onChange={(e) => setLegalForm(e.target.value)} options={LEGAL_FORMS} />
          </div>
          <div style={{ display: "grid", gridTemplateColumns: compact ? "1fr" : "minmax(0,1fr) minmax(0,1.3fr)", gap: 12 }}>
            <Input label="SIREN *" value={siren} onChange={(e) => setSiren(e.target.value)} mono placeholder="912 480 335" error={errors.siren || null} />
            <Input label="SIRET (siège) *" value={siret} onChange={(e) => setSiret(e.target.value)} mono placeholder="912 480 335 00017" error={errors.siret || null} />
          </div>
        </Section>

        {/* Facturation électronique */}
        <Section title="Facturation électronique">
          <div>
            <Input label="Adresse électronique vendeur *" type="email" value={email} onChange={(e) => setEmail(e.target.value)} mono
              iconLeft={<Ic.mail size={17} />} placeholder="facturation@exemple.fr" error={errors.email || null} />
            {!errors.email && <div style={help}>BT-34 — obligatoire : sans elle, aucune facture ne peut être finalisée.</div>}
          </div>
          <div>
            <Input label="N° TVA intracommunautaire" value={tvaIntra} onChange={(e) => setTvaIntra(e.target.value)} mono placeholder="FR 42 912480335" error={errors.tvaIntra || null} />
            {!errors.tvaIntra && <div style={help}>Requis, sauf franchise en base.</div>}
          </div>
        </Section>

        {/* Adresse */}
        <Section title="Adresse du siège">
          <Input label="Adresse postale *" value={street} onChange={(e) => setStreet(e.target.value)} placeholder="N° et rue" />
          {compact ? (
            <React.Fragment>
              <div style={{ display: "grid", gridTemplateColumns: "110px minmax(0,1fr)", gap: 10 }}>
                <Input label="Code postal" value={zip} onChange={(e) => setZip(e.target.value)} mono />
                <Input label="Ville" value={city} onChange={(e) => setCity(e.target.value)} />
              </div>
              <Select label="Pays *" value={country} onChange={(e) => setCountry(e.target.value)} options={window.OryzeCountries} />
            </React.Fragment>
          ) : (
            <div style={{ display: "grid", gridTemplateColumns: "130px minmax(0,1fr) 160px", gap: 10 }}>
              <Input label="Code postal" value={zip} onChange={(e) => setZip(e.target.value)} mono />
              <Input label="Ville" value={city} onChange={(e) => setCity(e.target.value)} />
              <Select label="Pays *" value={country} onChange={(e) => setCountry(e.target.value)} options={window.OryzeCountries} />
            </div>
          )}
          {errors.address && <div style={err}>{errors.address}</div>}
        </Section>

        {/* Mentions légales facture */}
        <Section title="Mentions légales">
          <div style={{ display: "grid", gridTemplateColumns: compact ? "minmax(0,1fr)" : "160px minmax(0,1fr)", gap: 12 }}>
            <Input label="Capital social" value={capital} onChange={(e) => setCapital(e.target.value)} mono suffix="€" />
            <Input label="RCS" value={rcs} onChange={(e) => setRcs(e.target.value)} placeholder="RCS Lyon 912 480 335" />
          </div>
          <div style={{ ...help, marginTop: 0 }}>Portées en pied de facture avec la forme juridique.</div>
        </Section>

        {/* Régime de TVA */}
        <Section title="Régime de TVA">
          <SegmentedControl value={regime} onChange={setRegime} size={compact ? "sm" : "md"} fullWidth={compact} options={REGIMES.map((r) => ({ value: r.value, label: r.label }))} />
          {regimeNote && <div style={{ ...help, marginTop: 0 }}>{regimeNote}</div>}
        </Section>

        {/* Numérotation — format NON figé */}
        <Section title="Séries de numérotation">
          <div style={{ display: "flex", alignItems: "center", gap: 8, padding: "8px 12px", background: "var(--oryze-butter)", border: "var(--border-thin) solid var(--line-keyline)", borderRadius: "var(--radius-md)" }}>
            <Ic.alert size={15} style={{ color: "var(--oryze-butter-ink)", flex: "none" }} />
            <span style={{ fontSize: 12.5, color: "var(--oryze-butter-ink)", fontWeight: 600 }}>Format à confirmer (expert-comptable) — aucune règle de série n'est figée.</span>
          </div>
          {window.OryzeInvoiceSeries.map((s) => compact ? (
            <div key={s.value} style={{ display: "flex", flexDirection: "column", gap: 6 }}>
              <div style={{ display: "flex", justifyContent: "space-between", alignItems: "baseline", gap: 10 }}>
                <div style={{ fontSize: 13.5, fontWeight: 600 }}>{s.label.split(" · ")[0]}</div>
                <div style={{ fontFamily: "var(--font-mono)", fontSize: 12, color: "var(--text-muted)", whiteSpace: "nowrap" }}>
                  prochain : {s.prefix}-{s.next}
                </div>
              </div>
              <Input aria-label={"Format " + s.label} value={serieFormats[s.value] || ""} mono placeholder="FA-2026-00042"
                onChange={(e) => setSerieFormats((f) => ({ ...f, [s.value]: e.target.value }))} />
            </div>
          ) : (
            <div key={s.value} style={{ display: "grid", gridTemplateColumns: "110px minmax(0,1fr) 150px", gap: 10, alignItems: "center" }}>
              <div style={{ fontSize: 13.5, fontWeight: 600 }}>{s.label.split(" · ")[0]}</div>
              <Input aria-label={"Format " + s.label} value={serieFormats[s.value] || ""} mono placeholder="FA-2026-00042"
                onChange={(e) => setSerieFormats((f) => ({ ...f, [s.value]: e.target.value }))} />
              <div style={{ fontFamily: "var(--font-mono)", fontSize: 12, color: "var(--text-muted)", textAlign: "right", whiteSpace: "nowrap" }}>
                prochain : {s.prefix}-{s.next}
              </div>
            </div>
          ))}
          <div style={{ ...help, marginTop: 0 }}>Le numéro est attribué à la finalisation — jamais affiché sur un brouillon.</div>
        </Section>

        {/* Actions */}
        <div style={{ display: "flex", gap: 10, alignItems: "center", paddingTop: 4, borderTop: "var(--border-hair) solid var(--line-divider)" }}>
          {!embedded && <Button variant="ghost" size="md" onClick={() => onClose && onClose()} style={{ flex: "none" }}>Annuler</Button>}
          <div style={{ flex: 1, fontSize: 11.5, color: "var(--text-subtle)" }}>* requis à l'enregistrement</div>
          <Button size="md" iconLeft={<Ic.check size={15} />} onClick={save}>Enregistrer</Button>
        </div>
      </div>
    );
  }

  window.OryzeShared = window.OryzeShared || {};
  window.OryzeShared.CompanySettings = CompanySettings;
})();
