/* screen_comercial_bp_studio.jsx — BP Studio
   Edição de objectivos de performance por segmento/modelo/mês
   Dados: tabela bp_objectivos via /api/bp/*
*/

const BP_MESES = ['Jan','Fev','Mar','Abr','Mai','Jun','Jul','Ago','Set','Out','Nov','Dez'];

const BP_SEGS_MIMAKI = [
  { id: 'SG', label: 'Sign & Graphics' },
  { id: 'CP', label: 'Cutting Plotters' },
  { id: 'IP', label: 'Inkjet Print' },
  { id: 'TA', label: 'Têxtil' },
  { id: '3D', label: '3D' },
];
const BP_SEGS_MEDIA = [
  { id: 'DECAL',  label: 'Decal' },
  { id: 'BIOND',  label: 'Biond' },
  { id: 'OUTROS', label: 'Outros' },
];

const BP_EMPRESAS = [
  { id: 'PTDIG',  label: 'Portugal (PTDIG)' },
  { id: 'DIGES',  label: 'Espanha (DIGES)' },
  { id: 'IBERIA', label: 'Ibéria (total)' },
];

function bpCanEdit(userTipo) {
  return ['ceo','board','superadmin','admin'].includes(userTipo);
}

// ── Hook: versões ─────────────────────────────────────────────────────────────
function useBpVersoes(fy) {
  const [versoes, setVersoes] = React.useState([]);
  const [loading, setLoading] = React.useState(false);
  const load = React.useCallback(() => {
    setLoading(true);
    fetch(`/api/bp/versoes?fy=${fy}`)
      .then(r => r.json())
      .then(rows => { setVersoes(Array.isArray(rows) ? rows : []); setLoading(false); })
      .catch(() => setLoading(false));
  }, [fy]);
  React.useEffect(() => { load(); }, [load]);
  return { versoes, loading, reload: load };
}

// ── Hook: objectivos ──────────────────────────────────────────────────────────
function useBpObjectivos(versaoId, empresa) {
  const [rows, setRows] = React.useState([]);
  const [loading, setLoading] = React.useState(false);
  React.useEffect(() => {
    if (!versaoId || !empresa) { setRows([]); return; }
    setLoading(true);
    fetch(`/api/bp/objectivos?versao_id=${versaoId}&empresa=${empresa}`)
      .then(r => r.json())
      .then(data => { setRows(Array.isArray(data) ? data : []); setLoading(false); })
      .catch(() => setLoading(false));
  }, [versaoId, empresa]);
  return { rows, loading };
}

// ── Grelha editável por segmento ──────────────────────────────────────────────
const BpGrid = ({ rows, seg, canEdit, versaoId, empresa, onSaved }) => {
  // edits: key "modelo|mes" → qty
  const [edits, setEdits] = React.useState({});
  const [saving, setSaving] = React.useState(false);
  const [msg, setMsg] = React.useState(null);

  // Reset edits when rows/seg change
  React.useEffect(() => { setEdits({}); setMsg(null); }, [rows, seg, versaoId, empresa]);

  // Filter rows by segmento
  const segRows = rows.filter(r => r.segmento === seg);

  // Build grid: modelo → {1:qty, 2:qty, ...}
  const modelos = [...new Set(segRows.map(r => r.modelo))].sort();
  const base = {};
  segRows.forEach(r => {
    if (!base[r.modelo]) base[r.modelo] = {};
    base[r.modelo][r.mes] = parseFloat(r.qty) || 0;
  });

  function getQty(modelo, mes) {
    const k = `${modelo}|${mes}`;
    if (k in edits) return edits[k];
    return base[modelo]?.[mes] ?? 0;
  }

  function handleChange(modelo, mes, val) {
    const k = `${modelo}|${mes}`;
    const num = val === '' ? 0 : parseFloat(val);
    setEdits(prev => ({ ...prev, [k]: isNaN(num) ? 0 : num }));
  }

  function hasChanges() { return Object.keys(edits).length > 0; }

  async function handleSave() {
    setSaving(true); setMsg(null);
    const cells = Object.entries(edits).map(([k, qty]) => {
      const [modelo, mes] = k.split('|');
      return { modelo, mes: parseInt(mes), qty };
    });
    try {
      const r = await fetch('/api/bp/objectivos', {
        method: 'PUT',
        headers: { 'Content-Type': 'application/json' },
        body: JSON.stringify({ versao_id: versaoId, empresa, seg, cells }),
      });
      const d = await r.json();
      if (!r.ok) throw new Error(d.error || 'Erro ao guardar');
      setMsg({ ok: true, text: `Guardado — ${d.updated} células actualizadas` });
      setEdits({});
      if (onSaved) onSaved();
    } catch (e) {
      setMsg({ ok: false, text: e.message });
    } finally { setSaving(false); }
  }

  const thSt = { padding: '6px 8px', fontSize: 10, fontWeight: 700, color: 'var(--dgd-fg-3,#6b7280)', textTransform: 'uppercase', letterSpacing: '0.06em', borderBottom: '2px solid var(--dgd-border-1,#e5e7eb)', textAlign: 'center', background: 'var(--dgd-bg-card,white)', position: 'sticky', top: 0, zIndex: 1 };
  const tdSt = { padding: '4px 2px', textAlign: 'center', borderBottom: '1px solid var(--dgd-border-1,#f3f4f6)' };
  const inputSt = { width: 36, textAlign: 'center', fontSize: 12, border: '1px solid transparent', borderRadius: 4, padding: '2px 2px', background: 'transparent', color: 'var(--dgd-fg-1,#111)', outline: 'none' };
  const inputFocusSt = { border: '1px solid var(--dgd-accent,#3b82f6)', background: 'white' };

  if (modelos.length === 0) return (
    <div style={{ padding: '32px', textAlign: 'center', color: 'var(--dgd-fg-3,#9ca3af)', fontSize: 13 }}>
      Sem dados para este segmento nesta versão.
    </div>
  );

  return (
    <div>
      {/* Tabela */}
      <div style={{ overflowX: 'auto' }}>
        <table style={{ width: '100%', borderCollapse: 'collapse', fontSize: 12 }}>
          <thead>
            <tr>
              <th style={{ ...thSt, textAlign: 'left', minWidth: 140, position: 'sticky', left: 0, zIndex: 2 }}>Modelo</th>
              {BP_MESES.map((m, i) => <th key={i} style={thSt}>{m}</th>)}
              <th style={{ ...thSt, color: 'var(--dgd-fg-1,#111)' }}>Total</th>
            </tr>
          </thead>
          <tbody>
            {modelos.map(modelo => {
              const total = BP_MESES.reduce((s, _, i) => s + (getQty(modelo, i + 1) || 0), 0);
              const hasEdit = BP_MESES.some((_, i) => `${modelo}|${i+1}` in edits);
              return (
                <tr key={modelo} style={{ background: hasEdit ? 'oklch(0.97 0.02 250)' : 'transparent' }}>
                  <td style={{ ...tdSt, textAlign: 'left', padding: '4px 8px', fontWeight: 600, color: 'var(--dgd-fg-2,#374151)', position: 'sticky', left: 0, background: hasEdit ? 'oklch(0.97 0.02 250)' : 'var(--dgd-bg-card,white)', zIndex: 1 }}>
                    {modelo}
                  </td>
                  {BP_MESES.map((_, i) => {
                    const mes = i + 1;
                    const qty = getQty(modelo, mes);
                    const edited = `${modelo}|${mes}` in edits;
                    return (
                      <td key={mes} style={{ ...tdSt, background: edited ? 'oklch(0.95 0.04 250)' : 'transparent' }}>
                        {canEdit ? (
                          <input
                            type="number"
                            min="0"
                            step="0.5"
                            value={qty || ''}
                            placeholder="—"
                            style={{ ...inputSt, ...(edited ? inputFocusSt : {}) }}
                            onChange={e => handleChange(modelo, mes, e.target.value)}
                            onFocus={e => { e.target.style.border = '1px solid var(--dgd-accent,#3b82f6)'; e.target.style.background = 'white'; }}
                            onBlur={e => { if (!edited) { e.target.style.border = '1px solid transparent'; e.target.style.background = 'transparent'; } }}
                          />
                        ) : (
                          <span style={{ fontSize: 12, color: qty ? 'var(--dgd-fg-1,#111)' : 'var(--dgd-fg-3,#d1d5db)' }}>
                            {qty || '—'}
                          </span>
                        )}
                      </td>
                    );
                  })}
                  <td style={{ ...tdSt, fontWeight: 700, color: 'var(--dgd-fg-1,#111)', fontSize: 13 }}>
                    {total % 1 === 0 ? total : total.toFixed(1)}
                  </td>
                </tr>
              );
            })}
            {/* Totais */}
            <tr style={{ background: 'var(--dgd-bg-sunken,#f3f4f6)', fontWeight: 700 }}>
              <td style={{ ...tdSt, textAlign: 'left', padding: '6px 8px', fontSize: 11, color: 'var(--dgd-fg-3,#6b7280)', textTransform: 'uppercase', letterSpacing: '0.06em', position: 'sticky', left: 0, background: 'var(--dgd-bg-sunken,#f3f4f6)', zIndex: 1 }}>
                TOTAL {seg}
              </td>
              {BP_MESES.map((_, i) => {
                const mes = i + 1;
                const t = modelos.reduce((s, m) => s + (getQty(m, mes) || 0), 0);
                return (
                  <td key={mes} style={{ ...tdSt, fontWeight: 700, color: 'var(--dgd-fg-1,#111)' }}>
                    {t % 1 === 0 ? (t || '') : t.toFixed(1)}
                  </td>
                );
              })}
              <td style={{ ...tdSt, fontWeight: 800, color: 'var(--dgd-fg-1,#111)', fontSize: 14 }}>
                {(() => { const t = modelos.reduce((s, m) => s + BP_MESES.reduce((s2, _, i) => s2 + (getQty(m, i+1)||0), 0), 0); return t % 1 === 0 ? t : t.toFixed(1); })()}
              </td>
            </tr>
          </tbody>
        </table>
      </div>

      {/* Footer */}
      {canEdit && (
        <div style={{ display: 'flex', alignItems: 'center', gap: 10, marginTop: 12, paddingTop: 12, borderTop: '1px solid var(--dgd-border-1,#e5e7eb)' }}>
          <button
            onClick={handleSave}
            disabled={!hasChanges() || saving}
            style={{
              padding: '7px 18px', borderRadius: 6, border: 'none',
              background: hasChanges() ? 'var(--dgd-fg-1,#111)' : 'var(--dgd-border-1,#e5e7eb)',
              color: hasChanges() ? 'white' : 'var(--dgd-fg-3,#9ca3af)',
              fontSize: 12, fontWeight: 600, cursor: hasChanges() && !saving ? 'pointer' : 'default',
            }}
          >
            {saving ? 'A guardar...' : `Guardar alterações${hasChanges() ? ` (${Object.keys(edits).length})` : ''}`}
          </button>
          {hasChanges() && (
            <button
              onClick={() => { setEdits({}); setMsg(null); }}
              style={{ padding: '7px 12px', borderRadius: 6, border: '1px solid var(--dgd-border-1,#e5e7eb)', background: 'white', fontSize: 12, cursor: 'pointer', color: 'var(--dgd-fg-3,#6b7280)' }}
            >
              Cancelar
            </button>
          )}
          {msg && (
            <span style={{ fontSize: 12, color: msg.ok ? '#16a34a' : '#dc2626', fontWeight: 500 }}>
              {msg.ok ? '✓ ' : '✗ '}{msg.text}
            </span>
          )}
        </div>
      )}
    </div>
  );
};

// ── Painel de versões ─────────────────────────────────────────────────────────
const BpVersoesPainel = ({ versoes, versaoId, setVersaoId, fy, canEdit, onReload }) => {
  const [novaNome, setNovaNome] = React.useState('');
  const [criando, setCriando] = React.useState(false);
  const [ativando, setAtivando] = React.useState(false);
  const [showForm, setShowForm] = React.useState(false);

  async function handleCriar() {
    if (!novaNome.trim()) return;
    setCriando(true);
    const r = await fetch('/api/bp/versoes', {
      method: 'POST', headers: { 'Content-Type': 'application/json' },
      body: JSON.stringify({ fy, nome: novaNome.trim() }),
    });
    const d = await r.json();
    setCriando(false);
    if (r.ok) { setNovaNome(''); setShowForm(false); onReload(); }
  }

  async function handleAtivar(id) {
    setAtivando(true);
    await fetch(`/api/bp/versoes/${id}/activate`, { method: 'PUT' });
    setAtivando(false);
    setVersaoId(id);
    onReload();
  }

  const versaoAtual = versoes.find(v => v.id === versaoId);

  return (
    <div style={{ display: 'flex', alignItems: 'center', gap: 8, flexWrap: 'wrap' }}>
      <span style={{ fontSize: 11, color: 'var(--dgd-fg-3,#6b7280)', fontWeight: 600 }}>Versão:</span>
      <select
        value={versaoId || ''}
        onChange={e => setVersaoId(parseInt(e.target.value))}
        style={{ fontSize: 12, padding: '4px 8px', borderRadius: 6, border: '1px solid var(--dgd-border-1,#e5e7eb)', background: 'var(--dgd-bg-card,white)' }}
      >
        {versoes.map(v => (
          <option key={v.id} value={v.id}>{v.nome}{v.ativo ? ' ★' : ''}</option>
        ))}
      </select>
      {versaoAtual && !versaoAtual.ativo && canEdit && (
        <button
          onClick={() => handleAtivar(versaoId)}
          disabled={ativando}
          style={{ padding: '4px 10px', borderRadius: 6, border: '1px solid #16a34a', background: 'white', color: '#16a34a', fontSize: 11, fontWeight: 600, cursor: 'pointer' }}
        >
          {ativando ? '...' : 'Activar esta'}
        </button>
      )}
      {versaoAtual?.ativo && (
        <span style={{ fontSize: 10, background: '#dcfce7', color: '#16a34a', padding: '2px 8px', borderRadius: 20, fontWeight: 700 }}>ACTIVA</span>
      )}
      {canEdit && !showForm && (
        <button
          onClick={() => setShowForm(true)}
          style={{ padding: '4px 10px', borderRadius: 6, border: '1px solid var(--dgd-border-1,#e5e7eb)', background: 'white', fontSize: 11, cursor: 'pointer', color: 'var(--dgd-fg-2,#374151)' }}
        >
          + Nova versão
        </button>
      )}
      {showForm && (
        <div style={{ display: 'flex', gap: 4, alignItems: 'center' }}>
          <input
            value={novaNome}
            onChange={e => setNovaNome(e.target.value)}
            placeholder="Nome da versão"
            style={{ fontSize: 12, padding: '4px 8px', borderRadius: 6, border: '1px solid var(--dgd-border-1,#e5e7eb)', width: 160 }}
            onKeyDown={e => e.key === 'Enter' && handleCriar()}
          />
          <button onClick={handleCriar} disabled={criando || !novaNome.trim()} style={{ padding: '4px 10px', borderRadius: 6, border: 'none', background: 'var(--dgd-fg-1,#111)', color: 'white', fontSize: 11, cursor: 'pointer' }}>
            {criando ? '...' : 'Criar'}
          </button>
          <button onClick={() => { setShowForm(false); setNovaNome(''); }} style={{ padding: '4px 8px', borderRadius: 6, border: '1px solid var(--dgd-border-1,#e5e7eb)', background: 'white', fontSize: 11, cursor: 'pointer', color: 'var(--dgd-fg-3,#6b7280)' }}>
            ✕
          </button>
        </div>
      )}
    </div>
  );
};

// ── Componente principal ──────────────────────────────────────────────────────
const ScreenBPStudio = ({ user, userTipo }) => {
  const canEdit = bpCanEdit(userTipo || '');
  const [fy,      setFy]      = React.useState(26);
  const [empresa, setEmpresa] = React.useState('PTDIG');
  const [tipo,    setTipo]    = React.useState('mimaki');
  const [seg,     setSeg]     = React.useState('SG');

  const { versoes, loading: vLoading, reload: reloadVersoes } = useBpVersoes(fy);
  const versaoAtiva = versoes.find(v => v.ativo);
  const [versaoId, setVersaoId] = React.useState(null);

  // Inicializar versaoId quando versões carregam
  React.useEffect(() => {
    if (versoes.length && !versaoId) {
      const ativa = versoes.find(v => v.ativo);
      setVersaoId(ativa?.id || versoes[0]?.id || null);
    }
  }, [versoes]);

  // Reset seg quando tipo muda
  React.useEffect(() => {
    setSeg(tipo === 'media' ? 'DECAL' : 'SG');
  }, [tipo]);

  const { rows, loading: rLoading } = useBpObjectivos(versaoId, empresa);

  const activeSegs = tipo === 'media' ? BP_SEGS_MEDIA : BP_SEGS_MIMAKI;

  const btnTogSt = (active) => ({
    padding: '4px 12px', borderRadius: 6, border: 'none', cursor: 'pointer', fontSize: 12, fontWeight: active ? 700 : 400,
    background: active ? 'var(--dgd-fg-1,#111)' : 'transparent',
    color: active ? 'white' : 'var(--dgd-fg-3,#6b7280)',
  });

  return (
    <div style={{ padding: 20, display: 'flex', flexDirection: 'column', gap: 14, maxWidth: 1200 }}>

      {/* Header */}
      <div>
        <div style={{ fontSize: 10, color: 'var(--dgd-fg-3,#6b7280)', fontFamily: 'monospace', letterSpacing: '0.08em', marginBottom: 4 }}>
          COMERCIAL · BP STUDIO
        </div>
        <h2 style={{ margin: 0, fontSize: 22, fontWeight: 800, color: 'var(--dgd-fg-1,#111)' }}>Objectivos de Performance</h2>
        {!canEdit && (
          <div style={{ marginTop: 6, fontSize: 12, color: '#92400e', background: '#fef3c7', border: '1px solid #fcd34d', borderRadius: 6, padding: '6px 12px', display: 'inline-block' }}>
            Modo leitura — edição requer acesso CEO/Board
          </div>
        )}
      </div>

      {/* Controlos */}
      <div style={{ background: 'var(--dgd-bg-card,white)', border: '1px solid var(--dgd-border-1,#e5e7eb)', borderRadius: 10, padding: '12px 16px', display: 'flex', flexWrap: 'wrap', gap: 16, alignItems: 'center' }}>

        {/* FY */}
        <div style={{ display: 'flex', alignItems: 'center', gap: 6 }}>
          <span style={{ fontSize: 11, color: 'var(--dgd-fg-3,#6b7280)', fontWeight: 600 }}>FY:</span>
          <div style={{ display: 'flex', background: 'var(--dgd-border-1,#e5e7eb)', borderRadius: 6, padding: 2, gap: 2 }}>
            {[25, 26].map(f => (
              <button key={f} onClick={() => { setFy(f); setVersaoId(null); }} style={{
                padding: '3px 10px', borderRadius: 4, border: 'none', cursor: 'pointer', fontSize: 11, fontWeight: fy === f ? 700 : 400,
                background: fy === f ? 'white' : 'transparent', color: fy === f ? 'var(--dgd-fg-1,#111)' : 'var(--dgd-fg-3,#6b7280)',
                boxShadow: fy === f ? '0 1px 3px rgba(0,0,0,0.10)' : 'none',
              }}>FY{f}</button>
            ))}
          </div>
        </div>

        {/* Empresa */}
        <div style={{ display: 'flex', alignItems: 'center', gap: 6 }}>
          <span style={{ fontSize: 11, color: 'var(--dgd-fg-3,#6b7280)', fontWeight: 600 }}>Empresa:</span>
          <select
            value={empresa}
            onChange={e => setEmpresa(e.target.value)}
            style={{ fontSize: 12, padding: '4px 8px', borderRadius: 6, border: '1px solid var(--dgd-border-1,#e5e7eb)', background: 'var(--dgd-bg-card,white)' }}
          >
            {BP_EMPRESAS.map(e => <option key={e.id} value={e.id}>{e.label}</option>)}
          </select>
        </div>

        {/* Versão */}
        {vLoading ? <span style={{ fontSize: 12, color: 'var(--dgd-fg-3,#9ca3af)' }}>A carregar versões...</span> : (
          <BpVersoesPainel
            versoes={versoes}
            versaoId={versaoId}
            setVersaoId={setVersaoId}
            fy={fy}
            canEdit={canEdit}
            onReload={reloadVersoes}
          />
        )}
      </div>

      {/* Tipo tabs */}
      <div style={{ display: 'flex', gap: 4, background: 'var(--dgd-border-1,#e5e7eb)', borderRadius: 8, padding: 3, width: 'fit-content' }}>
        <button onClick={() => setTipo('mimaki')} style={btnTogSt(tipo === 'mimaki')}>Mimaki</button>
        <button onClick={() => setTipo('media')}  style={btnTogSt(tipo === 'media')}>Media</button>
      </div>

      {/* Segmentos */}
      <div style={{ display: 'flex', gap: 6, flexWrap: 'wrap' }}>
        {activeSegs.map(s => (
          <button
            key={s.id}
            onClick={() => setSeg(s.id)}
            style={{
              padding: '5px 14px', borderRadius: 20, fontSize: 12,
              border: '1px solid var(--dgd-border-1,#e5e7eb)',
              background: seg === s.id ? 'var(--dgd-fg-1,#111)' : 'var(--dgd-bg-card,white)',
              color: seg === s.id ? 'white' : 'var(--dgd-fg-2,#374151)',
              cursor: 'pointer', fontWeight: seg === s.id ? 700 : 400,
            }}
          >{s.id} — {s.label}</button>
        ))}
      </div>

      {/* Grelha */}
      <div style={{ background: 'var(--dgd-bg-card,white)', border: '1px solid var(--dgd-border-1,#e5e7eb)', borderRadius: 10, padding: 16 }}>
        <div style={{ fontSize: 11, fontWeight: 700, color: 'var(--dgd-fg-3,#6b7280)', textTransform: 'uppercase', letterSpacing: '0.08em', marginBottom: 12 }}>
          {seg} — {activeSegs.find(s => s.id === seg)?.label} · {BP_EMPRESAS.find(e => e.id === empresa)?.label} · FY{fy}
          {versoes.find(v => v.id === versaoId)?.nome ? ` · ${versoes.find(v => v.id === versaoId).nome}` : ''}
        </div>
        {rLoading ? (
          <div style={{ padding: '32px', textAlign: 'center', color: 'var(--dgd-fg-3,#9ca3af)', fontSize: 13 }}>A carregar...</div>
        ) : !versaoId ? (
          <div style={{ padding: '32px', textAlign: 'center', color: 'var(--dgd-fg-3,#9ca3af)', fontSize: 13 }}>Selecciona uma versão.</div>
        ) : (
          <BpGrid
            rows={rows}
            seg={seg}
            canEdit={canEdit}
            versaoId={versaoId}
            empresa={empresa}
            onSaved={() => {}}
          />
        )}
      </div>

    </div>
  );
};

window.ScreenBPStudio = ScreenBPStudio;
