from docx import Document
from docx.shared import Pt, Cm
from docx.enum.text import WD_ALIGN_PARAGRAPH
from docx.oxml.ns import qn
from docx.oxml import OxmlElement
from django.http import HttpResponse
import io
import datetime
import os
import pandas as pd

from ctermica.models import Ambiente,Ambiente, DadosTermicos
from centraltermica.views import determinar_aparelho, escolher_aparelho_renovacao

def gerar_pmoc(request, projeto):
    """
    Gera um arquivo DOCX com o Plano de Manutenção, Operação e Controle (PMOC)
    de forma detalhada, incluindo capa, introdução, sumário, checklists por aparelho e considerações finais.
    O documento é baseado nas recomendações da Portaria GM/MS nº 3.523/1998 e da Resolução RE nº 9/2003 da ANVISA,
    além de boas práticas de manutenção e segurança, visando assegurar a qualidade do ar, a eficiência dos sistemas
    e a integridade das equipes de manutenção.
    """
    doc = Document()

    # ---------------------------------------------------------------------------
    # CONFIGURAÇÕES GERAIS DE FORMATAÇÃO
    # ---------------------------------------------------------------------------
    section = doc.sections[0]
    section.left_margin = Cm(2.5)
    section.right_margin = Cm(2.5)
    section.top_margin = Cm(2.0)
    section.bottom_margin = Cm(2.0)

    style = doc.styles['Normal']
    font = style.font
    font.name = 'Arial'
    font.size = Pt(11)

    def add_heading(text, level=1, center=False):
        h = doc.add_heading(text, level=level)
        h.alignment = WD_ALIGN_PARAGRAPH.CENTER if center else WD_ALIGN_PARAGRAPH.LEFT
        h.style.font.name = 'Arial'
        return h

    def add_paragraph(text, bold=False, align=WD_ALIGN_PARAGRAPH.JUSTIFY):
        p = doc.add_paragraph()
        run = p.add_run(text)
        run.font.name = 'Arial'
        run.font.size = Pt(11)
        run.bold = bold
        p.alignment = align
        return p

    def add_table_style(table):
        """
        Aplica o estilo 'Table Grid' à tabela e configura o alinhamento e a fonte das células
        para melhorar a legibilidade das informações apresentadas.
        """
        table.style = 'Table Grid'
        for row in table.rows:
            for cell in row.cells:
                if cell.paragraphs:
                    cell.paragraphs[0].alignment = WD_ALIGN_PARAGRAPH.CENTER
                    for run in cell.paragraphs[0].runs:
                        run.font.size = Pt(12)  # Fonte aumentada para facilitar a leitura


    # ---------------------------------------------------------------------------
    # CAPA
    # ---------------------------------------------------------------------------
    add_heading("PLANO DE MANUTENÇÃO, OPERAÇÃO E CONTROLE (PMOC)", level=0, center=True)

    # Nome do Projeto em destaque
    p1 = add_paragraph(f"Projeto: {projeto.nome_projeto}", bold=True, align=WD_ALIGN_PARAGRAPH.CENTER)
    for run in p1.runs:
        run.font.size = Pt(14)  # Aumenta a fonte do nome do projeto

    # Cidade em destaque
    p2 = add_paragraph(f"Cidade: {projeto.cidade}", bold=True, align=WD_ALIGN_PARAGRAPH.CENTER)
    for run in p2.runs:
        run.font.size = Pt(13)  # Aumenta a fonte da cidade

    # Data em destaque
    p3 = add_paragraph(f"Data de Geração: {datetime.datetime.now().strftime('%d/%m/%Y')}", bold=True, align=WD_ALIGN_PARAGRAPH.CENTER)
    for run in p3.runs:
        run.font.size = Pt(13)

    # Espaçamento visual
    add_paragraph("\n" * 5)

    # Texto explicativo da capa reescrito de forma clara
    p4 = add_paragraph(
        "Este documento apresenta, de forma organizada e detalhada, todas as diretrizes técnicas referentes ao Plano de "
        "Manutenção, Operação e Controle (PMOC) para sistemas de climatização do tipo split. A estrutura do documento inclui:\n\n"
        "• Introdução e descrição das etapas obrigatórias do plano;\n"
        "• Sumário dos equipamentos instalados em cada ambiente;\n"
        "• Checklists de manutenção para cada aparelho;\n"
        "• Responsabilidades da equipe técnica e observações finais importantes.",
        align=WD_ALIGN_PARAGRAPH.CENTER
    )
    for run in p4.runs:
        run.font.size = Pt(11)

    # Quebra de página após a capa
    doc.add_page_break()


    # ---------------------------------------------------------------------------
    # INTRODUÇÃO E ETAPAS DO PMOC
    # ---------------------------------------------------------------------------
    add_heading("1. Introdução e Etapas do PMOC", level=1)

    # Texto introdutório com melhor separação de parágrafos
    add_paragraph(
        "Este Plano de Manutenção, Operação e Controle (PMOC) foi elaborado para o projeto "
        f"{projeto.nome_projeto}. O objetivo é assegurar a eficiência dos sistemas de climatização do tipo split, "
        "bem como manter adequada a qualidade do ar interior e a segurança de todos os usuários."
    )
    add_paragraph(
        "O PMOC segue as diretrizes estabelecidas pela Portaria GM/MS nº 3.523/1998 e pela Resolução RE nº 9/2003 da ANVISA, "
        "além de contemplar boas práticas de manutenção para evitar falhas, reduzir custos operacionais e prolongar "
        "a vida útil dos equipamentos."
    )

    # Subtítulo com negrito
    add_paragraph("📋 Etapas do PMOC e Detalhamento das Atividades:", bold=True)
    add_paragraph(
        "As etapas a seguir descrevem as principais atividades de manutenção, destacando procedimentos, riscos "
        "envolvidos e medidas de segurança pertinentes. A adoção destes processos visa garantir um funcionamento "
        "confiável, seguro e econômico dos sistemas de ar condicionado."
    )

    # Lista de atividades (com periodicidade e descrição mais detalhada)
    atividades = [
        [
            "Limpeza dos Filtros da Evaporadora",
            "Mensal",
            """📄 Descrição: Retirar os filtros de ar da unidade interna (evaporadora), lavar com água corrente e sabão neutro. Após a limpeza, 
    os filtros devem ser completamente secos à sombra antes de serem reinstalados. A higienização regular dos filtros melhora a 
    eficiência do sistema e reduz a proliferação de poeira no ambiente.
    ⚠️ Riscos: A presença de poeira acumulada pode causar problemas respiratórios em usuários sensíveis, além de reduzir a eficiência 
    do sistema e aumentar o consumo de energia.
    🛡️ EPIs Recomendados: Máscara de proteção contra poeiras, luvas nitrílicas ou de látex e óculos de segurança em ambientes com maior acúmulo."""
        ],
        [
            "Limpeza da Condensadora",
            "Trimestral",
            """📄 Descrição: Limpeza externa da unidade condensadora utilizando jato de água suave, escova de cerdas macias ou pincel, removendo 
    poeira, folhas e outros detritos das aletas, serpentina e área da ventoinha. Deve-se garantir a ausência de obstruções ao fluxo de ar.
    ⚠️ Riscos: Obstruções causam superaquecimento do compressor, podendo gerar falha grave no sistema. Em locais elevados, o risco de queda é alto.
    🛡️ EPIs Recomendados: Cinto de segurança e linhas de vida para altura, capacete, botas antiderrapantes, luvas de segurança e óculos de proteção."""
        ],
        [
            "Limpeza da Evaporadora - Serpentina",
            "Semestral",
            """📄 Descrição: Aplicação de produto desengordurante e desinfetante específico para serpentina, utilizando spray ou espuma de limpeza. 
    Após o tempo de ação, deve-se enxaguar com jato leve e garantir a secagem. Essa limpeza remove biofilmes e agentes microbiológicos.
    ⚠️ Riscos: Proliferação de fungos, bactérias e odores indesejáveis por falta de limpeza adequada.
    🛡️ EPIs Recomendados: Máscara, óculos de proteção e luvas nitrílicas para evitar contato com produtos químicos e microrganismos."""
        ],
        [
            "Teste de Pressão do Sistema",
            "Semestral",
            """📄 Descrição: Conectar o conjunto de manômetros ao sistema e verificar as pressões de alta e baixa. Comparar os valores com os 
    parâmetros indicados pelo fabricante. O teste pode indicar vazamentos ou obstruções no circuito.
    ⚠️ Riscos: Equipamentos pressurizados representam risco de explosão e vazamentos de gás refrigerante caso manuseados incorretamente.
    🛡️ EPIs Recomendados: Óculos de segurança, luvas de proteção e avental. O técnico deve estar capacitado e habilitado."""
        ],
        [
            "Recolhimento de Gás Refrigerante",
            "Quando necessário",
            """📄 Descrição: Em casos de manutenção corretiva ou substituição de componentes do circuito frigorígeno, o gás refrigerante deve ser 
    recolhido do sistema utilizando equipamento adequado (recovery unit). O recolhimento é obrigatório por lei ambiental e deve ser feito 
    com sistema fechado, direcionando o gás para um cilindro de recuperação certificado.
    ⚠️ Riscos: O não recolhimento pode causar liberação de gases nocivos à camada de ozônio e riscos à saúde dos trabalhadores. 
    Pressões elevadas podem provocar explosões ou vazamentos.
    🛡️ EPIs Recomendados: Luvas de proteção química, máscara com filtro apropriado (gases e vapores), óculos de proteção com vedação lateral. 
    Uso de avental e sapato de segurança é recomendado."""
        ],
        [
            "Recarga de Gás Refrigerante",
            "Anual ou conforme diagnóstico técnico",
            """📄 Descrição: Realizar a recarga do gás refrigerante após teste de pressão e verificação da necessidade. A carga deve ser feita com balança digital 
    e manômetros apropriados, respeitando o tipo de fluido do sistema. A recarga deve ser exata, evitando sobrecarga ou carga insuficiente.
    ⚠️ Riscos: Gás em excesso pode elevar a pressão além do limite do sistema, levando a falhas mecânicas. Gás insuficiente compromete a eficiência térmica 
    e causa superaquecimento do compressor. Vazamentos impactam a saúde e o meio ambiente.
    🛡️ EPIs Recomendados: Máscara com filtro para gases, luvas nitrílicas, óculos de proteção, sapato fechado. Uso de cilindros certificados e ventilação adequada.
    📏 Faixas de pressão de trabalho por tipo de gás (em funcionamento – ciclo de refrigeração com temperatura ambiente de ~25°C a 35°C):
    • R-410A: Pressão de baixa ~115-130 psi | Pressão de alta ~360-420 psi;
    • R-32: Pressão de baixa ~120-140 psi | Pressão de alta ~400-465 psi;
    • R-22 (em desuso): Pressão de baixa ~60-75 psi | Pressão de alta ~250-300 psi;
    ❗ Observação: As pressões variam conforme temperatura ambiente, carga térmica e condição do sistema. Sempre seguir as instruções do fabricante."""
        ],
        [
            "Balanceamento Termodinâmico",
            "Anual",
            """📄 Descrição: Medir a temperatura de insuflamento (saída do ar) e de retorno com termômetros digitais. Caso necessário, realizar ajustes 
    nos controles de carga, fluxo ou vazão para manter o sistema dentro da faixa ideal de operação térmica.
    ⚠️ Riscos: Um sistema desbalanceado opera com menor eficiência, elevando o consumo de energia e o desgaste dos componentes internos.
    🛡️ EPIs Recomendados: Luvas térmicas e proteção ocular ao manusear componentes metálicos ou áreas aquecidas."""
        ],
        [
            "Manutenção Elétrica",
            "Semestral",
            """📄 Descrição: Verificar todas as conexões elétricas, medir a tensão e corrente com multímetro, apertar conectores e inspecionar isolamentos 
    e disjuntores. Verificar se há sinais de aquecimento, corrosão ou rompimento de cabos.
    ⚠️ Riscos: Choque elétrico, curto-circuito, falhas por mau contato. Pode gerar incêndios em casos graves.
    🛡️ EPIs Recomendados: Luvas isolantes, botas dielétricas, óculos de proteção e uso obrigatório de ferramentas isoladas. Equipamento deve estar desenergizado."""
        ],
        [
            "Inspeção de Tubulações",
            "Anual",
            """📄 Descrição: Verificação do isolamento térmico das tubulações de cobre, especialmente nas linhas de sucção. Substituir isolantes ressecados, rasgados 
    ou ausentes. Verificar fixações, trepidações e riscos de abrasão nas curvas.
    ⚠️ Riscos: Perda de eficiência térmica, formação de condensação e gotejamento, risco de corrosão.
    🛡️ EPIs Recomendados: Luvas de proteção, óculos de segurança e escada com travamento se necessário."""
        ],


        [
            "Inspeção Visual Geral",
            "Mensal",
            """📄 Descrição: Avaliar visualmente a integridade estrutural do renovador de ar, verificando corrosão, acúmulo de sujeira, deformações, folgas ou partes soltas. Checar o estado externo do gabinete, grelhas e dutos ligados.
    ⚠️ Riscos: Componentes soltos ou corroídos podem comprometer a estabilidade e segurança do equipamento, além de diminuir a eficiência do sistema.
    🛡️ EPIs Recomendados: Luvas de proteção, óculos de segurança e lanterna para inspeção em locais pouco iluminados."""
        ],
        [
            "Limpeza de Filtros e Entradas/Saídas de Ar",
            "Mensal",
            """📄 Descrição: Remover filtros laváveis e grelhas de entrada e saída de ar para lavagem com sabão neutro. Em filtros descartáveis, verificar substituição. Remover poeira e resíduos acumulados.
    ⚠️ Riscos: Filtros sujos reduzem o fluxo de ar, aumentam o esforço do motor e podem ser foco de microrganismos prejudiciais à saúde.
    🛡️ EPIs Recomendados: Máscara PFF2, luvas nitrílicas, óculos de proteção e recipiente para resíduos."""
        ],
        [
            "Aperto de Fixações e Suportes",
            "Trimestral",
            """📄 Descrição: Verificar e reapertar todos os parafusos, suportes e elementos de fixação do renovador e de sua estrutura de montagem. Avaliar vibração excessiva e deslocamento.
    ⚠️ Riscos: Fixações frouxas podem causar ruído, vibração, queda de componentes ou mau funcionamento do equipamento.
    🛡️ EPIs Recomendados: Luvas de segurança, capacete, escada com trava e ferramentas isoladas."""
        ],
        [
            "Lubrificação de Mancais e Eixos",
            "Trimestral",
            """📄 Descrição: Aplicar lubrificante adequado nos mancais e eixos do ventilador, conforme especificações do fabricante. Retirar excesso para evitar escorrimento.
    ⚠️ Riscos: Falta de lubrificação pode causar superaquecimento, travamento ou desgaste acelerado do motor e eixo.
    🛡️ EPIs Recomendados: Luvas impermeáveis, óculos de segurança, pano de limpeza e graxa apropriada."""
        ],
        [
            "Inspeção Elétrica do Motor",
            "Semestral",
            """📄 Descrição: Verificar estado dos cabos de alimentação, bornes, conectores e componentes elétricos. Usar multímetro para aferir tensão, corrente e possíveis fugas.
    ⚠️ Riscos: Mau contato ou superaquecimento pode causar incêndios, choques elétricos e falhas no sistema.
    🛡️ EPIs Recomendados: Luvas isolantes, óculos de proteção, botas dielétricas e ferramentas isoladas. Equipamento deve estar desenergizado."""
        ],
        [
            "Medição de Vazão e Pressão",
            "Anual",
            """📄 Descrição: Medir a vazão de ar (m³/h) e a pressão estática (mmCA) utilizando instrumentos apropriados como anemômetro ou manômetro. Ajustar regulagens se necessário.
    ⚠️ Riscos: Vazões abaixo da projetada comprometem a renovação do ar e aumentam a carga contaminante no ambiente.
    🛡️ EPIs Recomendados: Escada com trava, luvas, óculos de proteção e instrumentos de medição calibrados."""
        ],
        [
            "Limpeza de Rotor / Hélices",
            "Anual",
            """📄 Descrição: Remover partículas sólidas, poeira, gordura ou qualquer resíduo acumulado nas pás do rotor ou hélices. Utilizar escova, pano e solução neutra.
    ⚠️ Riscos: Acúmulo de sujeira pode causar desequilíbrio, ruído excessivo, desgaste e vibração.
    🛡️ EPIs Recomendados: Luvas de borracha, máscara facial, óculos de proteção e pano úmido."""
        ],
        [
            "Verificação de Ruído e Vibração",
            "Semestral",
            """📄 Descrição: Ligar o equipamento e observar o nível de ruído e vibração. Analisar se há sons metálicos, desbalanceamento ou batidas no sistema. Anotar irregularidades.
    ⚠️ Riscos: Vibrações excessivas causam desgaste de peças móveis e risco de desprendimento de partes rotativas.
    🛡️ EPIs Recomendados: Protetor auricular, luvas e roupas justas para evitar enroscos."""
        ],
        [
            "Preenchimento de Registro",
            "Todas",
            """📄 Descrição: Preencher o checklist de manutenção com todas as observações realizadas, técnicos responsáveis, data da execução e assinaturas. Registrar valores medidos e serviços corretivos.
    ⚠️ Riscos: Ausência de registros dificulta o controle da vida útil do equipamento e pode gerar falhas recorrentes.
    🛡️ EPIs Recomendados: Caneta, formulário, prancheta e atenção às anotações técnicas."""    
        ],


        [
            "Manutenção Geral e Reparos",
            "Anual",
            """📄 Descrição: Avaliação completa do sistema quanto a ruídos, vibrações, oxidação, folgas mecânicas, parafusos soltos e estado de suportes. 
    Realizar lubrificações, ajustes finos ou substituições menores conforme necessidade identificada.
    ⚠️ Riscos: Vibrações e falhas mecânicas acumuladas podem levar a danos graves no sistema ou até paralisação total.
    🛡️ EPIs Recomendados: Capacete, luvas, botas com biqueira de aço, óculos de proteção e máscara em locais com poeira."""
        ]
    ]



    # Lista formatada com separação de blocos
    for atividade, periodicidade, descricao in atividades:
        # Cabeçalho da atividade
        p_atividade = add_paragraph(f"✔️ {atividade} – {periodicidade}", bold=True)
        p_atividade.alignment = WD_ALIGN_PARAGRAPH.LEFT

        # Exibir cada linha da descrição formatada
        for linha in descricao.strip().split("\n"):
            p = add_paragraph(linha.strip())
            p.alignment = WD_ALIGN_PARAGRAPH.LEFT

    # Bloco final de instruções de segurança
    add_paragraph("🔒 Instruções Gerais de Segurança:", bold=True).alignment = WD_ALIGN_PARAGRAPH.LEFT

    add_paragraph(
        "Antes de qualquer procedimento, certifique-se de que o equipamento esteja desenergizado e utilize "
        "os EPIs adequados."
    ).alignment = WD_ALIGN_PARAGRAPH.LEFT

    add_paragraph(
        "No caso de unidades condensadoras instaladas em altura, a empresa executante deve apresentar um plano de "
        "trabalho detalhado, fazendo uso de cinto de segurança e linhas de vida para prevenir acidentes."
    ).alignment = WD_ALIGN_PARAGRAPH.LEFT

    add_paragraph(
        "A responsabilidade de garantir profissionais qualificados, sobretudo para manutenções elétricas, é da empresa contratada, "
        "evitando riscos graves de choques ou danos aos equipamentos."
    ).alignment = WD_ALIGN_PARAGRAPH.LEFT

    # Nova página
    doc.add_page_break()


    # ---------------------------------------------------------------------------
    # SUMÁRIO DE EQUIPAMENTOS (TEXTO + TABELA)
    # ---------------------------------------------------------------------------
    add_heading("2. Sumário de Equipamentos e Características dos Splits", level=1)

    add_paragraph(
        "📋 Nesta seção, apresentamos um panorama geral dos sistemas de climatização instalados em cada ambiente do projeto. "
        "A listagem dos equipamentos e suas características técnicas tem como objetivo auxiliar no planejamento de manutenções preventivas, "
        "identificação de modelos e controle de peças de reposição."
    )

    # Busca pelos ambientes vinculados ao projeto
    ambientes = Ambiente.objects.filter(projeto=projeto)
    resumo_equipamentos = []

    if not ambientes.exists():
        add_paragraph("❌ Nenhum ambiente cadastrado foi encontrado para este projeto.")
    else:
        for idx, ambiente in enumerate(ambientes, 1):
            caminho_xlsx = os.path.join(
                "/var/www/html/cag/arquivos_cargas_termicas",
                f"projeto_{projeto.nome_projeto}",
                f"{ambiente.nome_ambiente}_resultados_termicos.xlsx"
            )
            carga_termica = 0
            if os.path.exists(caminho_xlsx):
                df = pd.read_excel(caminho_xlsx, engine='openpyxl')
                if 'Carga Térmica Total Ambiente' in df.columns:
                    carga_termica = df['Carga Térmica Total Ambiente'].max()

            aparelhos = determinar_aparelho(carga_termica, ambiente.tipo_aparelho or "hiwall")
            if not aparelhos or not isinstance(aparelhos, list):
                continue

            # Texto descritivo orgânico por ambiente
            add_paragraph(
                f"📌 O ambiente **{ambiente.nome_ambiente}** apresenta os seguintes aparelhos para climatização "
            )

            # Agrupar modelos e capacidades por quantidade
            modelos_ambiente = {}
            for aparelho in aparelhos:
                modelo = aparelho.get("modelo", "-")
                capacidade = aparelho.get("capacidade_resfriamento_btu", "-")
                chave = (modelo, capacidade)
                modelos_ambiente[chave] = modelos_ambiente.get(chave, 0) + 1

            # Lista textual dos aparelhos (já agrupados por modelo e capacidade)
            for (modelo, capacidade), quantidade in modelos_ambiente.items():
                unidade_texto = "unidade" if quantidade == 1 else "unidades"
                add_paragraph(f"   • {quantidade} {unidade_texto} do equipamento {modelo}")

                # Adiciona para a tabela de resumo
                resumo_equipamentos.append({
                    'ambiente': ambiente.nome_ambiente,
                    'modelo': modelo,
                    'capacidade': capacidade,
                    'quantidade': quantidade
                })



    # Características técnicas gerais
    add_paragraph("🔧 Características Técnicas dos Sistemas Split:", bold=True)

    add_paragraph(
        "🔹 Condensadora: Instalada externamente, abriga o compressor, ventilador e serpentina. Está exposta às intempéries (sol, chuva, poluição), "
        "por isso exige limpezas periódicas e checagem das condições estruturais e de fixação."
    )
    add_paragraph(
        "🔹 Evaporadora: Unidade interna que realiza a troca térmica no ambiente. Seus filtros e serpentinas acumulam poeira e microrganismos, afetando "
        "a qualidade do ar e o desempenho do sistema. É essencial a higienização regular."
    )
    add_paragraph(
        "🔹 Tubulações Frigorígenas: Realizam o transporte do gás entre as unidades. Devem estar com isolamento íntegro para evitar condensações, "
        "perdas térmicas e corrosão externa."
    )
    add_paragraph(
        "🔹 Conexões Elétricas: Envolvem alimentação e comandos. Devem ser verificadas para evitar falhas, superaquecimento e riscos elétricos."
    )
    add_paragraph(
        "🔹 Balanceamento Termodinâmico: Garante que o sistema opere com eficiência. Envolve medição de pressão, temperatura e ajustes de vazão e carga de gás."
    )

    add_paragraph(
        "✅ A correta manutenção dos sistemas split proporciona economia de energia, conforto térmico e aumento da vida útil dos equipamentos, além de garantir "
        "a saúde dos usuários ao evitar a circulação de ar contaminado."
    )
    add_paragraph(
        "✅ Nas próximas páginas, são apresentados os planos de manutenção organizados por equipamento e por ambiente. "
        "Esses planos devem ser utilizados pelo técnico responsável para a execução das tarefas, preenchimento dos checklists "
        "e registro das manutenções realizadas, garantindo o acompanhamento histórico e a rastreabilidade das ações futuras."
    )


    # Tabela resumo com equipamentos agrupados por ambiente
    if resumo_equipamentos:
        add_paragraph("\n📊 Tabela Resumo de Equipamentos por Ambiente:", bold=True)

        # Agrupar por ambiente
        from collections import defaultdict
        agrupado = defaultdict(list)
        for item in resumo_equipamentos:
            agrupado[item['ambiente']].append(item)

        tabela = doc.add_table(rows=1, cols=4)
        tabela.style = 'Table Grid'
        hdr = tabela.rows[0].cells
        hdr[0].text = "Ambiente"
        hdr[1].text = "Modelo"
        hdr[2].text = "Capacidade (BTU/h)"
        hdr[3].text = "Quantidade"

        for ambiente_nome, equipamentos in agrupado.items():
            primeira_linha = True
            for eq in equipamentos:
                row = tabela.add_row().cells
                if primeira_linha:
                    row[0].text = ambiente_nome
                    primeira_linha = False
                else:
                    row[0].text = ""
                row[1].text = eq['modelo']
                row[2].text = str(eq['capacidade'])
                row[3].text = str(eq['quantidade'])

        # Alinhar células da tabela
        for row in tabela.rows:
            for cell in row.cells:
                if cell.paragraphs:
                    cell.paragraphs[0].alignment = WD_ALIGN_PARAGRAPH.CENTER
                    for run in cell.paragraphs[0].runs:
                        run.font.size = Pt(10)

    # Nova página
    doc.add_page_break()


    # ----------------------------------------------------------------------------
    # 2.1 Aparelhos de Renovação de Ar
    # ----------------------------------------------------------------------------
    add_heading("2.1 Aparelhos de Renovação de Ar", level=2)
    add_paragraph(
        "Os aparelhos de renovação de ar têm como função principal promover a troca do ar interno por ar externo, garantindo qualidade do ar respirado "
        "e adequação à norma da ANVISA. A renovação é essencial para evitar acúmulo de CO₂, odores, microrganismos e outros contaminantes no ambiente interno."
    )
    add_paragraph(
        "O sistema de renovação complementa os equipamentos de climatização, especialmente em ambientes fechados com grande permanência de pessoas. "
        "A escolha dos equipamentos é feita com base na área do ambiente, altura do pé-direito, número de ocupantes e taxa de renovação exigida."
    )

    resumo_renovadores = []

    for ambiente in ambientes:
        try:
            dados_term = DadosTermicos.objects.get(ambiente=ambiente)
        except Exception:
            dados_term = None

        if dados_term:
            area_piso = dados_term.area_piso or 0
            pe_direito = dados_term.pe_direito or 0
            numero_pessoas = dados_term.numero_pessoas or 0
            taxa_renovacao = dados_term.taxa_renovacao or 0
        else:
            area_piso, pe_direito, numero_pessoas, taxa_renovacao = 0, 0, 0, 0

        info_ren = escolher_aparelho_renovacao(area_piso, pe_direito, numero_pessoas, taxa_renovacao)
        comb_renov = info_ren.get("melhor_comb", [])

        if comb_renov:
            vazao_soma = 0
            descricao_modelos = []

            for rn in comb_renov:
                velocidades = rn.get('velocidades', [])
                vel = velocidades[-1] if velocidades else {}
                modelo = rn.get('modelo', '-')
                vazao = vel.get('vazao_maxima_m3h', 0)
                descricao_modelos.append(f"• 1 unidade do renovador {modelo} com vazão de {vazao} m³/h")
                vazao_soma += vazao

                resumo_renovadores.append({
                    'ambiente': ambiente.nome_ambiente,
                    'modelo': modelo,
                    'vazao': vazao,
                    'pressao': vel.get('pressao_maxima_mmca', '-'),
                    'ruido': vel.get('nivel_pressao_sonora_dba', '-'),
                    'potencia': vel.get('potencia_motor_w', '-')
                })

            add_heading(f"Ambiente: {ambiente.nome_ambiente}", level=3)
            add_paragraph(f"📌 O ambiente **{ambiente.nome_ambiente}** apresenta os seguintes equipamentos para renovação de ar:")
            for linha in descricao_modelos:
                add_paragraph(linha)

            vazao_necessaria = info_ren.get('vazao_total_ar_exterior', 0)
            add_paragraph(f"✔ Vazão Total Necessária: {vazao_necessaria:.2f} m³/h")
            add_paragraph(f"✔ Vazão Combinada dos Aparelhos: {vazao_soma:.2f} m³/h")

            if vazao_soma >= vazao_necessaria:
                add_paragraph("✅ A soma da vazão combinada atende à necessidade mínima de renovação de ar do ambiente.")
            else:
                add_paragraph("⚠️ A vazão combinada dos aparelhos é inferior à necessidade do ambiente. Recomenda-se rever a combinação ou considerar ventilação natural complementar.")

            add_paragraph("_" * 70)

    # ----------------------------------------------------------------------------
    # 2.2 Tabela Resumo dos Aparelhos de Renovação de Ar
    # ----------------------------------------------------------------------------
    if resumo_renovadores:
        add_heading("2.2 Tabela Resumo dos Aparelhos de Renovação de Ar", level=2)
        tabela_resumo = doc.add_table(rows=1, cols=6)
        tabela_resumo.style = "Table Grid"
        hdr = tabela_resumo.rows[0].cells
        headers = ["Ambiente", "Modelo", "Vazão (m³/h)", "Pressão (mmCA)", "Ruído (dBA)", "Potência (W)"]
        for i, h in enumerate(headers):
            hdr[i].text = h
            hdr[i].paragraphs[0].alignment = WD_ALIGN_PARAGRAPH.CENTER
            run = hdr[i].paragraphs[0].runs[0]
            run.font.name = 'Arial'
            run.font.size = Pt(11)

        for item in resumo_renovadores:
            row = tabela_resumo.add_row().cells
            row[0].text = item['ambiente']
            row[1].text = item['modelo']
            row[2].text = str(item['vazao'])
            row[3].text = str(item['pressao'])
            row[4].text = str(item['ruido'])
            row[5].text = str(item['potencia'])

            for cell in row:
                cell.paragraphs[0].alignment = WD_ALIGN_PARAGRAPH.CENTER
                run = cell.paragraphs[0].runs[0]
                run.font.name = 'Arial'
                run.font.size = Pt(11)

    doc.add_page_break()



    # ----------------------------------------------------------------------------
    # CHECKLISTS POR AMBIENTE E APARELHO
    # ----------------------------------------------------------------------------

    # Cabeçalho para cada folha de checklist
    def adicionar_cabecalho_checklist(doc, idx_ambiente, idx_aparelho, ambiente, aparelho, folha_atual, total_folhas):
        add_heading(f"3.{idx_ambiente}.{idx_aparelho} - {ambiente.nome_ambiente} - Equipamento {idx_aparelho}", level=2)
        add_paragraph(f"📄 FOLHA {folha_atual} DE {total_folhas}", bold=True)
        add_paragraph(f"Modelo: {aparelho.get('modelo', '-')}", bold=True)
        add_paragraph("Patrimônio: ______________________   RT: ______________________   CREA/CFT: ______________________", bold=True)


    # Lista detalhada com subatividades
    atividades_detalhadas = [
        ("Limpeza dos Filtros da Evaporadora", "Mensal", [
            "Retirar os filtros da unidade interna",
            "Lavar e secar à sombra",
            "Reinstalar corretamente os filtros"
        ]),
        ("Limpeza da Condensadora", "Trimestral", [
            "Remover sujeiras com jato de água suave",
            "Inspecionar obstruções ao fluxo de ar",
            "Verificar plano de trabalho em altura (se necessário)"
        ]),
        ("Limpeza da Evaporadora - Serpentina", "Semestral", [
            "Aplicar produto desinfetante (spray/espuma)",
            "Enxaguar com jato leve",
            "Garantir secagem completa"
        ]),
        ("Teste de Pressão do Sistema", "Semestral", [
            "Conectar manômetros de alta e baixa",
            "Verificar as pressões em funcionamento",
            "Comparar com valores do fabricante e registrar",
        ]),
        ("Recolhimento de Gás Refrigerante", "Quando necessário", [
            "Recolher o gás com sistema fechado",
            "Armazenar em cilindro certificado",
            "Verificar estanqueidade durante o processo"
        ]),
        ("Recarga de Gás Refrigerante", "Anual ou conforme diagnóstico técnico", [
            "Verificar pressão e nível de gás",
            "Realizar recarga com precisão",
            "Verificar vazamentos após recarga"
        ]),
        ("Balanceamento Termodinâmico", "Anual", [
            "Realizar o balanceamento e registrar etapas",
        ]),
        ("Manutenção Elétrica", "Semestral", [
            "Verificar conectores e cabos",
            "Medir tensão e corrente com multímetro",
            "Apertar conexões e inspecionar disjuntores",
            "Checar sinais de aquecimento ou desgaste"
        ]),
        ("Inspeção de Tubulações", "Anual", [
            "Verificar estado do isolamento térmico",
            "Substituir partes danificadas ou ausentes",
            "Checar fixações e trepidações",
            "Avaliar possíveis riscos de abrasão"
        ]),
        ("Manutenção Geral e Reparos", "Anual", [
            "Verificar ruídos, vibrações e folgas",
            "Inspecionar corrosões e suportes",
            "Lubrificar e ajustar componentes",
            "Executar pequenos reparos se necessário"
        ]),
    ]

    # Primeira metade das atividades (5 principais)
    atividades_parte1 = atividades_detalhadas[:5]
    # Segunda metade
    atividades_parte2 = atividades_detalhadas[5:]


    add_heading("3. Checklists de Manutenção por Equipamento", level=1)

    for idx_ambiente, ambiente in enumerate(ambientes, 1):
        caminho_xlsx = os.path.join(
            "/var/www/html/cag/arquivos_cargas_termicas",
            f"projeto_{projeto.nome_projeto}",
            f"{ambiente.nome_ambiente}_resultados_termicos.xlsx"
        )
        carga_termica = 0
        if os.path.exists(caminho_xlsx):
            df = pd.read_excel(caminho_xlsx, engine='openpyxl')
            if 'Carga Térmica Total Ambiente' in df.columns:
                carga_termica = df['Carga Térmica Total Ambiente'].max()

        aparelhos = determinar_aparelho(carga_termica, ambiente.tipo_aparelho or "hiwall")
        if not aparelhos or not isinstance(aparelhos, list):
            continue

        for idx_aparelho, aparelho in enumerate(aparelhos, 1):
            atividades_parte1 = atividades_detalhadas[:5]
            atividades_parte2 = atividades_detalhadas[5:]

            total_paginas = 2
            for pagina, atividades_pagina in enumerate([atividades_parte1, atividades_parte2], 1):
                adicionar_cabecalho_checklist(
                    doc, idx_ambiente, idx_aparelho, ambiente, aparelho,
                    folha_atual=pagina,
                    total_folhas=total_paginas
                )

                tabela = doc.add_table(rows=1, cols=3)
                add_table_style(tabela)
                hdr = tabela.rows[0].cells
                hdr[0].text = "Atividade / Subatividade"
                hdr[1].text = "Periodicidade"
                hdr[2].text = "☐ Checklist"

                for atividade, periodicidade, subitens in atividades_pagina:
                    row = tabela.add_row().cells
                    row[0].text = atividade
                    row[1].text = periodicidade
                    row[2].text = "☐"
                    for sub in subitens:
                        sub_row = tabela.add_row().cells
                        sub_row[0].text = f"   → {sub}"
                        sub_row[1].text = ""
                        sub_row[2].text = "☐"

                # ✅ Só adiciona page break se não for a última página do último equipamento do último ambiente
                ultimo_ambiente = idx_ambiente == len(ambientes)
                ultimo_aparelho = idx_aparelho == len(aparelhos)
                ultima_pagina = pagina == total_paginas

                if not (ultimo_ambiente and ultimo_aparelho and ultima_pagina):
                    doc.add_page_break()


    # ----------------------------------------------------------------------------
    # 3.1 Checklists de Manutenção – Renovadores de Ar
    # ----------------------------------------------------------------------------
    add_heading("3.1 Checklists de Manutenção por Equipamento – Renovadores de Ar", level=1)

    for idx_ambiente, ambiente in enumerate(ambientes, 1):
        try:
            dados_term = DadosTermicos.objects.get(ambiente=ambiente)
        except Exception:
            dados_term = None

        area = dados_term.area_piso if dados_term else 0
        altura = dados_term.pe_direito if dados_term else 0
        pessoas = dados_term.numero_pessoas if dados_term else 0
        renovacao = dados_term.taxa_renovacao if dados_term else 0

        info_ren = escolher_aparelho_renovacao(area, altura, pessoas, renovacao)
        aparelhos_renov = info_ren.get("melhor_comb", [])

        if not aparelhos_renov:
            continue

        for idx_aparelho, aparelho in enumerate(aparelhos_renov, 1):
            velocidades = aparelho.get("velocidades", [])
            vel = velocidades[-1] if velocidades else {}

            # Cabeçalho padronizado (igual ao dos splits)
            add_heading(f"3.1.{idx_ambiente}.{idx_aparelho} - {ambiente.nome_ambiente} - Renovador de Ar", level=2)
            add_paragraph(f"📄 FOLHA 1 DE 1", bold=True)
            add_paragraph(f"Modelo: {aparelho.get('modelo', '-')}", bold=True)
            add_paragraph("Patrimônio: ______________________   RT: ______________________   CREA/CFT: ______________________", bold=True)

            # Tabela de checklist
            tabela = doc.add_table(rows=1, cols=3)
            add_table_style(tabela)
            hdr = tabela.rows[0].cells
            hdr[0].text = "Atividade / Subatividade"
            hdr[1].text = "Periodicidade"
            hdr[2].text = "☐ Checklist"

            atividades_renovador = [
                ("Inspeção Visual Geral", "Mensal", ["Verificar estrutura, corrosão, sujeira ou folgas no equipamento."]),
                ("Limpeza de Filtros e Entradas/Saídas de Ar", "Mensal", ["Retirar sujeiras, folhas, detritos ou gordura acumulada."]),
                ("Aperto de Fixações e Suportes", "Trimestral", ["Verificar vibrações e folgas em parafusos, suportes e base."]),
                ("Lubrificação de Mancais e Eixos", "Trimestral", ["Aplicar graxa ou óleo conforme manual do fabricante."]),
                ("Inspeção Elétrica do Motor", "Semestral", ["Verificar cabos, aquecimento, ruídos e consumo de corrente."]),
                ("Medição de Vazão e Pressão", "Anual", ["Confirmar vazão de ar emitida e ajustar se necessário."]),
                ("Limpeza de Rotor / Hélices", "Anual", ["Remover sujeiras acumuladas nas pás do ventilador ou turbina."]),
                ("Verificação de Ruído e Vibração", "Semestral", ["Checar barulhos incomuns e desequilíbrios no giro."]),
            ]

            for atividade, periodicidade, subitens in atividades_renovador:
                row = tabela.add_row().cells
                row[0].text = atividade
                row[1].text = periodicidade
                row[2].text = "☐"
                for sub in subitens:
                    sub_row = tabela.add_row().cells
                    sub_row[0].text = f"   → {sub}"
                    sub_row[1].text = ""
                    sub_row[2].text = "☐"

            doc.add_paragraph("")  # Espaçamento
            doc.add_page_break()



    # ---------------------------------------------------------------------------
    # RESPONSABILIDADES E CONSIDERAÇÕES FINAIS
    # ---------------------------------------------------------------------------
    add_heading("4. Responsabilidades e Considerações Finais", level=1)

    add_paragraph(
        "A execução do Plano de Manutenção, Operação e Controle (PMOC) exige o cumprimento rigoroso de normas técnicas e legais. "
        "Todas as intervenções devem ser realizadas sob a supervisão de um Responsável Técnico (RT), legalmente habilitado e registrado "
        "no Conselho Regional de Engenharia e Agronomia (CREA) ou no Conselho Federal dos Técnicos (CFT)."
    )

    add_paragraph(
        "A empresa contratada é legal e tecnicamente responsável por assegurar condições de trabalho seguras, utilização adequada dos "
        "equipamentos de proteção, capacitação das equipes envolvidas e o cumprimento das exigências estabelecidas pela ANVISA, Ministério "
        "do Trabalho e demais órgãos competentes."
    )

    add_paragraph("🔧 Responsabilidades da empresa executante:", bold=True)
    add_paragraph(
        "• ✅ Garantir o uso correto e obrigatório dos EPIs e EPCs em todas as manutenções.\n"
        "• 📋 Apresentar plano de trabalho para intervenções em altura, com análise preliminar de risco.\n"
        "• ⚡ Permitir acesso a circuitos energizados somente a profissionais habilitados em eletrotécnica.\n"
        "• 📝 Manter registros organizados e auditáveis de todas as atividades de manutenção (data, técnicos responsáveis, pressões, tensões, peças substituídas, observações técnicas, etc.).",
        align=WD_ALIGN_PARAGRAPH.LEFT
    )

    add_paragraph("🔍 Itens que devem ser verificados em cada manutenção preventiva:", bold=True)
    add_paragraph(
        "• 🌀 Condição de limpeza dos filtros, serpentinas e bandejas.\n"
        "• 🔧 Estado das tubulações frigorígenas e isolamento térmico.\n"
        "• 🔊 Operação do compressor e ventiladores, com atenção a ruídos anormais.\n"
        "• ❄️ Pressões de trabalho do gás refrigerante compatíveis com o fluido utilizado (R-410A, R-32, etc.).\n"
        "• 🔌 Conexões elétricas firmes, sem aquecimento excessivo ou faíscas.\n"
        "• 🌡️ Temperaturas de insuflamento e retorno para avaliação do desempenho térmico.\n"
        "• 📂 Preenchimento do checklist, com evidências de execução e correções realizadas.",
        align=WD_ALIGN_PARAGRAPH.LEFT
    )

    add_paragraph("⚠️ Consequências da negligência:", bold=True)
    add_paragraph(
        "A ausência de manutenção adequada compromete a qualidade do ar interno, reduz a eficiência energética dos sistemas, acelera "
        "o desgaste dos componentes e pode causar falhas operacionais graves. Além disso, eleva significativamente os custos de reparo, "
        "aumenta o risco de acidentes de trabalho e descumpre exigências legais impostas por normativas como a Portaria GM/MS nº 3.523/1998 "
        "e a Resolução RE nº 9/2003 da ANVISA."
    )

    add_paragraph(
        "A adoção efetiva deste PMOC é, portanto, um compromisso com a saúde dos ocupantes, a segurança operacional e a sustentabilidade "
        "energética da edificação."
    )



    # ---------------------------------------------------------------------------
    # RODAPÉ
    # ---------------------------------------------------------------------------
    for section in doc.sections:
        footer = section.footer
        footer_paragraph = footer.paragraphs[0] if footer.paragraphs else footer.add_paragraph()
        footer_paragraph.text = f"PMOC - {projeto.nome_projeto} - Gerado em {datetime.datetime.now().strftime('%d/%m/%Y')}"
        footer_paragraph.alignment = WD_ALIGN_PARAGRAPH.CENTER

    # ---------------------------------------------------------------------------
    # SALVAR E RETORNAR O ARQUIVO
    # ---------------------------------------------------------------------------
    buffer = io.BytesIO()
    doc.save(buffer)
    buffer.seek(0)

    nome_arq = f"PMOC_{projeto.nome_projeto}_{datetime.datetime.now().strftime('%Y%m%d')}.docx"
    return HttpResponse(
        buffer.read(),
        content_type='application/vnd.openxmlformats-officedocument.wordprocessingml.document',
        headers={'Content-Disposition': f'attachment; filename={nome_arq}'}
    )



    # ---------------------------------------------------------------------------
    # PARA INSERIR NO TERMO DE REFERENCIA DE MANUTENCAO
    # ---------------------------------------------------------------------------


def inserir_pmoc_no_doc(doc, projeto):
    """
    Insere o conteúdo do PMOC diretamente em um Document existente,
    para compor o Termo de Referência de Manutenção.
    """

    # Estilo padrão
    style = doc.styles['Normal']
    font = style.font
    font.name = 'Arial'
    font.size = Pt(11)

    def add_paragraph(text, bold=False, align=WD_ALIGN_PARAGRAPH.JUSTIFY):
        p = doc.add_paragraph()
        run = p.add_run(text)
        run.font.name = 'Arial'
        run.font.size = Pt(11)
        run.bold = bold
        p.alignment = align
        return p

    def add_table_style(table):
        table.style = 'Table Grid'
        for row in table.rows:
            for cell in row.cells:
                if cell.paragraphs:
                    cell.paragraphs[0].alignment = WD_ALIGN_PARAGRAPH.CENTER
                    for run in cell.paragraphs[0].runs:
                        run.font.size = Pt(10)

    def add_heading(text, level=1, center=False):
        h = doc.add_heading(text, level=level)
        h.alignment = WD_ALIGN_PARAGRAPH.CENTER if center else WD_ALIGN_PARAGRAPH.LEFT
        h.style.font.name = 'Arial'
        return h

# ---------------------------------------------------------------------------
    # INTRODUÇÃO E ETAPAS DO PMOC
    # ---------------------------------------------------------------------------
    add_heading("1. Introdução e Etapas do PMOC", level=3)

    # Texto introdutório com melhor separação de parágrafos
    add_paragraph(
        "Este Plano de Manutenção, Operação e Controle (PMOC) foi elaborado para o projeto "
        f"{projeto.nome_projeto}. O objetivo é assegurar a eficiência dos sistemas de climatização do tipo split, "
        "bem como manter adequada a qualidade do ar interior e a segurança de todos os usuários."
    )
    add_paragraph(
        "O PMOC segue as diretrizes estabelecidas pela Portaria GM/MS nº 3.523/1998 e pela Resolução RE nº 9/2003 da ANVISA, "
        "além de contemplar boas práticas de manutenção para evitar falhas, reduzir custos operacionais e prolongar "
        "a vida útil dos equipamentos."
    )

    # Subtítulo com negrito
    add_paragraph("📋 Etapas do PMOC e Detalhamento das Atividades:", bold=True)
    add_paragraph(
        "As etapas a seguir descrevem as principais atividades de manutenção, destacando procedimentos, riscos "
        "envolvidos e medidas de segurança pertinentes. A adoção destes processos visa garantir um funcionamento "
        "confiável, seguro e econômico dos sistemas de ar condicionado."
    )

    # Lista de atividades (com periodicidade e descrição mais detalhada)
    atividades = [
        [
            "Limpeza dos Filtros da Evaporadora",
            "Mensal",
            """📄 Descrição: Retirar os filtros de ar da unidade interna (evaporadora), lavar com água corrente e sabão neutro. Após a limpeza, 
    os filtros devem ser completamente secos à sombra antes de serem reinstalados. A higienização regular dos filtros melhora a 
    eficiência do sistema e reduz a proliferação de poeira no ambiente.
    ⚠️ Riscos: A presença de poeira acumulada pode causar problemas respiratórios em usuários sensíveis, além de reduzir a eficiência 
    do sistema e aumentar o consumo de energia.
    🛡️ EPIs Recomendados: Máscara de proteção contra poeiras, luvas nitrílicas ou de látex e óculos de segurança em ambientes com maior acúmulo."""
        ],
        [
            "Limpeza da Condensadora",
            "Trimestral",
            """📄 Descrição: Limpeza externa da unidade condensadora utilizando jato de água suave, escova de cerdas macias ou pincel, removendo 
    poeira, folhas e outros detritos das aletas, serpentina e área da ventoinha. Deve-se garantir a ausência de obstruções ao fluxo de ar.
    ⚠️ Riscos: Obstruções causam superaquecimento do compressor, podendo gerar falha grave no sistema. Em locais elevados, o risco de queda é alto.
    🛡️ EPIs Recomendados: Cinto de segurança e linhas de vida para altura, capacete, botas antiderrapantes, luvas de segurança e óculos de proteção."""
        ],
        [
            "Limpeza da Evaporadora - Serpentina",
            "Semestral",
            """📄 Descrição: Aplicação de produto desengordurante e desinfetante específico para serpentina, utilizando spray ou espuma de limpeza. 
    Após o tempo de ação, deve-se enxaguar com jato leve e garantir a secagem. Essa limpeza remove biofilmes e agentes microbiológicos.
    ⚠️ Riscos: Proliferação de fungos, bactérias e odores indesejáveis por falta de limpeza adequada.
    🛡️ EPIs Recomendados: Máscara, óculos de proteção e luvas nitrílicas para evitar contato com produtos químicos e microrganismos."""
        ],
        [
            "Teste de Pressão do Sistema",
            "Semestral",
            """📄 Descrição: Conectar o conjunto de manômetros ao sistema e verificar as pressões de alta e baixa. Comparar os valores com os 
    parâmetros indicados pelo fabricante. O teste pode indicar vazamentos ou obstruções no circuito.
    ⚠️ Riscos: Equipamentos pressurizados representam risco de explosão e vazamentos de gás refrigerante caso manuseados incorretamente.
    🛡️ EPIs Recomendados: Óculos de segurança, luvas de proteção e avental. O técnico deve estar capacitado e habilitado."""
        ],
        [
            "Recolhimento de Gás Refrigerante",
            "Quando necessário",
            """📄 Descrição: Em casos de manutenção corretiva ou substituição de componentes do circuito frigorígeno, o gás refrigerante deve ser 
    recolhido do sistema utilizando equipamento adequado (recovery unit). O recolhimento é obrigatório por lei ambiental e deve ser feito 
    com sistema fechado, direcionando o gás para um cilindro de recuperação certificado.
    ⚠️ Riscos: O não recolhimento pode causar liberação de gases nocivos à camada de ozônio e riscos à saúde dos trabalhadores. 
    Pressões elevadas podem provocar explosões ou vazamentos.
    🛡️ EPIs Recomendados: Luvas de proteção química, máscara com filtro apropriado (gases e vapores), óculos de proteção com vedação lateral. 
    Uso de avental e sapato de segurança é recomendado."""
        ],
        [
            "Recarga de Gás Refrigerante",
            "Anual ou conforme diagnóstico técnico",
            """📄 Descrição: Realizar a recarga do gás refrigerante após teste de pressão e verificação da necessidade. A carga deve ser feita com balança digital 
    e manômetros apropriados, respeitando o tipo de fluido do sistema. A recarga deve ser exata, evitando sobrecarga ou carga insuficiente.
    ⚠️ Riscos: Gás em excesso pode elevar a pressão além do limite do sistema, levando a falhas mecânicas. Gás insuficiente compromete a eficiência térmica 
    e causa superaquecimento do compressor. Vazamentos impactam a saúde e o meio ambiente.
    🛡️ EPIs Recomendados: Máscara com filtro para gases, luvas nitrílicas, óculos de proteção, sapato fechado. Uso de cilindros certificados e ventilação adequada.
    📏 Faixas de pressão de trabalho por tipo de gás (em funcionamento – ciclo de refrigeração com temperatura ambiente de ~25°C a 35°C):
    • R-410A: Pressão de baixa ~115-130 psi | Pressão de alta ~360-420 psi;
    • R-32: Pressão de baixa ~120-140 psi | Pressão de alta ~400-465 psi;
    • R-22 (em desuso): Pressão de baixa ~60-75 psi | Pressão de alta ~250-300 psi;
    ❗ Observação: As pressões variam conforme temperatura ambiente, carga térmica e condição do sistema. Sempre seguir as instruções do fabricante."""
        ],
        [
            "Balanceamento Termodinâmico",
            "Anual",
            """📄 Descrição: Medir a temperatura de insuflamento (saída do ar) e de retorno com termômetros digitais. Caso necessário, realizar ajustes 
    nos controles de carga, fluxo ou vazão para manter o sistema dentro da faixa ideal de operação térmica.
    ⚠️ Riscos: Um sistema desbalanceado opera com menor eficiência, elevando o consumo de energia e o desgaste dos componentes internos.
    🛡️ EPIs Recomendados: Luvas térmicas e proteção ocular ao manusear componentes metálicos ou áreas aquecidas."""
        ],
        [
            "Manutenção Elétrica",
            "Semestral",
            """📄 Descrição: Verificar todas as conexões elétricas, medir a tensão e corrente com multímetro, apertar conectores e inspecionar isolamentos 
    e disjuntores. Verificar se há sinais de aquecimento, corrosão ou rompimento de cabos.
    ⚠️ Riscos: Choque elétrico, curto-circuito, falhas por mau contato. Pode gerar incêndios em casos graves.
    🛡️ EPIs Recomendados: Luvas isolantes, botas dielétricas, óculos de proteção e uso obrigatório de ferramentas isoladas. Equipamento deve estar desenergizado."""
        ],
        [
            "Inspeção de Tubulações",
            "Anual",
            """📄 Descrição: Verificação do isolamento térmico das tubulações de cobre, especialmente nas linhas de sucção. Substituir isolantes ressecados, rasgados 
    ou ausentes. Verificar fixações, trepidações e riscos de abrasão nas curvas.
    ⚠️ Riscos: Perda de eficiência térmica, formação de condensação e gotejamento, risco de corrosão.
    🛡️ EPIs Recomendados: Luvas de proteção, óculos de segurança e escada com travamento se necessário."""
        ],


        [
            "Inspeção Visual Geral",
            "Mensal",
            """📄 Descrição: Avaliar visualmente a integridade estrutural do renovador de ar, verificando corrosão, acúmulo de sujeira, deformações, folgas ou partes soltas. Checar o estado externo do gabinete, grelhas e dutos ligados.
    ⚠️ Riscos: Componentes soltos ou corroídos podem comprometer a estabilidade e segurança do equipamento, além de diminuir a eficiência do sistema.
    🛡️ EPIs Recomendados: Luvas de proteção, óculos de segurança e lanterna para inspeção em locais pouco iluminados."""
        ],
        [
            "Limpeza de Filtros e Entradas/Saídas de Ar",
            "Mensal",
            """📄 Descrição: Remover filtros laváveis e grelhas de entrada e saída de ar para lavagem com sabão neutro. Em filtros descartáveis, verificar substituição. Remover poeira e resíduos acumulados.
    ⚠️ Riscos: Filtros sujos reduzem o fluxo de ar, aumentam o esforço do motor e podem ser foco de microrganismos prejudiciais à saúde.
    🛡️ EPIs Recomendados: Máscara PFF2, luvas nitrílicas, óculos de proteção e recipiente para resíduos."""
        ],
        [
            "Aperto de Fixações e Suportes",
            "Trimestral",
            """📄 Descrição: Verificar e reapertar todos os parafusos, suportes e elementos de fixação do renovador e de sua estrutura de montagem. Avaliar vibração excessiva e deslocamento.
    ⚠️ Riscos: Fixações frouxas podem causar ruído, vibração, queda de componentes ou mau funcionamento do equipamento.
    🛡️ EPIs Recomendados: Luvas de segurança, capacete, escada com trava e ferramentas isoladas."""
        ],
        [
            "Lubrificação de Mancais e Eixos",
            "Trimestral",
            """📄 Descrição: Aplicar lubrificante adequado nos mancais e eixos do ventilador, conforme especificações do fabricante. Retirar excesso para evitar escorrimento.
    ⚠️ Riscos: Falta de lubrificação pode causar superaquecimento, travamento ou desgaste acelerado do motor e eixo.
    🛡️ EPIs Recomendados: Luvas impermeáveis, óculos de segurança, pano de limpeza e graxa apropriada."""
        ],
        [
            "Inspeção Elétrica do Motor",
            "Semestral",
            """📄 Descrição: Verificar estado dos cabos de alimentação, bornes, conectores e componentes elétricos. Usar multímetro para aferir tensão, corrente e possíveis fugas.
    ⚠️ Riscos: Mau contato ou superaquecimento pode causar incêndios, choques elétricos e falhas no sistema.
    🛡️ EPIs Recomendados: Luvas isolantes, óculos de proteção, botas dielétricas e ferramentas isoladas. Equipamento deve estar desenergizado."""
        ],
        [
            "Medição de Vazão e Pressão",
            "Anual",
            """📄 Descrição: Medir a vazão de ar (m³/h) e a pressão estática (mmCA) utilizando instrumentos apropriados como anemômetro ou manômetro. Ajustar regulagens se necessário.
    ⚠️ Riscos: Vazões abaixo da projetada comprometem a renovação do ar e aumentam a carga contaminante no ambiente.
    🛡️ EPIs Recomendados: Escada com trava, luvas, óculos de proteção e instrumentos de medição calibrados."""
        ],
        [
            "Limpeza de Rotor / Hélices",
            "Anual",
            """📄 Descrição: Remover partículas sólidas, poeira, gordura ou qualquer resíduo acumulado nas pás do rotor ou hélices. Utilizar escova, pano e solução neutra.
    ⚠️ Riscos: Acúmulo de sujeira pode causar desequilíbrio, ruído excessivo, desgaste e vibração.
    🛡️ EPIs Recomendados: Luvas de borracha, máscara facial, óculos de proteção e pano úmido."""
        ],
        [
            "Verificação de Ruído e Vibração",
            "Semestral",
            """📄 Descrição: Ligar o equipamento e observar o nível de ruído e vibração. Analisar se há sons metálicos, desbalanceamento ou batidas no sistema. Anotar irregularidades.
    ⚠️ Riscos: Vibrações excessivas causam desgaste de peças móveis e risco de desprendimento de partes rotativas.
    🛡️ EPIs Recomendados: Protetor auricular, luvas e roupas justas para evitar enroscos."""
        ],
        [
            "Preenchimento de Registro",
            "Todas",
            """📄 Descrição: Preencher o checklist de manutenção com todas as observações realizadas, técnicos responsáveis, data da execução e assinaturas. Registrar valores medidos e serviços corretivos.
    ⚠️ Riscos: Ausência de registros dificulta o controle da vida útil do equipamento e pode gerar falhas recorrentes.
    🛡️ EPIs Recomendados: Caneta, formulário, prancheta e atenção às anotações técnicas."""    
        ],


        [
            "Manutenção Geral e Reparos",
            "Anual",
            """📄 Descrição: Avaliação completa do sistema quanto a ruídos, vibrações, oxidação, folgas mecânicas, parafusos soltos e estado de suportes. 
    Realizar lubrificações, ajustes finos ou substituições menores conforme necessidade identificada.
    ⚠️ Riscos: Vibrações e falhas mecânicas acumuladas podem levar a danos graves no sistema ou até paralisação total.
    🛡️ EPIs Recomendados: Capacete, luvas, botas com biqueira de aço, óculos de proteção e máscara em locais com poeira."""
        ]
    ]



    # Lista formatada com separação de blocos
    for atividade, periodicidade, descricao in atividades:
        # Cabeçalho da atividade
        p_atividade = add_paragraph(f"✔️ {atividade} – {periodicidade}", bold=True)
        p_atividade.alignment = WD_ALIGN_PARAGRAPH.LEFT

        # Exibir cada linha da descrição formatada
        for linha in descricao.strip().split("\n"):
            p = add_paragraph(linha.strip())
            p.alignment = WD_ALIGN_PARAGRAPH.LEFT

    # Bloco final de instruções de segurança
    add_paragraph("🔒 Instruções Gerais de Segurança:", bold=True).alignment = WD_ALIGN_PARAGRAPH.LEFT

    add_paragraph(
        "Antes de qualquer procedimento, certifique-se de que o equipamento esteja desenergizado e utilize "
        "os EPIs adequados."
    ).alignment = WD_ALIGN_PARAGRAPH.LEFT

    add_paragraph(
        "No caso de unidades condensadoras instaladas em altura, a empresa executante deve apresentar um plano de "
        "trabalho detalhado, fazendo uso de cinto de segurança e linhas de vida para prevenir acidentes."
    ).alignment = WD_ALIGN_PARAGRAPH.LEFT

    add_paragraph(
        "A responsabilidade de garantir profissionais qualificados, sobretudo para manutenções elétricas, é da empresa contratada, "
        "evitando riscos graves de choques ou danos aos equipamentos."
    ).alignment = WD_ALIGN_PARAGRAPH.LEFT

    # Nova página
    doc.add_page_break()


    # ---------------------------------------------------------------------------
    # SUMÁRIO DE EQUIPAMENTOS (TEXTO + TABELA)
    # ---------------------------------------------------------------------------
    add_heading("2. Sumário de Equipamentos e Características dos Splits", level=1)

    add_paragraph(
        "📋 Nesta seção, apresentamos um panorama geral dos sistemas de climatização instalados em cada ambiente do projeto. "
        "A listagem dos equipamentos e suas características técnicas tem como objetivo auxiliar no planejamento de manutenções preventivas, "
        "identificação de modelos e controle de peças de reposição."
    )

    # Busca pelos ambientes vinculados ao projeto
    ambientes = Ambiente.objects.filter(projeto=projeto)
    resumo_equipamentos = []

    if not ambientes.exists():
        add_paragraph("❌ Nenhum ambiente cadastrado foi encontrado para este projeto.")
    else:
        for idx, ambiente in enumerate(ambientes, 1):
            caminho_xlsx = os.path.join(
                "/var/www/html/cag/arquivos_cargas_termicas",
                f"projeto_{projeto.nome_projeto}",
                f"{ambiente.nome_ambiente}_resultados_termicos.xlsx"
            )
            carga_termica = 0
            if os.path.exists(caminho_xlsx):
                df = pd.read_excel(caminho_xlsx, engine='openpyxl')
                if 'Carga Térmica Total Ambiente' in df.columns:
                    carga_termica = df['Carga Térmica Total Ambiente'].max()

            aparelhos = determinar_aparelho(carga_termica, ambiente.tipo_aparelho or "hiwall")
            if not aparelhos or not isinstance(aparelhos, list):
                continue

            # Texto descritivo orgânico por ambiente
            add_paragraph(
                f"📌 O ambiente **{ambiente.nome_ambiente}** apresenta os seguintes aparelhos para climatização "
            )

            # Agrupar modelos e capacidades por quantidade
            modelos_ambiente = {}
            for aparelho in aparelhos:
                modelo = aparelho.get("modelo", "-")
                capacidade = aparelho.get("capacidade_resfriamento_btu", "-")
                chave = (modelo, capacidade)
                modelos_ambiente[chave] = modelos_ambiente.get(chave, 0) + 1

            # Lista textual dos aparelhos (já agrupados por modelo e capacidade)
            for (modelo, capacidade), quantidade in modelos_ambiente.items():
                unidade_texto = "unidade" if quantidade == 1 else "unidades"
                add_paragraph(f"   • {quantidade} {unidade_texto} do equipamento {modelo}")

                # Adiciona para a tabela de resumo
                resumo_equipamentos.append({
                    'ambiente': ambiente.nome_ambiente,
                    'modelo': modelo,
                    'capacidade': capacidade,
                    'quantidade': quantidade
                })



    # Características técnicas gerais
    add_paragraph("🔧 Características Técnicas dos Sistemas Split:", bold=True)

    add_paragraph(
        "🔹 Condensadora: Instalada externamente, abriga o compressor, ventilador e serpentina. Está exposta às intempéries (sol, chuva, poluição), "
        "por isso exige limpezas periódicas e checagem das condições estruturais e de fixação."
    )
    add_paragraph(
        "🔹 Evaporadora: Unidade interna que realiza a troca térmica no ambiente. Seus filtros e serpentinas acumulam poeira e microrganismos, afetando "
        "a qualidade do ar e o desempenho do sistema. É essencial a higienização regular."
    )
    add_paragraph(
        "🔹 Tubulações Frigorígenas: Realizam o transporte do gás entre as unidades. Devem estar com isolamento íntegro para evitar condensações, "
        "perdas térmicas e corrosão externa."
    )
    add_paragraph(
        "🔹 Conexões Elétricas: Envolvem alimentação e comandos. Devem ser verificadas para evitar falhas, superaquecimento e riscos elétricos."
    )
    add_paragraph(
        "🔹 Balanceamento Termodinâmico: Garante que o sistema opere com eficiência. Envolve medição de pressão, temperatura e ajustes de vazão e carga de gás."
    )

    add_paragraph(
        "✅ A correta manutenção dos sistemas split proporciona economia de energia, conforto térmico e aumento da vida útil dos equipamentos, além de garantir "
        "a saúde dos usuários ao evitar a circulação de ar contaminado."
    )
    add_paragraph(
        "✅ Nas próximas páginas, são apresentados os planos de manutenção organizados por equipamento e por ambiente. "
        "Esses planos devem ser utilizados pelo técnico responsável para a execução das tarefas, preenchimento dos checklists "
        "e registro das manutenções realizadas, garantindo o acompanhamento histórico e a rastreabilidade das ações futuras."
    )


    # Tabela resumo com equipamentos agrupados por ambiente
    if resumo_equipamentos:
        add_paragraph("\n📊 Tabela Resumo de Equipamentos por Ambiente:", bold=True)

        # Agrupar por ambiente
        from collections import defaultdict
        agrupado = defaultdict(list)
        for item in resumo_equipamentos:
            agrupado[item['ambiente']].append(item)

        tabela = doc.add_table(rows=1, cols=4)
        tabela.style = 'Table Grid'
        hdr = tabela.rows[0].cells
        hdr[0].text = "Ambiente"
        hdr[1].text = "Modelo"
        hdr[2].text = "Capacidade (BTU/h)"
        hdr[3].text = "Quantidade"

        for ambiente_nome, equipamentos in agrupado.items():
            primeira_linha = True
            for eq in equipamentos:
                row = tabela.add_row().cells
                if primeira_linha:
                    row[0].text = ambiente_nome
                    primeira_linha = False
                else:
                    row[0].text = ""
                row[1].text = eq['modelo']
                row[2].text = str(eq['capacidade'])
                row[3].text = str(eq['quantidade'])

        # Alinhar células da tabela
        for row in tabela.rows:
            for cell in row.cells:
                if cell.paragraphs:
                    cell.paragraphs[0].alignment = WD_ALIGN_PARAGRAPH.CENTER
                    for run in cell.paragraphs[0].runs:
                        run.font.size = Pt(10)

    # Nova página
    doc.add_page_break()


    # ----------------------------------------------------------------------------
    # 2.1 Aparelhos de Renovação de Ar
    # ----------------------------------------------------------------------------
    add_heading("2.1 Aparelhos de Renovação de Ar", level=2)
    add_paragraph(
        "Os aparelhos de renovação de ar têm como função principal promover a troca do ar interno por ar externo, garantindo qualidade do ar respirado "
        "e adequação à norma da ANVISA. A renovação é essencial para evitar acúmulo de CO₂, odores, microrganismos e outros contaminantes no ambiente interno."
    )
    add_paragraph(
        "O sistema de renovação complementa os equipamentos de climatização, especialmente em ambientes fechados com grande permanência de pessoas. "
        "A escolha dos equipamentos é feita com base na área do ambiente, altura do pé-direito, número de ocupantes e taxa de renovação exigida."
    )

    resumo_renovadores = []

    for ambiente in ambientes:
        try:
            dados_term = DadosTermicos.objects.get(ambiente=ambiente)
        except Exception:
            dados_term = None

        if dados_term:
            area_piso = dados_term.area_piso or 0
            pe_direito = dados_term.pe_direito or 0
            numero_pessoas = dados_term.numero_pessoas or 0
            taxa_renovacao = dados_term.taxa_renovacao or 0
        else:
            area_piso, pe_direito, numero_pessoas, taxa_renovacao = 0, 0, 0, 0

        info_ren = escolher_aparelho_renovacao(area_piso, pe_direito, numero_pessoas, taxa_renovacao)
        comb_renov = info_ren.get("melhor_comb", [])

        if comb_renov:
            vazao_soma = 0
            descricao_modelos = []

            for rn in comb_renov:
                velocidades = rn.get('velocidades', [])
                vel = velocidades[-1] if velocidades else {}
                modelo = rn.get('modelo', '-')
                vazao = vel.get('vazao_maxima_m3h', 0)
                descricao_modelos.append(f"• 1 unidade do renovador {modelo} com vazão de {vazao} m³/h")
                vazao_soma += vazao

                resumo_renovadores.append({
                    'ambiente': ambiente.nome_ambiente,
                    'modelo': modelo,
                    'vazao': vazao,
                    'pressao': vel.get('pressao_maxima_mmca', '-'),
                    'ruido': vel.get('nivel_pressao_sonora_dba', '-'),
                    'potencia': vel.get('potencia_motor_w', '-')
                })

            add_heading(f"Ambiente: {ambiente.nome_ambiente}", level=3)
            add_paragraph(f"📌 O ambiente **{ambiente.nome_ambiente}** apresenta os seguintes equipamentos para renovação de ar:")
            for linha in descricao_modelos:
                add_paragraph(linha)

            vazao_necessaria = info_ren.get('vazao_total_ar_exterior', 0)
            add_paragraph(f"✔ Vazão Total Necessária: {vazao_necessaria:.2f} m³/h")
            add_paragraph(f"✔ Vazão Combinada dos Aparelhos: {vazao_soma:.2f} m³/h")

            if vazao_soma >= vazao_necessaria:
                add_paragraph("✅ A soma da vazão combinada atende à necessidade mínima de renovação de ar do ambiente.")
            else:
                add_paragraph("⚠️ A vazão combinada dos aparelhos é inferior à necessidade do ambiente. Recomenda-se rever a combinação ou considerar ventilação natural complementar.")

            add_paragraph("_" * 70)

    # ----------------------------------------------------------------------------
    # 2.2 Tabela Resumo dos Aparelhos de Renovação de Ar
    # ----------------------------------------------------------------------------
    if resumo_renovadores:
        add_heading("2.2 Tabela Resumo dos Aparelhos de Renovação de Ar", level=2)
        tabela_resumo = doc.add_table(rows=1, cols=6)
        tabela_resumo.style = "Table Grid"
        hdr = tabela_resumo.rows[0].cells
        headers = ["Ambiente", "Modelo", "Vazão (m³/h)", "Pressão (mmCA)", "Ruído (dBA)", "Potência (W)"]
        for i, h in enumerate(headers):
            hdr[i].text = h
            hdr[i].paragraphs[0].alignment = WD_ALIGN_PARAGRAPH.CENTER
            run = hdr[i].paragraphs[0].runs[0]
            run.font.name = 'Arial'
            run.font.size = Pt(11)

        for item in resumo_renovadores:
            row = tabela_resumo.add_row().cells
            row[0].text = item['ambiente']
            row[1].text = item['modelo']
            row[2].text = str(item['vazao'])
            row[3].text = str(item['pressao'])
            row[4].text = str(item['ruido'])
            row[5].text = str(item['potencia'])

            for cell in row:
                cell.paragraphs[0].alignment = WD_ALIGN_PARAGRAPH.CENTER
                run = cell.paragraphs[0].runs[0]
                run.font.name = 'Arial'
                run.font.size = Pt(11)

    doc.add_page_break()



    # ----------------------------------------------------------------------------
    # CHECKLISTS POR AMBIENTE E APARELHO
    # ----------------------------------------------------------------------------

    # Cabeçalho para cada folha de checklist
    def adicionar_cabecalho_checklist(doc, idx_ambiente, idx_aparelho, ambiente, aparelho, folha_atual, total_folhas):
        add_heading(f"3.{idx_ambiente}.{idx_aparelho} - {ambiente.nome_ambiente} - Equipamento {idx_aparelho}", level=2)
        add_paragraph(f"📄 FOLHA {folha_atual} DE {total_folhas}", bold=True)
        add_paragraph(f"Modelo: {aparelho.get('modelo', '-')}", bold=True)
        add_paragraph("Patrimônio: ______________________   RT: ______________________   CREA/CFT: ______________________", bold=True)


    # Lista detalhada com subatividades
    atividades_detalhadas = [
        ("Limpeza dos Filtros da Evaporadora", "Mensal", [
            "Retirar os filtros da unidade interna",
            "Lavar e secar à sombra",
            "Reinstalar corretamente os filtros"
        ]),
        ("Limpeza da Condensadora", "Trimestral", [
            "Remover sujeiras com jato de água suave",
            "Inspecionar obstruções ao fluxo de ar",
            "Verificar plano de trabalho em altura (se necessário)"
        ]),
        ("Limpeza da Evaporadora - Serpentina", "Semestral", [
            "Aplicar produto desinfetante (spray/espuma)",
            "Enxaguar com jato leve",
            "Garantir secagem completa"
        ]),
        ("Teste de Pressão do Sistema", "Semestral", [
            "Conectar manômetros de alta e baixa",
            "Verificar as pressões em funcionamento",
            "Comparar com valores do fabricante e registrar",
        ]),
        ("Recolhimento de Gás Refrigerante", "Quando necessário", [
            "Recolher o gás com sistema fechado",
            "Armazenar em cilindro certificado",
            "Verificar estanqueidade durante o processo"
        ]),
        ("Recarga de Gás Refrigerante", "Anual ou conforme diagnóstico técnico", [
            "Verificar pressão e nível de gás",
            "Realizar recarga com precisão",
            "Verificar vazamentos após recarga"
        ]),
        ("Balanceamento Termodinâmico", "Anual", [
            "Realizar o balanceamento e registrar etapas",
        ]),
        ("Manutenção Elétrica", "Semestral", [
            "Verificar conectores e cabos",
            "Medir tensão e corrente com multímetro",
            "Apertar conexões e inspecionar disjuntores",
            "Checar sinais de aquecimento ou desgaste"
        ]),
        ("Inspeção de Tubulações", "Anual", [
            "Verificar estado do isolamento térmico",
            "Substituir partes danificadas ou ausentes",
            "Checar fixações e trepidações",
            "Avaliar possíveis riscos de abrasão"
        ]),
        ("Manutenção Geral e Reparos", "Anual", [
            "Verificar ruídos, vibrações e folgas",
            "Inspecionar corrosões e suportes",
            "Lubrificar e ajustar componentes",
            "Executar pequenos reparos se necessário"
        ]),
    ]

    # Primeira metade das atividades (5 principais)
    atividades_parte1 = atividades_detalhadas[:5]
    # Segunda metade
    atividades_parte2 = atividades_detalhadas[5:]


    add_heading("3. Checklists de Manutenção por Equipamento", level=1)

    for idx_ambiente, ambiente in enumerate(ambientes, 1):
        caminho_xlsx = os.path.join(
            "/var/www/html/cag/arquivos_cargas_termicas",
            f"projeto_{projeto.nome_projeto}",
            f"{ambiente.nome_ambiente}_resultados_termicos.xlsx"
        )
        carga_termica = 0
        if os.path.exists(caminho_xlsx):
            df = pd.read_excel(caminho_xlsx, engine='openpyxl')
            if 'Carga Térmica Total Ambiente' in df.columns:
                carga_termica = df['Carga Térmica Total Ambiente'].max()

        aparelhos = determinar_aparelho(carga_termica, ambiente.tipo_aparelho or "hiwall")
        if not aparelhos or not isinstance(aparelhos, list):
            continue

        for idx_aparelho, aparelho in enumerate(aparelhos, 1):
            atividades_parte1 = atividades_detalhadas[:5]
            atividades_parte2 = atividades_detalhadas[5:]

            total_paginas = 2
            for pagina, atividades_pagina in enumerate([atividades_parte1, atividades_parte2], 1):
                adicionar_cabecalho_checklist(
                    doc, idx_ambiente, idx_aparelho, ambiente, aparelho,
                    folha_atual=pagina,
                    total_folhas=total_paginas
                )

                tabela = doc.add_table(rows=1, cols=3)
                add_table_style(tabela)
                hdr = tabela.rows[0].cells
                hdr[0].text = "Atividade / Subatividade"
                hdr[1].text = "Periodicidade"
                hdr[2].text = "☐ Checklist"

                for atividade, periodicidade, subitens in atividades_pagina:
                    row = tabela.add_row().cells
                    row[0].text = atividade
                    row[1].text = periodicidade
                    row[2].text = "☐"
                    for sub in subitens:
                        sub_row = tabela.add_row().cells
                        sub_row[0].text = f"   → {sub}"
                        sub_row[1].text = ""
                        sub_row[2].text = "☐"

                # ✅ Só adiciona page break se não for a última página do último equipamento do último ambiente
                ultimo_ambiente = idx_ambiente == len(ambientes)
                ultimo_aparelho = idx_aparelho == len(aparelhos)
                ultima_pagina = pagina == total_paginas

                if not (ultimo_ambiente and ultimo_aparelho and ultima_pagina):
                    doc.add_page_break()


    # ----------------------------------------------------------------------------
    # 3.1 Checklists de Manutenção – Renovadores de Ar
    # ----------------------------------------------------------------------------
    add_heading("3.1 Checklists de Manutenção por Equipamento – Renovadores de Ar", level=1)

    for idx_ambiente, ambiente in enumerate(ambientes, 1):
        try:
            dados_term = DadosTermicos.objects.get(ambiente=ambiente)
        except Exception:
            dados_term = None

        area = dados_term.area_piso if dados_term else 0
        altura = dados_term.pe_direito if dados_term else 0
        pessoas = dados_term.numero_pessoas if dados_term else 0
        renovacao = dados_term.taxa_renovacao if dados_term else 0

        info_ren = escolher_aparelho_renovacao(area, altura, pessoas, renovacao)
        aparelhos_renov = info_ren.get("melhor_comb", [])

        if not aparelhos_renov:
            continue

        for idx_aparelho, aparelho in enumerate(aparelhos_renov, 1):
            velocidades = aparelho.get("velocidades", [])
            vel = velocidades[-1] if velocidades else {}

            # Cabeçalho padronizado (igual ao dos splits)
            add_heading(f"3.1.{idx_ambiente}.{idx_aparelho} - {ambiente.nome_ambiente} - Renovador de Ar", level=2)
            add_paragraph(f"📄 FOLHA 1 DE 1", bold=True)
            add_paragraph(f"Modelo: {aparelho.get('modelo', '-')}", bold=True)
            add_paragraph("Patrimônio: ______________________   RT: ______________________   CREA/CFT: ______________________", bold=True)

            # Tabela de checklist
            tabela = doc.add_table(rows=1, cols=3)
            add_table_style(tabela)
            hdr = tabela.rows[0].cells
            hdr[0].text = "Atividade / Subatividade"
            hdr[1].text = "Periodicidade"
            hdr[2].text = "☐ Checklist"

            atividades_renovador = [
                ("Inspeção Visual Geral", "Mensal", ["Verificar estrutura, corrosão, sujeira ou folgas no equipamento."]),
                ("Limpeza de Filtros e Entradas/Saídas de Ar", "Mensal", ["Retirar sujeiras, folhas, detritos ou gordura acumulada."]),
                ("Aperto de Fixações e Suportes", "Trimestral", ["Verificar vibrações e folgas em parafusos, suportes e base."]),
                ("Lubrificação de Mancais e Eixos", "Trimestral", ["Aplicar graxa ou óleo conforme manual do fabricante."]),
                ("Inspeção Elétrica do Motor", "Semestral", ["Verificar cabos, aquecimento, ruídos e consumo de corrente."]),
                ("Medição de Vazão e Pressão", "Anual", ["Confirmar vazão de ar emitida e ajustar se necessário."]),
                ("Limpeza de Rotor / Hélices", "Anual", ["Remover sujeiras acumuladas nas pás do ventilador ou turbina."]),
                ("Verificação de Ruído e Vibração", "Semestral", ["Checar barulhos incomuns e desequilíbrios no giro."]),
            ]

            for atividade, periodicidade, subitens in atividades_renovador:
                row = tabela.add_row().cells
                row[0].text = atividade
                row[1].text = periodicidade
                row[2].text = "☐"
                for sub in subitens:
                    sub_row = tabela.add_row().cells
                    sub_row[0].text = f"   → {sub}"
                    sub_row[1].text = ""
                    sub_row[2].text = "☐"

            doc.add_paragraph("")  # Espaçamento
            doc.add_page_break()



    # ---------------------------------------------------------------------------
    # RESPONSABILIDADES E CONSIDERAÇÕES FINAIS
    # ---------------------------------------------------------------------------
    add_heading("4. Responsabilidades e Considerações Finais", level=1)

    add_paragraph(
        "A execução do Plano de Manutenção, Operação e Controle (PMOC) exige o cumprimento rigoroso de normas técnicas e legais. "
        "Todas as intervenções devem ser realizadas sob a supervisão de um Responsável Técnico (RT), legalmente habilitado e registrado "
        "no Conselho Regional de Engenharia e Agronomia (CREA) ou no Conselho Federal dos Técnicos (CFT)."
    )

    add_paragraph(
        "A empresa contratada é legal e tecnicamente responsável por assegurar condições de trabalho seguras, utilização adequada dos "
        "equipamentos de proteção, capacitação das equipes envolvidas e o cumprimento das exigências estabelecidas pela ANVISA, Ministério "
        "do Trabalho e demais órgãos competentes."
    )

    add_paragraph("🔧 Responsabilidades da empresa executante:", bold=True)
    add_paragraph(
        "• ✅ Garantir o uso correto e obrigatório dos EPIs e EPCs em todas as manutenções.\n"
        "• 📋 Apresentar plano de trabalho para intervenções em altura, com análise preliminar de risco.\n"
        "• ⚡ Permitir acesso a circuitos energizados somente a profissionais habilitados em eletrotécnica.\n"
        "• 📝 Manter registros organizados e auditáveis de todas as atividades de manutenção (data, técnicos responsáveis, pressões, tensões, peças substituídas, observações técnicas, etc.).",
        align=WD_ALIGN_PARAGRAPH.LEFT
    )

    add_paragraph("🔍 Itens que devem ser verificados em cada manutenção preventiva:", bold=True)
    add_paragraph(
        "• 🌀 Condição de limpeza dos filtros, serpentinas e bandejas.\n"
        "• 🔧 Estado das tubulações frigorígenas e isolamento térmico.\n"
        "• 🔊 Operação do compressor e ventiladores, com atenção a ruídos anormais.\n"
        "• ❄️ Pressões de trabalho do gás refrigerante compatíveis com o fluido utilizado (R-410A, R-32, etc.).\n"
        "• 🔌 Conexões elétricas firmes, sem aquecimento excessivo ou faíscas.\n"
        "• 🌡️ Temperaturas de insuflamento e retorno para avaliação do desempenho térmico.\n"
        "• 📂 Preenchimento do checklist, com evidências de execução e correções realizadas.",
        align=WD_ALIGN_PARAGRAPH.LEFT
    )

    add_paragraph("⚠️ Consequências da negligência:", bold=True)
    add_paragraph(
        "A ausência de manutenção adequada compromete a qualidade do ar interno, reduz a eficiência energética dos sistemas, acelera "
        "o desgaste dos componentes e pode causar falhas operacionais graves. Além disso, eleva significativamente os custos de reparo, "
        "aumenta o risco de acidentes de trabalho e descumpre exigências legais impostas por normativas como a Portaria GM/MS nº 3.523/1998 "
        "e a Resolução RE nº 9/2003 da ANVISA."
    )

    add_paragraph(
        "A adoção efetiva deste PMOC é, portanto, um compromisso com a saúde dos ocupantes, a segurança operacional e a sustentabilidade "
        "energética da edificação."
    )


