import { Document, Page, Text, View, StyleSheet, Image as PdfImage, pdf, Font } from '@react-pdf/renderer';
import { useGalpaoStore } from '../store/galpaoStore';
import { useWindStore } from '../store/appStore';
import { useCaptureStore } from '../store/captureStore';
import {
  getColumnLinearLoads,
  getRoofLinearLoads,
  getAllPillarBaseReactions,
  getDragForce,
} from './line-loads';
import { getWallCpeOfficial, getRoofCpeOfficial } from './coefficients';
import { appendKgf, getEffortColor } from './export-generic-pdf';

// Registrar fonte Roboto com suporte Unicode completo (subscripts, grego, etc.)
Font.register({
  family: 'Roboto',
  fonts: [
    { src: 'https://cdnjs.cloudflare.com/ajax/libs/pdfmake/0.2.7/fonts/Roboto/Roboto-Regular.ttf' },
    { src: 'https://cdnjs.cloudflare.com/ajax/libs/pdfmake/0.2.7/fonts/Roboto/Roboto-Medium.ttf', fontWeight: 'bold' },
    { src: 'https://cdnjs.cloudflare.com/ajax/libs/pdfmake/0.2.7/fonts/Roboto/Roboto-Italic.ttf', fontStyle: 'italic' },
  ],
});

const styles = StyleSheet.create({
  page: { flexDirection: 'column', padding: 40, fontSize: 9, fontFamily: 'Roboto', color: '#334155' },
  header: { marginBottom: 15, borderBottom: '1.5pt solid #4f46e5', paddingBottom: 8, flexDirection: 'row', justifyContent: 'space-between', alignItems: 'center' },
  title: { fontSize: 16, fontWeight: 'bold', color: '#1e1b4b', textAlign: 'right' },
  subtitle: { fontSize: 9, color: '#4338ca', marginTop: 3, textAlign: 'right' },
  section: { marginTop: 12, marginBottom: 8 },
  sectionTitle: { fontSize: 11, fontWeight: 'bold', marginBottom: 6, color: '#111', borderBottom: '0.5pt solid #cbd5e1', paddingBottom: 2 },
  row: { flexDirection: 'row', marginBottom: 3 },
  label: { width: 180, fontWeight: 'bold', color: '#475569' },
  value: { flex: 1, color: '#1e293b' },
  text: { fontSize: 9, marginBottom: 3, lineHeight: 1.3, color: '#334155' },
  table: { display: 'flex', flexDirection: 'column', marginTop: 8, borderTop: '0.5pt solid #cbd5e1', borderLeft: '0.5pt solid #cbd5e1' },
  tableRow: { flexDirection: 'row' },
  tableHeader: { backgroundColor: '#f8fafc', fontWeight: 'bold' },
  tableCell: { flex: 1, padding: 4, borderRight: '0.5pt solid #cbd5e1', borderBottom: '0.5pt solid #cbd5e1', textAlign: 'center', fontSize: 8 },
  tableCellFirst: { flex: 1, padding: 4, borderRight: '0.5pt solid #cbd5e1', borderBottom: '0.5pt solid #cbd5e1', textAlign: 'left', fontSize: 8 },
  footer: { position: 'absolute', bottom: 30, left: 40, right: 40, borderTop: '0.5pt solid #cbd5e1', paddingTop: 6 },
  sceneImage: { width: 480, height: 250, objectFit: 'contain', marginVertical: 6, border: '0.5pt solid #e2e8f0', borderRadius: 4 },
  sceneCaption: { fontSize: 7, color: '#64748b', fontStyle: 'italic', textAlign: 'center', marginBottom: 6 },
  mathCard: { marginTop: 8, padding: 8, backgroundColor: '#f8fafc', borderLeft: '2.5pt solid #4f46e5', borderRadius: 2 },
  recCard: { marginTop: 8, padding: 8, backgroundColor: '#eff6ff', borderLeft: '2.5pt solid #3b82f6', borderRadius: 2 },
  signatureBlock: { marginTop: 40, flexDirection: 'row', justifyContent: 'space-around', paddingTop: 30 },
  signatureLine: { width: 200, borderTop: '0.75pt solid #334155', paddingTop: 4, alignItems: 'center' },
  signatureText: { fontSize: 9, color: '#334155' },
});

interface ReportProps {
  galpao: ReturnType<typeof useGalpaoStore.getState>;
  wind: ReturnType<typeof useWindStore.getState>;
  sceneImage?: string | null;
}

function generateGalpaoRecommendations(galpao: any, wind: any): string[] {
  const recs: string[] = [];
  
  let maxSuction = 0;
  let maxSuctionZone = '';
  let maxCompression = 0;
  let maxCompressionZone = '';

  const pressure = (cpe: number) => (wind.q * (cpe - wind.cpi));

  [0, 90].forEach(angle => {
    const wCpe = getWallCpeOfficial(galpao.length, galpao.width, galpao.height, angle as 0 | 90);
    const rCpe = getRoofCpeOfficial(galpao.length, galpao.width, galpao.height, galpao.roofPitch, angle as 0 | 90);
    
    Object.entries(wCpe).forEach(([zone, cpe]) => {
      const p = pressure(cpe as number);
      if (p < maxSuction) { maxSuction = p; maxSuctionZone = `Parede ${zone} (${angle}°)`; }
      if (p > maxCompression) { maxCompression = p; maxCompressionZone = `Parede ${zone} (${angle}°)`; }
    });
    
    Object.entries(rCpe).forEach(([zone, cpe]) => {
      const p = pressure(cpe as number);
      if (p < maxSuction) { maxSuction = p; maxSuctionZone = `Telhado ${zone} (${angle}°)`; }
      if (p > maxCompression) { maxCompression = p; maxCompressionZone = `Telhado ${zone} (${angle}°)`; }
    });
  });

  if (wind.cpi > 0) {
    recs.push(`Coeficiente de pressão interna positivo (Cpi = +${wind.cpi.toFixed(2)}) indica pressurização interna. Isso amplifica os esforços de arrancamento (sucção) na cobertura.`);
  } else if (wind.cpi < 0) {
    recs.push(`Coeficiente de pressão interna negativo (Cpi = ${wind.cpi.toFixed(2)}) indica sucção interna, o que diminui a sucção no telhado mas amplifica as pressões nas paredes barlavento.`);
  }

  const ratio = galpao.height / Math.min(galpao.width, galpao.length);
  if (ratio > 1.5) {
    recs.push("A relação pé-direito / largura é alta (estrutura esbelta). Verifique atentamente os deslocamentos no topo dos pórticos e garanta contraventamentos eficientes nas paredes.");
  }

  if (maxSuction < 0) {
    recs.push(`Para este projeto, a pressão crítica de sucção (arrancamento) ocorre na zona ${maxSuctionZone} com valor de ${maxSuction.toFixed(3)} kN/m². Atenção especial à ancoragem e fixação das telhas nesta região.`);
  }
  if (maxCompression > 0) {
    recs.push(`A pressão máxima de compressão ocorre na zona ${maxCompressionZone} com valor de ${maxCompression.toFixed(3)} kN/m².`);
  }

  recs.push("Verifique as ligações das terças de cobertura (presilhas de fixação) contra arrancamento devido à ação local do vento nas zonas de borda (zonas F, G, J).");
  recs.push("O memorial serve como suporte ao projetista estrutural, cabendo ao Engenheiro Responsável Técnico (RT) a aprovação final dos esforços de dimensionamento.");

  return recs;
}

const ReportDocument = ({ galpao, wind, sceneImage }: ReportProps) => {
  const pressure = (cpe: number) => (wind.q * (cpe - wind.cpi)).toFixed(3);
  const cpi = wind.cpi.toFixed(2);
  const fmtSigned = (v: number, p = 3) => (v >= 0 ? `+${v.toFixed(p)}` : v.toFixed(p));

  const FRAME_SPACING = 6.0;
  const PURLIN_SPACING = 1.5;

  const recommendations = generateGalpaoRecommendations(galpao, wind);

  return (
    <Document>
      <Page size="A4" style={styles.page}>
        {/* Cabeçalho com Logotipo customizado ou placeholder */}
        <View style={styles.header}>
          {wind.companyLogo ? (
            <PdfImage src={wind.companyLogo} style={{ width: 110, height: 40, objectFit: 'contain' }} />
          ) : (
            <View style={{ width: 110, height: 40, border: '0.75pt dashed #cbd5e1', borderRadius: 2, justifyContent: 'center', alignItems: 'center' }}>
              <Text style={{ fontSize: 7, color: '#94a3b8' }}>Logotipo Empresa</Text>
            </View>
          )}
          <View style={{ flex: 1, marginLeft: 15 }}>
            <Text style={styles.title}>{wind.projectName || 'BrainWind v1.0 — Memória de Cálculo'}</Text>
            <Text style={styles.subtitle}>Galpão Retangular — ABNT NBR 6123:2023</Text>
          </View>
        </View>

        <View style={{ flexDirection: 'row', justifyContent: 'space-between', marginBottom: 12, backgroundColor: '#f8fafc', padding: 6, borderRadius: 2 }}>
          <View>
            <Text style={{ fontSize: 8, color: '#64748b' }}>Cliente</Text>
            <Text style={{ fontSize: 9, fontWeight: 'bold' }}>{wind.clientName || '-'}</Text>
          </View>
          <View>
            <Text style={{ fontSize: 8, color: '#64748b' }}>Autor</Text>
            <Text style={{ fontSize: 9, fontWeight: 'bold' }}>{wind.authorName || '-'}</Text>
          </View>
          <View>
            <Text style={{ fontSize: 8, color: '#64748b' }}>Revisão</Text>
            <Text style={{ fontSize: 9, fontWeight: 'bold' }}>{wind.projectRev || '-'}</Text>
          </View>
          <View>
            <Text style={{ fontSize: 8, color: '#64748b' }}>Data</Text>
            <Text style={{ fontSize: 9, fontWeight: 'bold' }}>{new Date().toLocaleDateString('pt-BR')}</Text>
          </View>
        </View>

        <View style={styles.section}>
          <Text style={styles.sectionTitle}>1. Parâmetros Globais do Vento e Pressão Dinâmica</Text>
          <View style={styles.row}>
            <Text style={styles.label}>Localidade de Projeto:</Text>
            <Text style={styles.value}>{wind.locality || 'V0 generalizado'}</Text>
          </View>
          <View style={styles.row}>
            <Text style={styles.label}>Velocidade Básica (V0):</Text>
            <Text style={styles.value}>{wind.v0} m/s (conforme Figura 1 e Anexo C da NBR 6123)</Text>
          </View>
          <View style={styles.row}>
            <Text style={styles.label}>Fator Topográfico (S1):</Text>
            <Text style={styles.value}>{wind.s1} (conforme Seção 5.2)</Text>
          </View>
          <View style={styles.row}>
            <Text style={styles.label}>Fator de Rugosidade (S2):</Text>
            <Text style={styles.value}>{wind.s2.toFixed(3)} (Categoria {wind.terrainCategory}, Classe {wind.structureClass}, conforme Tabela 2)</Text>
          </View>
          <View style={styles.row}>
            <Text style={styles.label}>Fator Estatístico (S3):</Text>
            <Text style={styles.value}>{wind.s3.toFixed(2)} (Grupo {wind.s3Group}, conforme Tabela 4)</Text>
          </View>
          
          <View style={styles.mathCard}>
            <Text style={{ fontSize: 10, fontWeight: 'bold', marginBottom: 3, color: '#1e1b4b' }}>
              Formulações de Velocidade e Pressão (Sec. 4.2 e 4.3):
            </Text>
            <Text style={{ fontSize: 9, fontWeight: 'bold', color: '#1e1b4b', marginBottom: 2 }}>
              Fórmula Base: Vk = V0 × S1 × S2 × S3
            </Text>
            <Text style={{ fontSize: 8, color: '#475569', marginBottom: 6 }}>
              Vk = {wind.v0} × {wind.s1} × {wind.s2.toFixed(3)} × {wind.s3.toFixed(2)} = {wind.vk.toFixed(2)} m/s
            </Text>
            <Text style={{ fontSize: 9, fontWeight: 'bold', color: '#1e1b4b', marginBottom: 2 }}>
              Pressão Dinâmica: q = 0,613 × (Vk)²
            </Text>
            <Text style={{ fontSize: 8, color: '#475569' }}>
              q = 0,613 × ({wind.vk.toFixed(2)})² = {wind.q.toFixed(3)} kN/m²
            </Text>
          </View>
        </View>

        <View style={styles.section}>
          <Text style={styles.sectionTitle}>2. Geometria do Galpão (Tabelas 4 e 5)</Text>
          <View style={{ flexDirection: 'row', flexWrap: 'wrap' }}>
            <View style={{ width: '50%', marginBottom: 4 }}>
              <Text style={{ fontWeight: 'bold', color: '#475569' }}>Largura (b):</Text>
              <Text style={{ color: '#1e293b' }}>{galpao.width} m</Text>
            </View>
            <View style={{ width: '50%', marginBottom: 4 }}>
              <Text style={{ fontWeight: 'bold', color: '#475569' }}>Comprimento (a):</Text>
              <Text style={{ color: '#1e293b' }}>{galpao.length} m</Text>
            </View>
            <View style={{ width: '50%', marginBottom: 4 }}>
              <Text style={{ fontWeight: 'bold', color: '#475569' }}>Altura do Pé-direito (h):</Text>
              <Text style={{ color: '#1e293b' }}>{galpao.height} m</Text>
            </View>
            <View style={{ width: '50%', marginBottom: 4 }}>
              <Text style={{ fontWeight: 'bold', color: '#475569' }}>Inclinação do Telhado (θ):</Text>
              <Text style={{ color: '#1e293b' }}>{galpao.roofPitch}°</Text>
            </View>
            <View style={{ width: '50%', marginBottom: 4 }}>
              <Text style={{ fontWeight: 'bold', color: '#475569' }}>Direção do Vento Selecionada:</Text>
              <Text style={{ color: '#1e293b' }}>{wind.windAngle}°</Text>
            </View>
          </View>
        </View>

        <View style={styles.section}>
          <Text style={styles.sectionTitle}>3. Pressão Interna (Sec. 6.3, Figura 2)</Text>
          <View style={styles.row}>
            <Text style={styles.label}>Caso de Permeabilidade:</Text>
            <Text style={styles.value}>
              {{
                'two-opposite-permeable': 'Duas faces opostas permeáveis',
                'four-equally-permeable': 'Quatro faces igualmente permeáveis',
                'dominant-windward': 'Abertura dominante — barlavento',
                'dominant-leeward': 'Abertura dominante — sotavento',
                'dominant-lateral': 'Abertura dominante — lateral',
                'airtight': 'Edificação estanque'
              }[wind.permeabilityCase] || wind.permeabilityCase}
            </Text>
          </View>
          <View style={styles.row}>
            <Text style={styles.label}>Coeficiente Cpi:</Text>
            <Text style={styles.value}>{cpi}</Text>
          </View>
        </View>

        <View style={styles.section}>
          <Text style={styles.sectionTitle}>4. Demonstração dos Passos Matemáticos — Galpão Retangular (NBR 6123)</Text>
          <View style={styles.mathCard}>
            <Text style={{ fontSize: 9, fontWeight: 'bold', color: '#1e1b4b', marginBottom: 2 }}>
              1. Pressão Dinâmica de Referência (q)
            </Text>
            <Text style={{ fontSize: 8, color: '#475569', marginBottom: 4 }}>
              Fórmula: q = 0,613 · Vk² [N/m²] = 0,000613 · Vk² [kN/m²] | Cálculo: 0,613 · ({wind.vk.toFixed(2)} m/s)² / 1000 = {wind.q.toFixed(3)} kN/m²
            </Text>
            <Text style={{ fontSize: 9, fontWeight: 'bold', color: '#1e1b4b', marginBottom: 2 }}>
              2. Relações Geométricas e Seleção Normativa (Tabelas 4 e 5)
            </Text>
            <Text style={{ fontSize: 8, color: '#475569', marginBottom: 4 }}>
              h/b = {(galpao.height / galpao.width).toFixed(2)} | a/b = {(galpao.length / galpao.width).toFixed(2)} — Determinam a distribuição aerodinâmica nas 4 paredes e nas águas do telhado.
            </Text>
            <Text style={{ fontSize: 9, fontWeight: 'bold', color: '#1e1b4b', marginBottom: 2 }}>
              3. Pressão Líquida Efetiva (p)
            </Text>
            <Text style={{ fontSize: 8, color: '#475569', marginBottom: 4 }}>
              Fórmula: p = q · (Cpe − Cpi) [kN/m²] — Aplicação simultânea dos coeficientes externos e da pressão interna Cpi ({cpi}) da edificação.
            </Text>
            <Text style={{ fontSize: 9, fontWeight: 'bold', color: '#1e1b4b', marginBottom: 2 }}>
              4. Cargas Lineares por Elemento (w)
            </Text>
            <Text style={{ fontSize: 8, color: '#475569' }}>
              Fórmula: w = p · espaçamento [kN/m] (Pórticos: e = {FRAME_SPACING} m | Terças: e = {PURLIN_SPACING} m).
            </Text>
          </View>
        </View>

        {[0, 90].map((angle, index) => {
          const wCpe = getWallCpeOfficial(galpao.length, galpao.width, galpao.height, angle as 0 | 90);
          const rCpe = getRoofCpeOfficial(galpao.length, galpao.width, galpao.height, galpao.roofPitch, angle as 0 | 90);
          const colLoads = getColumnLinearLoads(wind.cpi, wind.q, wCpe, FRAME_SPACING, angle as 0 | 90);
          const rLoads = getRoofLinearLoads(wind.cpi, wind.q, rCpe, PURLIN_SPACING, galpao.roofPitch);
          const rxns = getAllPillarBaseReactions(colLoads, galpao.height);
          const dForce = getDragForce(wCpe, rCpe, wind.q, galpao.length, galpao.width, galpao.height, galpao.roofPitch, angle as 0 | 90);
          const secBase = index === 0 ? 5 : 7;

          return (
            <View wrap={false} key={`angle-${angle}`} style={{ marginTop: 15 }}>
              <Text style={{ fontSize: 13, fontWeight: 'bold', color: '#1e1b4b', marginTop: 10, marginBottom: 6, borderBottom: '1pt solid #cbd5e1', paddingBottom: 3 }}>
                Cenário: Vento a {angle}°
              </Text>
              
              <View style={styles.section}>
                <Text style={styles.sectionTitle}>{secBase}. Coeficientes e Pressões Localizadas</Text>
                
                <View style={[styles.mathCard, { marginBottom: 6 }]}>
                  <Text style={{ fontSize: 9, fontWeight: 'bold', color: '#1e1b4b', marginBottom: 2 }}>
                    Fórmula de Pressão Efetiva: p = q × (Cpe − Cpi)
                  </Text>
                  <Text style={{ fontSize: 8, color: '#475569' }}>
                    Valores de Cpe extraídos da Tabela 4 (Paredes) e Tabela 5 (Telhado Duas Águas) da NBR 6123:2023.
                  </Text>
                </View>

                <View style={styles.table}>
                  <View style={[styles.tableRow, styles.tableHeader]}>
                    <Text style={styles.tableCellFirst}>Elemento / Região</Text>

                    <Text style={styles.tableCell}>Cpe</Text>
                    <Text style={styles.tableCell}>Cpi</Text>
                    <Text style={styles.tableCell}>p [kN/m²]</Text>
                  </View>
                  {Object.entries(wCpe).map(([face, cpeVal]) => (
                    <View style={styles.tableRow} key={`wall-${face}`}>
                      <Text style={styles.tableCellFirst}>Parede — {face}</Text>
                      <Text style={styles.tableCell}>{(cpeVal as number).toFixed(2)}</Text>
                      <Text style={styles.tableCell}>{cpi}</Text>
                      <Text style={[styles.tableCell, { color: getEffortColor(pressure(cpeVal as number)) }]}>
                        {appendKgf(`${pressure(cpeVal as number)} kN/m²`)}
                      </Text>
                    </View>
                  ))}
                  {Object.entries(rCpe).map(([face, cpeVal]) => (
                    <View style={styles.tableRow} key={`roof-${face}`}>
                      <Text style={styles.tableCellFirst}>Telhado — {face}</Text>
                      <Text style={styles.tableCell}>{(cpeVal as number).toFixed(2)}</Text>
                      <Text style={styles.tableCell}>{cpi}</Text>
                      <Text style={[styles.tableCell, { color: getEffortColor(pressure(cpeVal as number)) }]}>
                        {appendKgf(`${pressure(cpeVal as number)} kN/m²`)}
                      </Text>
                    </View>
                  ))}
                </View>
                <Text style={{ fontSize: 7, color: '#64748b', marginTop: 4, fontStyle: 'italic' }}>
                  Nota: Valores avermelhados indicam sucção (pressão apontando para fora da superfície). Valores azuis indicam compressão (pressão empurrando a superfície).
                </Text>
              </View>

              <View style={styles.section}>
                <Text style={styles.sectionTitle}>
                  {secBase + 1}. Cargas Lineares por Pórtico e Terças
                </Text>
                
                <View style={[styles.mathCard, { marginBottom: 6, borderLeftColor: '#0ea5e9', backgroundColor: '#f0f9ff' }]}>
                  <Text style={{ fontSize: 9, fontWeight: 'bold', color: '#0c4a6e', marginBottom: 2 }}>
                    Fórmula de Carga Linear: w = p × espaçamento
                  </Text>
                  <Text style={{ fontSize: 8, color: '#0369a1' }}>
                    Espaçamento dos Pórticos: {FRAME_SPACING} m | Terças: {PURLIN_SPACING} m
                  </Text>
                </View>

                <View style={styles.table}>
                  <View style={[styles.tableRow, styles.tableHeader]}>
                    <Text style={styles.tableCellFirst}>Pilar principal do pórtico</Text>
                    <Text style={styles.tableCell}>Cpe</Text>
                    <Text style={styles.tableCell}>Carga w [kN/m]</Text>
                  </View>
                  {([
                    ['Barlavento', angle === 0 ? wCpe.C : wCpe.A, colLoads.windward],
                    ['Sotavento', angle === 0 ? wCpe.D : wCpe.B, colLoads.leeward],
                    ['Lateral 1', angle === 0 ? wCpe.A : wCpe.C, colLoads.sideA],
                    ['Lateral 2', angle === 0 ? wCpe.B : wCpe.D, colLoads.sideB],
                  ] as const).map(([label, cpeVal, w]) => (
                    <View style={styles.tableRow} key={`col-${label}`}>
                      <Text style={styles.tableCellFirst}>{label}</Text>
                      <Text style={styles.tableCell}>{cpeVal.toFixed(2)}</Text>
                      <Text style={[styles.tableCell, { color: getEffortColor(w) }]}>
                        {appendKgf(`${fmtSigned(w)} kN/m`)}
                      </Text>
                    </View>
                  ))}
                </View>

                <View style={[styles.table, { marginTop: 8 }]}>
                  <View style={[styles.tableRow, styles.tableHeader]}>
                    <Text style={styles.tableCellFirst}>Terça de Cobertura (Zonas A-J)</Text>
                    <Text style={styles.tableCell}>Cpe</Text>
                    <Text style={styles.tableCell}>Carga w [kN/m]</Text>
                  </View>
                  {(['E', 'F', 'G', 'H', 'I', 'J'] as const).map((z) => (
                    <View style={styles.tableRow} key={`roof-${z}`}>
                      <Text style={styles.tableCellFirst}>{z}</Text>
                      <Text style={styles.tableCell}>{rCpe[z].toFixed(2)}</Text>
                      <Text style={[styles.tableCell, { color: getEffortColor(rLoads[z]) }]}>
                        {appendKgf(`${fmtSigned(rLoads[z])} kN/m`)}
                      </Text>
                    </View>
                  ))}
                </View>

                <View style={{ marginTop: 6, fontSize: 8.5, color: '#1e293b' }}>
                  <Text>• Reação total na base do pilar: <Text style={{ fontWeight: 'bold' }}>{appendKgf(`${fmtSigned(rxns.total, 3)} kN`)}</Text></Text>
                  <Text>• Força de arrasto global do galpão: <Text style={{ fontWeight: 'bold' }}>{appendKgf(`${dForce.forceKN.toFixed(3)} kN`)}</Text></Text>
                </View>
              </View>
            </View>
          );
        })}

        {sceneImage && (
          <View style={styles.section} wrap={false}>
            <Text style={styles.sectionTitle}>8. Modelo 3D (Captura de Cena)</Text>
            <PdfImage src={sceneImage} style={styles.sceneImage} />
            <Text style={styles.sceneCaption}>
              Vista isométrica 3D do galpão renderizado com distribuição tridimensional de pressões.
            </Text>
          </View>
        )}

        <View style={styles.section} wrap={false}>
          <Text style={styles.sectionTitle}>9. Parecer Técnico e Recomendações</Text>
          <View style={styles.recCard}>
            {recommendations.map((rec, rIdx) => (
              <Text style={{ fontSize: 9, marginBottom: 4, lineHeight: 1.3, color: '#1e3a8a' }} key={rIdx}>
                • {rec}
              </Text>
            ))}
          </View>
          
          <View style={styles.signatureBlock}>
            <View style={styles.signatureLine}>
              <Text style={styles.signatureText}>{wind.authorName || 'Engenheiro Responsável'}</Text>
              <Text style={{ fontSize: 7, color: '#64748b', marginTop: 2 }}>CREA / CAU:</Text>
            </View>
          </View>
          
          <View style={{ marginTop: 20, paddingTop: 10, borderTop: '0.5pt solid #e2e8f0' }}>
            <Text style={{ fontSize: 6, color: '#94a3b8', textAlign: 'justify', lineHeight: 1.3 }}>
              Isenção de Responsabilidade do Software: Os resultados e relatórios gerados pelo BrainWind são de responsabilidade exclusiva e integral do usuário. O aplicativo atua como ferramenta de auxílio e não substitui o julgamento técnico, a análise detalhada das normas e o dimensionamento final por profissional habilitado.
            </Text>
          </View>
        </View>

        <View style={styles.footer} fixed>
          <View style={{ flexDirection: 'row', justifyContent: 'space-between', alignItems: 'center' }}>
            <View style={{ flex: 1 }}>
              <Text style={{ fontSize: 6, color: '#94a3b8' }}>
                Legendas: V0: Vel. básica | S1, S2, S3: Fatores de vento | Vk: Vel. de projeto | q: Pressão dinâmica | Cpe: Pressão externa | Cpi: Pressão interna
              </Text>
            </View>
            <Text style={{ fontSize: 7, color: '#64748b', textAlign: 'right', flex: 0.2, paddingRight: 10 }} render={({ pageNumber, totalPages }) => (
              `Pág. ${pageNumber} de ${totalPages}`
            )} />
            <View style={{ flexDirection: 'row', alignItems: 'center', justifyContent: 'flex-end', flex: 0.3 }}>
              <PdfImage src="/logo_brainwind.png" style={{ width: 25, height: 'auto', objectFit: 'contain' }} />
            </View>
          </View>
        </View>
      </Page>
    </Document>
  );
};

export async function exportGalpaoToPDF() {
  const galpao = useGalpaoStore.getState();
  const wind = useWindStore.getState();
  const sceneImage = useCaptureStore.getState().capturedImage;

  const blob = await pdf(
    <ReportDocument galpao={galpao} wind={wind} sceneImage={sceneImage} />,
  ).toBlob();

  const url = URL.createObjectURL(blob);
  const link = document.createElement('a');
  link.setAttribute('href', url);
  link.setAttribute('download', 'memoria_calculo_vento.pdf');
  document.body.appendChild(link);
  link.click();
  document.body.removeChild(link);
}