/* ============================================================
   ANÁLISIS DE RIESGOS — detector preventivo de riesgos fiscales
   Additive: usa el perfil RGPD existente + callLexly. Cacheado.
   ============================================================ */

const RISK_SYSTEM = 'Eres un experto en fiscalidad española que realiza un análisis preventivo de riesgos. A partir de la información del usuario, identifica posibles riesgos o puntos de atención en su situación fiscal, clasificados por nivel (alto, medio, bajo). Para cada riesgo explica: qué es, por qué podría ser un problema, y qué puede hacer para revisarlo o solucionarlo. Sé riguroso y prudente: señala riesgos POSIBLES, nunca afirmes con certeza que algo está mal sin conocer todos los detalles. Recuerda siempre que es un análisis orientativo y que para confirmar y resolver cualquier riesgo debe consultar con un asesor fiscal o gestor. No generes alarma innecesaria; el objetivo es ayudar a prevenir, no asustar.';

const RISK_QUESTIONS = [
  { key: 'extranjero', label: '¿Facturas a clientes en el extranjero?',
    options: [['no','No'],['ue','Sí, en la UE'],['fuera','Sí, fuera de la UE']] },
  { key: 'empleados', label: '¿Tienes empleados a tu cargo?',
    options: [['no','No'],['si','Sí']] },
  { key: 'casa', label: '¿Trabajas desde casa?',
    options: [['no','No'],['si','Sí, deduzco gastos'],['si_no','Sí, sin deducir']] },
  { key: 'facturacion', label: '¿Cuál es tu facturación anual aproximada?',
    options: [['baja','Menos de 30.000 €'],['media','Entre 30.000 € y 85.000 €'],['alta','Más de 85.000 €']] },
  { key: 'clientes', label: '¿Cómo es tu cartera de clientes?',
    options: [['varios','Varios clientes'],['principal','Uno principal (>70%)'],['unico','Un único cliente']] },
];

const RISK_LEVELS = {
  alto:  { c: 'var(--red)',   bg: 'var(--red-dim)',   line: 'rgba(248,113,113,0.3)',  label: 'Riesgo alto',  order: 3 },
  medio: { c: 'var(--amber)', bg: 'var(--amber-dim)', line: 'rgba(251,191,36,0.3)',   label: 'Riesgo medio', order: 2 },
  bajo:  { c: 'var(--green)', bg: 'var(--green-dim)', line: 'rgba(52,211,153,0.28)',  label: 'Punto a vigilar', order: 1 },
};

const RISK_DOC_TYPES = { servicios: 1, confidencialidad: 1, laboral: 1, arrendamiento: 1, compraventa: 1 };

function parseRisks(raw) {
  if (!raw) return [];
  const clean = raw.replace(/\[\[FIN\]\]/g, '').replace(/```/g, '');
  const blocks = clean.split(/(?=NIVEL\s*:)/i).map(b => b.trim()).filter(b => /NIVEL\s*:/i.test(b));
  const field = (b, name) => {
    const m = b.match(new RegExp(name + '\\s*:\\s*([\\s\\S]*?)(?=\\n\\s*(?:NIVEL|TITULO|QUE|PORQUE|PASOS|DOC)\\s*:|$)', 'i'));
    return m ? m[1].trim() : '';
  };
  const out = blocks.map(b => {
    const nivelRaw = (field(b, 'NIVEL') || 'medio').toLowerCase();
    const nivel = nivelRaw.includes('alto') ? 'alto' : nivelRaw.includes('bajo') ? 'bajo' : 'medio';
    const pasos = field(b, 'PASOS').split(/\||\n/).map(s => s.replace(/^[-•\s]+/, '').trim()).filter(Boolean);
    const docRaw = field(b, 'DOC').toLowerCase().trim();
    const doc = Object.keys(RISK_DOC_TYPES).find(t => docRaw.includes(t)) || null;
    return {
      nivel,
      titulo: field(b, 'TITULO') || 'Punto de atención',
      que: field(b, 'QUE'),
      porque: field(b, 'PORQUE'),
      pasos,
      doc,
    };
  }).filter(r => r.titulo);
  // dedupe por título (el modelo puede repetir alguno al continuar)
  const seen = new Set();
  return out.filter(r => { const k = r.titulo.toLowerCase().trim(); if (seen.has(k)) return false; seen.add(k); return true; });
}

async function generateRisks(profile, answers) {
  const D = profile.data, C = profile.consent;
  const tipoMap = { autonomo: 'Autónomo / Freelancer', pyme: 'Pyme / Sociedad', particular: 'Particular' };
  const regMap = { directa: 'estimación directa', directa_simpl: 'estimación directa simplificada', modulos: 'estimación objetiva (módulos)', sociedades: 'Impuesto sobre Sociedades', recargo: 'recargo de equivalencia' };
  const A = {
    extranjero: { no: 'No', ue: 'Sí, en la UE', fuera: 'Sí, fuera de la UE' },
    empleados: { no: 'No', si: 'Sí' },
    casa: { no: 'No', si: 'Sí, deduce gastos', si_no: 'Sí, sin deducir' },
    facturacion: { baja: 'Menos de 30.000 €', media: '30.000-85.000 €', alta: 'Más de 85.000 €' },
    clientes: { varios: 'Varios clientes', principal: 'Uno principal (>70%)', unico: 'Un único cliente' },
  };
  const L = (k) => (A[k] && A[k][answers[k]]) || 'no indicado';

  const userPrompt = `Analiza la situación fiscal de este usuario en España e identifica los posibles riesgos o puntos de atención más relevantes para su perfil.

Datos del usuario:
- Tipo: ${C.whoami && D.whoami.tipo ? tipoMap[D.whoami.tipo] : 'no indicado'}
- Actividad / sector: ${(C.whoami && D.whoami.actividad) || (C.company && D.company.sector) || 'no indicado'}
- Comunidad Autónoma: ${C.region && D.region.ccaa ? D.region.ccaa : 'no indicada'}
- Régimen fiscal: ${C.fiscal && D.fiscal.regimen ? (regMap[D.fiscal.regimen] || D.fiscal.regimen) : 'no indicado'}
- IVA habitual: ${C.fiscal && D.fiscal.iva ? D.fiscal.iva : 'no indicado'}
- Factura a clientes extranjeros: ${L('extranjero')}
- Tiene empleados: ${L('empleados')}
- Trabaja desde casa: ${L('casa')}
- Facturación anual aproximada: ${L('facturacion')}
- Cartera de clientes: ${L('clientes')}

Devuelve entre 3 y 6 riesgos, ordénalos tú por relevancia. Cada riesgo en este formato EXACTO:
NIVEL: alto | medio | bajo
TITULO: (breve y claro)
QUE: (qué es, 1-2 frases)
PORQUE: (por qué podría ser un problema para ESTE usuario en concreto)
PASOS: paso recomendado 1 | paso 2 | paso 3
DOC: uno de [servicios, confidencialidad, laboral, arrendamiento, compraventa] si generar ese documento ayudaría, o NINGUNO

Considera riesgos como: posible falso autónomo / dependencia económica (TRADE) si hay un único cliente; deducción de gastos sin justificación adecuada (incluido trabajo desde casa); obligaciones de IVA intracomunitario (modelo 349, ROI) si factura a la UE; umbrales de facturación que cambian obligaciones; régimen fiscal posiblemente no óptimo; obligaciones de retenciones si tiene empleados. Solo incluye los que apliquen a este perfil.

Cuando termines, escribe en una línea final [[FIN]].`;

  const messages = [{ role: 'user', content: userPrompt }];
  let full = '';
  for (let seg = 0; seg < 4; seg++) {
    const chunk = await callLexly(messages, RISK_SYSTEM, 3000);
    const done = /\[\[FIN\]\]/.test(chunk);
    const cleanChunk = chunk.replace(/\[\[FIN\]\]/g, '').replace(/\s+$/, '');
    full += (full ? '\n' : '') + cleanChunk;
    if (done) break;
    if (cleanChunk.length < 500) break;
    messages.push({ role: 'assistant', content: full });
    messages.push({ role: 'user', content: 'Continúa con los riesgos que falten en el mismo formato, sin repetir los anteriores. Cuando termines, añade [[FIN]].' });
  }
  return parseRisks(full);
}

const RISK_CACHE_KEY = 'risk-analysis';

function Riesgos({ onAskInChat, onGenerateDoc, onGoPrivacy }) {
  const profile = useProfile();
  const [view, setView] = useState('idle'); // idle | questions | loading | results | error
  const [answers, setAnswers] = useState({});
  const [risks, setRisks] = useState(null);
  const [date, setDate] = useState(null);

  useEffect(() => {
    const cached = lxFicheGet(RISK_CACHE_KEY);
    if (cached && Array.isArray(cached.risks) && cached.risks.length) {
      setRisks(cached.risks); setDate(cached.date); setAnswers(cached.answers || {}); setView('results');
    }
  }, []);

  const startQuestions = () => {
    const cached = lxFicheGet(RISK_CACHE_KEY);
    if (cached && cached.answers) setAnswers(cached.answers);
    setView('questions');
  };

  const allAnswered = RISK_QUESTIONS.every(q => answers[q.key]);

  const analyze = async () => {
    setView('loading');
    try {
      const result = await generateRisks(profile, answers);
      if (!result.length) throw new Error('parse');
      const d = new Date().toLocaleDateString('es-ES', { day: 'numeric', month: 'long', year: 'numeric' });
      result.sort((a, b) => RISK_LEVELS[b.nivel].order - RISK_LEVELS[a.nivel].order);
      setRisks(result); setDate(d); setView('results');
      lxFicheSet(RISK_CACHE_KEY, { risks: result, date: d, answers, generatedAt: Date.now() });
    } catch (e) {
      setView(e.message === 'NO_API' ? 'noapi' : 'error');
    }
  };

  const counts = risks ? { alto: risks.filter(r => r.nivel === 'alto').length, medio: risks.filter(r => r.nivel === 'medio').length, bajo: risks.filter(r => r.nivel === 'bajo').length } : null;

  return (
    <div className="section-pad fade-up">
      <div className="eyebrow">Prevención</div>
      <h1 className="h-title">Análisis de riesgos</h1>
      <p className="h-sub">Una revisión preventiva de tu situación fiscal para detectar puntos que conviene vigilar — antes de que se conviertan en un problema.</p>

      {/* Aviso de prudencia (siempre visible) */}
      <div className="risk-disclaimer">
        <Icon name="shield" size={16} />
        <span>Este análisis es <b>orientativo y preventivo</b>. No sustituye la revisión de un asesor fiscal o gestor colegiado. Su objetivo es ayudarte a identificar puntos que conviene revisar, con calma.</span>
      </div>

      {/* IDLE */}
      {view === 'idle' && (
        <div className="risk-start">
          <div className="rs-ic"><Icon name="shield" size={30} /></div>
          <h2>Revisemos tu situación, sin agobios</h2>
          <p>Analizaré tu perfil y unas pocas preguntas para señalarte los puntos de atención más relevantes para ti, con pasos claros para revisarlos.</p>
          <button className="btn btn-primary btn-analyze" onClick={startQuestions}><Icon name="sparkle" size={16} /> Analizar mi situación fiscal</button>
        </div>
      )}

      {/* QUESTIONS */}
      {view === 'questions' && (
        <div className="risk-questions fade-up">
          <p className="rq-intro">Unas preguntas rápidas para afinar el análisis. Reutilizo lo que ya sé de tu perfil.</p>
          {RISK_QUESTIONS.map(q => (
            <div className="rq-block" key={q.key}>
              <div className="rq-label">{q.label}</div>
              <div className="rq-opts">
                {q.options.map(([v, l]) => (
                  <button key={v} className={'rq-opt' + (answers[q.key] === v ? ' on' : '')} onClick={() => setAnswers(a => ({ ...a, [q.key]: v }))}>{l}</button>
                ))}
              </div>
            </div>
          ))}
          <div className="rq-actions">
            <button className="btn btn-ghost" onClick={() => setView(risks ? 'results' : 'idle')}>Cancelar</button>
            <button className="btn btn-primary" disabled={!allAnswered} onClick={analyze}><Icon name="sparkle" size={15} /> Analizar</button>
          </div>
          {!allAnswered && <p className="rq-note">Responde las 5 preguntas para empezar el análisis.</p>}
        </div>
      )}

      {/* LOADING */}
      {view === 'loading' && (
        <div className="risk-loading fade-up">
          <LexAvatar size={40} />
          <p>Lexly está revisando tu situación con calma…</p>
          <span>Identificando puntos de atención y preparando recomendaciones</span>
        </div>
      )}

      {(view === 'error' || view === 'noapi') && (
        <div className="risk-loading fade-up">
          <div className="rl-err"><Icon name="warn" size={24} /></div>
          <p>{view === 'noapi' ? 'No se ha podido conectar con el servicio. Revisa tu conexión e inténtalo de nuevo.' : 'No se ha podido completar el análisis.'}</p>
          <button className="btn btn-primary" onClick={analyze}><Icon name="sparkle" size={15} /> Reintentar</button>
        </div>
      )}

      {/* RESULTS */}
      {view === 'results' && risks && (
        <div className="risk-results fade-up">
          <div className="risk-summary">
            <div className="rsum-left">
              <strong>Hemos identificado {risks.length} {risks.length === 1 ? 'punto de atención' : 'puntos de atención'} en tu situación.</strong>
              <span>{date && `Análisis del ${date}`} · Revísalos con tranquilidad; muchos se resuelven con un pequeño ajuste.</span>
            </div>
            <div className="rsum-counts">
              {counts.alto > 0 && <span className="rsum-pill" style={{ color: 'var(--red)', background: 'var(--red-dim)' }}>{counts.alto} alto{counts.alto > 1 ? 's' : ''}</span>}
              {counts.medio > 0 && <span className="rsum-pill" style={{ color: 'var(--amber)', background: 'var(--amber-dim)' }}>{counts.medio} medio{counts.medio > 1 ? 's' : ''}</span>}
              {counts.bajo > 0 && <span className="rsum-pill" style={{ color: 'var(--green)', background: 'var(--green-dim)' }}>{counts.bajo} a vigilar</span>}
            </div>
          </div>

          <div className="risk-cards">
            {risks.map((r, i) => {
              const lv = RISK_LEVELS[r.nivel] || RISK_LEVELS.medio;
              return (
                <div key={i} className="risk-card card" style={{ borderColor: lv.line }}>
                  <div className="rc-bar" style={{ background: lv.c }}></div>
                  <div className="rc-head">
                    <span className="rc-level" style={{ color: lv.c, background: lv.bg }}>{lv.label}</span>
                    <h3>{r.titulo}</h3>
                  </div>
                  {r.que && <p className="rc-que">{r.que}</p>}
                  {r.porque && <div className="rc-porque"><span className="rc-tag">Por qué importa</span><p>{r.porque}</p></div>}
                  {r.pasos.length > 0 && (
                    <div className="rc-pasos">
                      <span className="rc-tag">Qué puedes hacer</span>
                      <ul>{r.pasos.map((p, j) => <li key={j}><Icon name="check" size={13} /><span>{p}</span></li>)}</ul>
                    </div>
                  )}
                  <div className="rc-actions">
                    <button className="rc-action" onClick={() => onAskInChat(`Tengo una duda sobre este posible riesgo fiscal: "${r.titulo}". ${r.que} ¿Puedes explicármelo mejor y decirme cómo revisarlo en mi caso?`)}>
                      <Icon name="chat" size={14} /> Preguntar más sobre esto
                    </button>
                    {r.doc && (
                      <button className="rc-action" onClick={() => onGenerateDoc(r.doc)}>
                        <Icon name="contract" size={14} /> Generar documento relacionado
                      </button>
                    )}
                  </div>
                </div>
              );
            })}
          </div>

          <div className="risk-redo">
            <button className="btn btn-ghost" onClick={startQuestions}><Icon name="sparkle" size={14} /> Volver a analizar</button>
          </div>
        </div>
      )}

      <style>{`
        .risk-disclaimer { display: flex; align-items: flex-start; gap: 11px; margin-top: 22px; padding: 14px 16px; background: var(--surface); border: 1px solid var(--violet-line); border-radius: 12px; font-size: 13px; color: var(--text-2); line-height: 1.5; }
        .risk-disclaimer .ic { color: var(--violet-soft); flex-shrink: 0; margin-top: 1px; }
        .risk-disclaimer b { color: var(--text); font-weight: 600; }

        .risk-start { text-align: center; max-width: 480px; margin: 36px auto 0; display: flex; flex-direction: column; align-items: center; }
        .rs-ic { width: 66px; height: 66px; border-radius: 17px; background: var(--violet-dim); border: 1px solid var(--violet-line); display: grid; place-items: center; color: var(--violet-soft); margin-bottom: 20px; }
        .risk-start h2 { font-size: 21px; font-weight: 600; color: var(--white); letter-spacing: -0.02em; margin-bottom: 10px; }
        .risk-start p { font-size: 14px; color: var(--text-2); line-height: 1.6; margin-bottom: 24px; }
        .btn-analyze { padding: 13px 26px; font-size: 15px; }

        .risk-questions { max-width: 620px; margin-top: 26px; }
        .rq-intro { font-size: 13.5px; color: var(--text-2); margin-bottom: 22px; }
        .rq-block { margin-bottom: 22px; }
        .rq-label { font-size: 14px; font-weight: 600; color: var(--white); margin-bottom: 11px; }
        .rq-opts { display: flex; flex-wrap: wrap; gap: 9px; }
        .rq-opt { padding: 10px 15px; border-radius: 10px; font-size: 13px; font-weight: 500; color: var(--text-2); background: var(--bg-2); border: 1.5px solid var(--line-2); transition: .15s; }
        .rq-opt:hover { border-color: var(--line-3); color: var(--text); }
        .rq-opt.on { border-color: var(--violet); background: var(--violet-dim); color: var(--violet-soft); }
        .rq-actions { display: flex; justify-content: flex-end; gap: 10px; margin-top: 28px; }
        .rq-note { text-align: right; font-size: 12px; color: var(--text-3); margin-top: 10px; }

        .risk-loading { display: flex; flex-direction: column; align-items: center; text-align: center; gap: 12px; padding: 56px 20px; }
        .risk-loading p { font-size: 15px; color: var(--text); font-weight: 500; }
        .risk-loading span { font-size: 13px; color: var(--text-3); }
        .rl-err { width: 52px; height: 52px; border-radius: 14px; background: var(--red-dim); display: grid; place-items: center; color: var(--red); }

        .risk-summary { display: flex; align-items: center; justify-content: space-between; gap: 18px; flex-wrap: wrap; margin: 24px 0 18px; padding: 18px 20px; background: var(--surface); border: 1px solid var(--line); border-radius: 14px; }
        .rsum-left strong { display: block; font-size: 15.5px; font-weight: 600; color: var(--white); margin-bottom: 4px; letter-spacing: -0.01em; }
        .rsum-left span { font-size: 12.5px; color: var(--text-3); line-height: 1.45; }
        .rsum-counts { display: flex; gap: 8px; flex-shrink: 0; }
        .rsum-pill { font-size: 12px; font-weight: 600; padding: 5px 11px; border-radius: 20px; white-space: nowrap; }

        .risk-cards { display: flex; flex-direction: column; gap: 13px; }
        .risk-card { position: relative; padding: 18px 20px 18px 22px; overflow: hidden; }
        .rc-bar { position: absolute; left: 0; top: 0; bottom: 0; width: 4px; }
        .rc-head { display: flex; align-items: center; gap: 12px; flex-wrap: wrap; margin-bottom: 11px; }
        .rc-level { font-size: 11px; font-weight: 600; padding: 4px 11px; border-radius: 20px; white-space: nowrap; }
        .rc-head h3 { font-size: 15.5px; font-weight: 600; color: var(--white); letter-spacing: -0.01em; }
        .rc-que { font-size: 13.5px; color: var(--text); line-height: 1.55; margin-bottom: 13px; }
        .rc-porque, .rc-pasos { margin-top: 12px; }
        .rc-tag { display: inline-block; font-size: 10.5px; font-weight: 600; letter-spacing: 0.05em; text-transform: uppercase; color: var(--text-4); margin-bottom: 6px; }
        .rc-porque p { font-size: 13px; color: var(--text-2); line-height: 1.55; }
        .rc-pasos ul { list-style: none; display: flex; flex-direction: column; gap: 7px; }
        .rc-pasos li { display: flex; gap: 9px; font-size: 13px; color: var(--text-2); line-height: 1.45; }
        .rc-pasos li .ic { color: var(--green); flex-shrink: 0; margin-top: 2px; }
        .rc-actions { display: flex; flex-wrap: wrap; gap: 9px; margin-top: 16px; padding-top: 14px; border-top: 1px solid var(--line); }
        .rc-action { display: inline-flex; align-items: center; gap: 7px; font-size: 12.5px; font-weight: 600; color: var(--violet-soft); background: var(--violet-dim); border: 1px solid var(--violet-line); padding: 7px 13px; border-radius: 9px; transition: background .15s; }
        .rc-action:hover { background: rgba(124,58,237,0.22); }

        .risk-redo { display: flex; justify-content: center; margin-top: 22px; }

        @media (max-width: 700px) {
          .risk-summary { flex-direction: column; align-items: flex-start; }
        }
      `}</style>
    </div>
  );
}

Object.assign(window, { Riesgos });
