import { Injectable } from '@angular/core';
import jsPDF from 'jspdf';
import autoTable from 'jspdf-autotable';
import { RelatorioQuestionarioDTO } from '../models/relatorio.model';
import { TipoPergunta } from '../models/tipoPergunta.enum';

interface jsPDFWithAutoTable extends jsPDF {
  autoTable: (options: any) => jsPDF;
}

@Injectable({
  providedIn: 'root'
})
export class PdfService {

  constructor() { }
  public TipoPerguntaEnum = TipoPergunta;

  public gerarRelatorioPdf(relatorioData: RelatorioQuestionarioDTO): void {
    const doc = new jsPDF() as jsPDFWithAutoTable;
    let yPos = 20; // Posição vertical inicial no PDF
    
    // 1. CABEÇALHO PRINCIPAL
    doc.setFontSize(18);
    doc.setFont('helvetica', 'bold');
    doc.text('Relatório de Resultados do Questionário', doc.internal.pageSize.getWidth() / 2, yPos, { align: 'center' });
    yPos += 15;

    // 2. DADOS DO QUESTIONÁRIO
    doc.setFontSize(14);
    doc.text(relatorioData.tituloQuestionario, 14, yPos);
    yPos += 8;

    doc.setFontSize(10);
    doc.setFont('helvetica', 'normal');
    const descricaoLines = doc.splitTextToSize(relatorioData.descricaoQuestionario, 180);
    doc.text(descricaoLines, 14, yPos);
    yPos += descricaoLines.length * 5 + 5;

    autoTable(doc, {
      body: [
        ['Publicação:', new Date(relatorioData.dataPublicacao).toLocaleDateString('pt-BR')],
        ['Validade:', new Date(relatorioData.dataValidade).toLocaleDateString('pt-BR')],
        ['Total de Participantes:', relatorioData.totalParticipantes.toString()],
      ],
      startY: yPos,
      theme: 'grid',
      styles: { fontSize: 10 },
      columnStyles: { 0: { fontStyle: 'bold' } },
    });
    yPos = (doc as any).lastAutoTable.finalY + 15;

    // 3. MÉTRICAS GERAIS DO QUESTIONÁRIO
    doc.setFontSize(12);
    doc.setFont('helvetica', 'bold');
    doc.text('Métricas Gerais do Questionário', 14, yPos);
    yPos += 8;

    const mediaGeralFormatada = relatorioData.mediaGeral.toFixed(2);
    const mediasPorSetorBody = relatorioData.mediaSetores.map(m => [m.setor, m.media.toFixed(2)]);

    autoTable(doc, {
      body: [['Média Geral (Considerando apenas as perguntas do tipo LIKERT)', mediaGeralFormatada]],
      startY: yPos,
      theme: 'striped',
      styles: { fontSize: 10 },
      columnStyles: { 0: { fontStyle: 'bold' } },
    });
    yPos = (doc as any).lastAutoTable.finalY + 5;

    if (mediasPorSetorBody.length > 0) {
      autoTable(doc, {
        head: [['Setor', 'Média da Soma das Pontuações']],
        body: mediasPorSetorBody,
        startY: yPos,
        theme: 'grid',
        headStyles: { fillColor: [41, 128, 185], textColor: 255 }, // Azul
      });
      yPos = (doc as any).lastAutoTable.finalY + 15;
    }

    // 4. LOOP PELAS PERGUNTAS
   
    for (const pergunta of relatorioData.perguntasRelatorio) {
      // Verifica se há espaço na página antes de adicionar uma nova pergunta
      if (yPos > 260) {
        doc.addPage();
        yPos = 20;
      }

      doc.setFontSize(12);
      doc.setFont('helvetica', 'bold');
      const textoPerguntaLines = doc.splitTextToSize(`Pergunta: ${pergunta.textoPergunta}`, 180);
      doc.text(textoPerguntaLines, 14, yPos);
      yPos += textoPerguntaLines.length * 5 + 3;

      doc.setFontSize(9);
      doc.setFont('helvetica', 'italic');
      if(pergunta.tipoPergunta === this.TipoPerguntaEnum.Aberta){
        doc.text(`Tipo: ${pergunta.tipoPergunta.replace('_', ' ')} | Total de Respostas: ${pergunta.respostasAbertas.length}`, 14, yPos);
        yPos += 8;
      }else{
        doc.text(`Tipo: ${pergunta.tipoPergunta.replace('_', ' ')}` , 14, yPos);
        yPos += 8;
      }
      // Se não for de ABERTA, cria uma tabela
      if (pergunta.tipoPergunta != this.TipoPerguntaEnum.Aberta && pergunta.respostasAgrupadas) {
        autoTable(doc, {
          head: [['Opção', 'Quantidade', 'Percentual']],
          body: pergunta.respostasAgrupadas.map(r => [r.textoOpcao, r.quantidade.toString(), r.percentual]),
          startY: yPos,
          theme: 'grid',
          headStyles: { fillColor: [22, 160, 133], textColor: 255 },
        });
        yPos = (doc as any).lastAutoTable.finalY + 10;
      }

      // Se for ABERTA, cria uma lista de respostas
      if (pergunta.tipoPergunta === this.TipoPerguntaEnum.Aberta && pergunta.respostasAbertas) {
        doc.setFontSize(10);
        doc.setFont('helvetica', 'normal');
        for (const resposta of pergunta.respostasAbertas) {
          // Verifica espaço para cada resposta aberta
          if (yPos > 270) {
            doc.addPage();
            yPos = 20;
          }
          const respostaAbertaLines = doc.splitTextToSize(`- ${resposta.respostaAberta}`, 175);
          doc.text(respostaAbertaLines, 18, yPos);
          yPos += respostaAbertaLines.length * 5 + 3;
        }
        yPos += 5;
      }
    }

    // 5. RODAPÉ COM NÚMERO DE PÁGINA
    this.adicionarRodape(doc);
    // 6. SALVAR O ARQUIVO
    const nomeArquivo = `Relatorio_${relatorioData.tituloQuestionario.replace(/ /g, '_')}.pdf`;
    doc.save(nomeArquivo);
  }

  private adicionarRodape(doc: jsPDF): void {
    const pageCount = (doc as any).internal.getNumberOfPages();
    doc.setFontSize(8);
    for (let i = 1; i <= pageCount; i++) {
      doc.setPage(i);
      doc.text(
        `Página ${i} de ${pageCount}`,
        doc.internal.pageSize.getWidth() / 2,
        doc.internal.pageSize.getHeight() - 10,
        { align: 'center' }
      );
    }
  }
}
