from django.shortcuts import render, redirect, get_object_or_404
from django.contrib import messages
from projeto.models import Projeto
from paredes.forms import ParedeForm
from vidros.forms import VidroForm
from portas.forms import PortaForm
from telhados.forms import TelhadoForm
from termicos.forms import DadosTermicosForm
from paredes.models import Parede
from vidros.models import Vidro
from portas.models import Porta
from telhados.models import Telhado
from termicos.models import DadosTermicos
from .models import Ambiente
import os
import pandas as pd
from django.conf import settings
import numpy as np
from django.db import connection
from django.contrib.auth.decorators import login_required 
from centraltermica.views import gerar_relatorio_projeto
from centraltermica.views import escolher_aparelho_renovacao
from centraltermica.hiwall import HIWALL_MODELOS
from centraltermica.tipoduto import TIPODUTO_MODELOS
from centraltermica.cassete4vias import CASSETE_4VIAS_MODELOS


# Função auxiliar para calcular a umidade absoluta (g/kg) a partir da umidade relativa e temperatura interna (°C)

def calcular_umidade_absoluta(umidade_relativa, temperatura_interna):
    # Constantes para o cálculo
    Rv = 461.5  # Constante de gás para vapor d'água em J/(kg·K)
    T = temperatura_interna + 273.15  # Converter para Kelvin
    es = 6.112 * np.exp((17.67 * temperatura_interna) / (temperatura_interna + 243.5))  # Pressão de saturação (hPa)
    e = umidade_relativa * es  # Pressão de vapor real (hPa)
    umidade_absoluta = (0.622 * e) / (1013.25 - e) * 1000  # Converter para g/kg
    return umidade_absoluta


def salvar_dados_em_csv(projeto, nome_ambiente, parede, vidro, porta, telhado, termico):
    caminho_base = f"/var/www/html/cagpublico/cag/arquivos_climaticos/projeto_{projeto.nome_projeto}/"
    os.makedirs(caminho_base, exist_ok=True)

    dados = {
        'nome_ambiente': [nome_ambiente], 

        # Variáveis das Paredes (por orientação)
        'area_parede_norte': [parede.area_parede_norte],
        'coeficiente_parede_norte': [parede.coeficiente_parede_norte],
        'tipo_parede_norte': [parede.tipo_parede_norte],
        'area_parede_sul': [parede.area_parede_sul],
        'coeficiente_parede_sul': [parede.coeficiente_parede_sul],
        'tipo_parede_sul': [parede.tipo_parede_sul],
        'area_parede_leste': [parede.area_parede_leste],
        'coeficiente_parede_leste': [parede.coeficiente_parede_leste],
        'tipo_parede_leste': [parede.tipo_parede_leste],
        'area_parede_oeste': [parede.area_parede_oeste],
        'coeficiente_parede_oeste': [parede.coeficiente_parede_oeste],
        'tipo_parede_oeste': [parede.tipo_parede_oeste],

        # Variáveis dos Vidros (por orientação)
        'area_vidro_norte': [vidro.area_vidro_norte],
        'coeficiente_vidro_norte': [vidro.coeficiente_vidro_norte],
        'tipo_vidro_norte': [vidro.tipo_vidro_norte],
        'area_vidro_sul': [vidro.area_vidro_sul],
        'coeficiente_vidro_sul': [vidro.coeficiente_vidro_sul],
        'tipo_vidro_sul': [vidro.tipo_vidro_sul],
        'area_vidro_leste': [vidro.area_vidro_leste],
        'coeficiente_vidro_leste': [vidro.coeficiente_vidro_leste],
        'tipo_vidro_leste': [vidro.tipo_vidro_leste],
        'area_vidro_oeste': [vidro.area_vidro_oeste],
        'coeficiente_vidro_oeste': [vidro.coeficiente_vidro_oeste],
        'tipo_vidro_oeste': [vidro.tipo_vidro_oeste],

        # Variáveis das Portas (modelo unificado, por orientação)
        'area_porta_norte': [porta.area_porta_norte],
        'coeficiente_porta_norte': [porta.coeficiente_porta_norte],
        'tipo_porta_norte': [porta.tipo_porta_norte],
        'material_porta_norte': [porta.material_porta_norte],
        'diferencial_insolacao_norte': [porta.diferencial_insolacao_norte],

        'area_porta_sul': [porta.area_porta_sul],
        'coeficiente_porta_sul': [porta.coeficiente_porta_sul],
        'tipo_porta_sul': [porta.tipo_porta_sul],
        'material_porta_sul': [porta.material_porta_sul],
        'diferencial_insolacao_sul': [porta.diferencial_insolacao_sul],

        'area_porta_leste': [porta.area_porta_leste],
        'coeficiente_porta_leste': [porta.coeficiente_porta_leste],
        'tipo_porta_leste': [porta.tipo_porta_leste],
        'material_porta_leste': [porta.material_porta_leste],
        'diferencial_insolacao_leste': [porta.diferencial_insolacao_leste],

        'area_porta_oeste': [porta.area_porta_oeste],
        'coeficiente_porta_oeste': [porta.coeficiente_porta_oeste],
        'tipo_porta_oeste': [porta.tipo_porta_oeste],
        'material_porta_oeste': [porta.material_porta_oeste],
        'diferencial_insolacao_oeste': [porta.diferencial_insolacao_oeste],


        # Variáveis do Telhado
        'tipo_telhado': [telhado.tipo_telhado],
        'coeficiente_transmissao_telhado': [telhado.coeficiente_telhado],
        'area_telhado': [telhado.area_telhado],
        'diferencial_insolacao_telhado': [telhado.diferencial_insolacao_telhado],

        # Variáveis Térmicas do Ambiente
        'calor_sensivel_pessoa': [termico.calor_sensivel_pessoa],
        'calor_latente_pessoa': [termico.calor_latente_pessoa],
        'numero_pessoas': [termico.numero_pessoas],
        'taxa_iluminacao': [termico.taxa_iluminacao],
        'dissipacao_equipamentos': [termico.dissipacao_equipamentos],
        'pe_direito': [termico.pe_direito],
        'area_piso': [termico.area_piso],
        'temperatura_interna': [termico.temperatura_interna],
        'umidade_relativa_interna': [termico.umidade_relativa_interna],
        'umidade_absoluta_interna': [termico.umidade_absoluta_interna],
        'taxa_renovacao': [termico.taxa_renovacao]
    }


    df = pd.DataFrame(dados)
    caminho_csv = os.path.join(caminho_base, f"{nome_ambiente}_dados.csv")
    df.to_csv(caminho_csv, index=False)
    print(f"Arquivo CSV salvo com sucesso em: {caminho_csv}")




from django.shortcuts import redirect, get_object_or_404
from django.http import FileResponse
from django.contrib import messages
from django.db import connection
from django.contrib.auth.decorators import login_required
import os
import logging

logger = logging.getLogger(__name__)

@login_required
def download_csv(request, projeto_id, ambiente_id):
    try:
        # Configurar o schema do tenant
        if request.user.is_authenticated and request.user.tenant:
            connection.set_schema(request.user.tenant.schema_name)
            logger.debug(f"Schema configurado para: {request.user.tenant.schema_name}")

        # Buscar o projeto e ambiente
        projeto = get_object_or_404(Projeto, id=projeto_id)
        ambiente = get_object_or_404(Ambiente, id=ambiente_id, projeto=projeto)
        
        logger.debug(f"Tentando baixar CSV para projeto {projeto.nome_projeto}, ambiente {ambiente.nome_ambiente}")
        
        # Construir o caminho do arquivo
        caminho_base = f"/var/www/html/cagpublico/cag/arquivos_climaticos/projeto_{projeto.nome_projeto}/"
        nome_arquivo = f"{ambiente.nome_ambiente}_dados.csv"
        caminho_completo = os.path.join(caminho_base, nome_arquivo)
        
        logger.debug(f"Caminho completo do arquivo: {caminho_completo}")
        
        # Verificar se o arquivo existe
        if not os.path.exists(caminho_completo):
            logger.error(f"Arquivo não encontrado: {caminho_completo}")
            messages.error(request, "O arquivo CSV não foi encontrado.")
            return redirect('resultados_ambiente', projeto_id=projeto_id, ambiente_id=ambiente_id)
        
        # Verificar permissões do arquivo
        if not os.access(caminho_completo, os.R_OK):
            logger.error(f"Sem permissão de leitura para o arquivo: {caminho_completo}")
            messages.error(request, "Erro de permissão ao acessar o arquivo.")
            return redirect('resultados_ambiente', projeto_id=projeto_id, ambiente_id=ambiente_id)
        
        # Abrir e retornar o arquivo sem usar with
        try:
            file = open(caminho_completo, 'rb')
            response = FileResponse(
                file,
                as_attachment=True,
                filename=nome_arquivo
            )
            response['Content-Type'] = 'text/csv'
            response['Content-Disposition'] = f'attachment; filename="{nome_arquivo}"'
            return response
            
        except Exception as e:
            logger.error(f"Erro ao abrir o arquivo: {str(e)}")
            messages.error(request, "Erro ao processar o download do arquivo.")
            return redirect('resultados_ambiente', projeto_id=projeto_id, ambiente_id=ambiente_id)
            
    except Exception as e:
        logger.error(f"Erro inesperado no download_csv: {str(e)}")
        messages.error(request, "Ocorreu um erro inesperado.")
        return redirect('resultados_ambiente', projeto_id=projeto_id, ambiente_id=ambiente_id)





@login_required
def cadastrar_ambiente(request, projeto_id):
    if request.user.is_authenticated and request.user.tenant:
        connection.set_schema(request.user.tenant.schema_name)

    projeto = get_object_or_404(Projeto, id=projeto_id)
    nome_ambiente = ''

    if request.method == 'POST':
        fluxo = request.POST.get('fluxo', 'calculo')
        nome_ambiente = request.POST.get('nome_ambiente', '').strip()

        if not nome_ambiente:
            messages.error(request, "O nome do ambiente é obrigatório.")
            return redirect('cadastrar_ambiente', projeto_id=projeto.id)

        if fluxo == 'existente':
            tipo = request.POST.get("tipo_aparelho")
            modelo_nome = request.POST.get("modelo")

            lista_modelos = {
                'hiwall': HIWALL_MODELOS,
                'tipoduto': TIPODUTO_MODELOS,
                'cassete4vias': CASSETE_4VIAS_MODELOS,
            }.get(tipo, [])

            aparelho = next((m for m in lista_modelos if m["modelo"] == modelo_nome), None)

            if not aparelho:
                messages.error(request, "O modelo selecionado não foi encontrado.")
                return redirect('cadastrar_ambiente', projeto_id=projeto.id)

            Ambiente.objects.create(
                projeto=projeto,
                nome_ambiente=nome_ambiente,
                tipo_aparelho=tipo,
                modelo_aparelho=modelo_nome,
                carga_termica_total_ambiente=aparelho["capacidade_resfriamento_w"],
                equipamento_existente=True
            )

            messages.success(request, f"Equipamento '{modelo_nome}' cadastrado no ambiente '{nome_ambiente}'.")
            return redirect('cadastrar_ambiente', projeto_id=projeto.id)

        # FLUXO PADRÃO: cálculo térmico
        ambiente = Ambiente.objects.create(nome_ambiente=nome_ambiente, projeto=projeto)

        parede_form = ParedeForm(request.POST, prefix="parede")
        vidro_form = VidroForm(request.POST, prefix="vidro")
        porta_form = PortaForm(request.POST, prefix="porta")
        telhado_form = TelhadoForm(request.POST, prefix="telhado")
        termico_form = DadosTermicosForm(request.POST, prefix="termico")

        for nome, form in {
            'Parede': parede_form,
            'Vidro': vidro_form,
            'Porta': porta_form,
            'Telhado': telhado_form,
            'Térmico': termico_form
        }.items():
            if not form.is_valid():
                messages.error(request, f"Erro no formulário {nome}: {form.errors}")

        if all([
            parede_form.is_valid(),
            vidro_form.is_valid(),
            porta_form.is_valid(),
            telhado_form.is_valid(),
            termico_form.is_valid()
        ]):
            parede = parede_form.save(commit=False)
            parede.ambiente = ambiente
            parede.save()

            vidro = vidro_form.save(commit=False)
            vidro.ambiente = ambiente
            vidro.save()

            porta = porta_form.save(commit=False)
            porta.ambiente = ambiente
            porta.save()

            telhado = telhado_form.save(commit=False)
            telhado.ambiente = ambiente
            telhado.save()

            termico = termico_form.save(commit=False)
            termico.ambiente = ambiente
            termico.umidade_absoluta_interna = calcular_umidade_absoluta(
                termico.umidade_relativa_interna,
                termico.temperatura_interna
            )
            termico.save()

            messages.success(request, f"Ambiente '{nome_ambiente}' cadastrado com sucesso com cálculo térmico.")
            return redirect('resultados_ambiente', projeto_id=projeto.id, ambiente_id=ambiente.id)
        else:
            ambiente.delete()

    else:
        parede_form = ParedeForm(prefix="parede")
        vidro_form = VidroForm(prefix="vidro")
        porta_form = PortaForm(prefix="porta")
        telhado_form = TelhadoForm(prefix="telhado")
        termico_form = DadosTermicosForm(prefix="termico")

    orientacoes = ['norte', 'sul', 'leste', 'oeste']
    campos_porta = {
        orientacao: {
            'area': porta_form[f'area_porta_{orientacao}'],
            'coeficiente': porta_form[f'coeficiente_porta_{orientacao}'],
            'tipo': porta_form[f'tipo_porta_{orientacao}'],
            'diferencial': porta_form[f'diferencial_insolacao_{orientacao}'],
        }
        for orientacao in orientacoes
    }

    contexto = {
        'projeto': projeto,
        'parede_form': parede_form,
        'vidro_form': vidro_form,
        'campos_porta': campos_porta,
        'telhado_form': telhado_form,
        'termico_form': termico_form,
        'nome_ambiente': nome_ambiente,
        'hiwall': HIWALL_MODELOS,
        'tipoduto': TIPODUTO_MODELOS,
        'cassete': CASSETE_4VIAS_MODELOS,
    }

    return render(request, 'ctermica/cadastrar_ambiente.html', contexto)











# views.py
from django.shortcuts import get_object_or_404, redirect
from django.http import HttpResponse

@login_required
def deletar_ambiente(request, projeto_id, ambiente_id):
        # Verifica se o usuário está autenticado e possui um tenant
    if request.user.is_authenticated and request.user.tenant:
        # Define o schema do tenant atual para a consulta
        connection.set_schema(request.user.tenant.schema_name)
    projeto = get_object_or_404(Projeto, id=projeto_id)
    ambiente = get_object_or_404(Ambiente, id=ambiente_id, projeto=projeto)

    if request.method == "POST":
        ambiente.delete()
        return redirect('lista_ambientes', projeto_id=projeto_id)

    return HttpResponse("Confirme a exclusão do ambiente.") 




# Função para carregar os dados do CSV

def carregar_dados_climaticos(projeto):
    
    caminho_base = f"arquivos_climaticos/projeto_{projeto.nome_projeto}/"
    
    try:
        # Carregar os CSVs salvos
        df_temperaturas = pd.read_csv(os.path.join(caminho_base, 'temperaturas.csv'))
        df_umidades_relativas = pd.read_csv(os.path.join(caminho_base, 'umidades_relativas.csv'))
        df_umidades_absolutas = pd.read_csv(os.path.join(caminho_base, 'umidades_absolutas.csv'))

        # Juntar os dados em um DataFrame único
        df_climatico = pd.DataFrame({
            'time': pd.to_datetime(df_temperaturas['time']),
            'temperatura': df_temperaturas['temperature_2m'],
            'umidade_relativa': df_umidades_relativas['relative_humidity_2m'],
            'umidade_absoluta': df_umidades_absolutas['umidade_absoluta']
        })
        
        # Filtrar para horários entre 06h e 18h
        df_climatico = df_climatico[
            (df_climatico['time'].dt.hour >= 6) & (df_climatico['time'].dt.hour <= 18)
        ]

        # Formatar as horas no formato 24h
        df_climatico['hora'] = df_climatico['time'].dt.strftime('%H:%M')

        return df_climatico.to_dict('records')

    except FileNotFoundError:
        return None


from .models import Porta  # novo model unificado

@login_required
def lista_ambientes(request, projeto_id):
    """
    Renderiza a lista de ambientes de um projeto com informações adicionais.
    """
    if request.user.is_authenticated and request.user.tenant:
        connection.set_schema(request.user.tenant.schema_name)

    projeto = get_object_or_404(Projeto, id=projeto_id)
    ambientes = Ambiente.objects.filter(projeto=projeto)

    ambiente_paredes = {ambiente.id: Parede.objects.filter(ambiente=ambiente) for ambiente in ambientes}
    ambiente_vidros = {ambiente.id: Vidro.objects.filter(ambiente=ambiente) for ambiente in ambientes}
    ambiente_portas = {ambiente.id: Porta.objects.filter(ambiente=ambiente) for ambiente in ambientes}  # unificado
    ambiente_telhados = {ambiente.id: Telhado.objects.filter(ambiente=ambiente) for ambiente in ambientes}
    ambiente_termicos = {ambiente.id: DadosTermicos.objects.filter(ambiente=ambiente) for ambiente in ambientes}

    dados_climaticos = carregar_dados_climaticos(projeto)

    ambientes_com_renovadores = []
    for ambiente in ambientes:
        try:
            termicos = DadosTermicos.objects.get(ambiente=ambiente)
            renovador_resultado = escolher_aparelho_renovacao(
                termicos.area_piso,
                termicos.pe_direito,
                termicos.numero_pessoas,
                termicos.taxa_renovacao
            )

            if renovador_resultado and renovador_resultado.get('melhor_comb'):
                renovadores = [
                    {
                        'modelo': r.get('modelo'),
                        'vazao_maxima_m3h': (
                            r.get('velocidades', [{}])[-1].get('vazao_maxima_m3h') 
                            if r.get('velocidades') 
                            else None
                        ),
                    }
                    for r in renovador_resultado.get('melhor_comb', [])
                ]
            else:
                renovadores = []

            ambientes_com_renovadores.append({
                'ambiente': ambiente,
                'renovador': renovadores,
                'vazao_total_ar_exterior': (
                    renovador_resultado.get('vazao_total_ar_exterior') 
                    if renovador_resultado 
                    else None
                ),
            })
        except DadosTermicos.DoesNotExist:
            ambientes_com_renovadores.append({
                'ambiente': ambiente,
                'renovador': [],
                'vazao_total_ar_exterior': None,
            })

    return render(request, 'ctermica/lista_ambientes.html', {
        'projeto': projeto,
        'ambientes_com_renovadores': ambientes_com_renovadores,
        'paredes': ambiente_paredes,
        'vidros': ambiente_vidros,
        'portas': ambiente_portas,  # novo dicionário
        'telhados': ambiente_telhados,
        'termicos': ambiente_termicos,
        'dados_climaticos': dados_climaticos,
    })



from django.contrib.auth.decorators import login_required
from django.contrib.messages import get_messages
from django.shortcuts import render, get_object_or_404
from django.db import connection

from .models import Porta  # garantir que o model unificado esteja importado

@login_required
def resultados_ambiente(request, projeto_id, ambiente_id):
    if request.user.is_authenticated and request.user.tenant:
        connection.set_schema(request.user.tenant.schema_name)

    projeto = get_object_or_404(Projeto, id=projeto_id)
    ambiente = get_object_or_404(Ambiente, id=ambiente_id, projeto=projeto)

    paredes = Parede.objects.filter(ambiente=ambiente)
    vidros = Vidro.objects.filter(ambiente=ambiente)
    porta = Porta.objects.filter(ambiente=ambiente).first()
    telhados = Telhado.objects.filter(ambiente=ambiente)
    termicos = DadosTermicos.objects.filter(ambiente=ambiente).first()

    mensagens = [str(message) for message in get_messages(request)]

    # Unir os modelos disponíveis para busca dinâmica no template
    modelos_completos = HIWALL_MODELOS + TIPODUTO_MODELOS + CASSETE_4VIAS_MODELOS

    return render(request, 'ctermica/resultados_ambiente.html', {
        'projeto': projeto,
        'ambiente': ambiente,
        'paredes': paredes,
        'vidros': vidros,
        'porta': porta,
        'telhados': telhados,
        'termicos': termicos,
        'mensagens': mensagens,
        'hiwall': HIWALL_MODELOS,
        'tipoduto': TIPODUTO_MODELOS,
        'cassete': CASSETE_4VIAS_MODELOS,
        'modelos_completos': modelos_completos,  # caso queira iterar em uma única lista no template
    })


from django.shortcuts import render, get_object_or_404
from django.contrib.auth.decorators import login_required

from .coefparedes import COEFICIENTES_PAREDES

@login_required
def coef_paredes(request):
    if request.user.is_authenticated and request.user.tenant:
        connection.set_schema(request.user.tenant.schema_name)
    return render(request, 'ctermica/coef_paredes.html', {
        "coef_paredes": COEFICIENTES_PAREDES
    })

from django.shortcuts import render
from .coefrenovacao import COEFICIENTE_AR

@login_required
def coef_renovacao_ar(request):
    if request.user.is_authenticated and request.user.tenant:
        connection.set_schema(request.user.tenant.schema_name)
    ambientes_climatizados = COEFICIENTE_AR.get("Ambientes Climatizados", {})
    return render(request, 'ctermica/coef_renovacao.html', {
        "ambientes_climatizados": ambientes_climatizados
    })


from django.shortcuts import render
from .coefpessoas import COEFICIENTES_PESSOAS

@login_required
def coef_pessoas(request):
    if request.user.is_authenticated and request.user.tenant:
        connection.set_schema(request.user.tenant.schema_name)
    calor_sensivel = COEFICIENTES_PESSOAS.get("Calor Sensível por Pessoa (W)", {})
    calor_latente = COEFICIENTES_PESSOAS.get("Calor Latente por Pessoa (W)", {})
    return render(request, 'ctermica/coef_pessoas.html', {
        "calor_sensivel": calor_sensivel,
        "calor_latente": calor_latente
    })


from django.shortcuts import render
from .coefportas import COEFICIENTES_PORTAS

@login_required
def coef_portas(request):
    if request.user.is_authenticated and request.user.tenant:
        connection.set_schema(request.user.tenant.schema_name)
    return render(request, 'ctermica/coef_portas.html', {
        "coef_portas": COEFICIENTES_PORTAS
    })


from django.shortcuts import render
from .coeftelhados import COEFICIENTES_TELHADOS

@login_required
def coef_telhados(request):
    if request.user.is_authenticated and request.user.tenant:
        connection.set_schema(request.user.tenant.schema_name)
    return render(request, 'ctermica/coef_telhados.html', {
        "coef_telhados": COEFICIENTES_TELHADOS
    })


from django.shortcuts import render
from .coefvidros import COEFICIENTES_VIDROS

@login_required
def coef_vidros(request):
    if request.user.is_authenticated and request.user.tenant:
        connection.set_schema(request.user.tenant.schema_name)
    return render(request, 'ctermica/coef_vidros.html', {
        "coef_vidros": COEFICIENTES_VIDROS
    })


from django.shortcuts import render
from .dissipequi import DISSIPACAO_EQUIPAMENTOS  # Certifique-se de ajustar o caminho se necessário

@login_required
def dissipequi(request):
    if request.user.is_authenticated and hasattr(request.user, 'tenant'):
        # Alterar o esquema para o tenant do usuário (se aplicável)
        connection.set_schema(request.user.tenant.schema_name)
    
    return render(request, 'ctermica/dissipequi.html', {
        "equipamentos": DISSIPACAO_EQUIPAMENTOS.get("Equipamentos", {})
    })


from django.shortcuts import render
from django.contrib.auth.decorators import login_required
from .dissipilumin import DISSIPACAO_ILUMINACAO  # Certifique-se de que o caminho está correto

@login_required
def dissipa_iluminacao(request):
    """
    View para exibir os dados de dissipação térmica de iluminação.
    """
    # Passa os dados estruturados para o template
    return render(request, 'ctermica/dissipa_iluminacao.html', {
        "iluminacao": DISSIPACAO_ILUMINACAO.get("Iluminação", {})  # Acessa a chave "Iluminação"
    })

from django.shortcuts import render
from django.contrib.auth.decorators import login_required
from .umidade import RECOMENDACAO_UMIDADE

@login_required
def umidade_recomendada(request):
    """
    View para exibir as recomendações de umidade relativa do ar.
    """
    return render(request, 'ctermica/umidade.html', {
        "umidade": RECOMENDACAO_UMIDADE.get("Faixas de Umidade Relativa", {})
    })


 


from django.shortcuts import render
from django.contrib.auth.decorators import login_required

@login_required
def biblioteca_coeficientes(request):
    if request.user.is_authenticated and request.user.tenant:
        connection.set_schema(request.user.tenant.schema_name)
    return render(request, 'ctermica/biblioteca.html')


import csv
from django.http import JsonResponse
from django.views.decorators.csrf import csrf_exempt

@csrf_exempt
def importar_csv(request):
    if request.method == 'POST' and 'csv_file' in request.FILES:
        try:
            csv_file = request.FILES['csv_file']
            decoded_file = csv_file.read().decode('utf-8').splitlines()
            reader = csv.DictReader(decoded_file)
            data = next(reader)  # Lê apenas a primeira linha

            response_data = {
                'success': True,
                'nome_ambiente': data.get('nome_ambiente', ''),

                'parede_form': {
                    'area_parede_norte': data.get('area_parede_norte', ''),
                    'coeficiente_parede_norte': data.get('coeficiente_parede_norte', ''),
                    'tipo_parede_norte': data.get('tipo_parede_norte', ''),
                    'area_parede_sul': data.get('area_parede_sul', ''),
                    'coeficiente_parede_sul': data.get('coeficiente_parede_sul', ''),
                    'tipo_parede_sul': data.get('tipo_parede_sul', ''),
                    'area_parede_leste': data.get('area_parede_leste', ''),
                    'coeficiente_parede_leste': data.get('coeficiente_parede_leste', ''),
                    'tipo_parede_leste': data.get('tipo_parede_leste', ''),
                    'area_parede_oeste': data.get('area_parede_oeste', ''),
                    'coeficiente_parede_oeste': data.get('coeficiente_parede_oeste', ''),
                    'tipo_parede_oeste': data.get('tipo_parede_oeste', ''),
                },

                'vidro_form': {
                    'area_vidro_norte': data.get('area_vidro_norte', ''),
                    'coeficiente_vidro_norte': data.get('coeficiente_vidro_norte', ''),
                    'tipo_vidro_norte': data.get('tipo_vidro_norte', ''),
                    'area_vidro_sul': data.get('area_vidro_sul', ''),
                    'coeficiente_vidro_sul': data.get('coeficiente_vidro_sul', ''),
                    'tipo_vidro_sul': data.get('tipo_vidro_sul', ''),
                    'area_vidro_leste': data.get('area_vidro_leste', ''),
                    'coeficiente_vidro_leste': data.get('coeficiente_vidro_leste', ''),
                    'tipo_vidro_leste': data.get('tipo_vidro_leste', ''),
                    'area_vidro_oeste': data.get('area_vidro_oeste', ''),
                    'coeficiente_vidro_oeste': data.get('coeficiente_vidro_oeste', ''),
                    'tipo_vidro_oeste': data.get('tipo_vidro_oeste', ''),
                },

                'porta_form': {
                    'area_porta_norte': data.get('area_porta_norte', ''),
                    'coeficiente_porta_norte': data.get('coeficiente_porta_norte', ''),
                    'tipo_porta_norte': data.get('tipo_porta_norte', ''),
                    'diferencial_insolacao_norte': data.get('diferencial_insolacao_porta_norte', ''),

                    'area_porta_sul': data.get('area_porta_sul', ''),
                    'coeficiente_porta_sul': data.get('coeficiente_porta_sul', ''),
                    'tipo_porta_sul': data.get('tipo_porta_sul', ''),
                    'diferencial_insolacao_sul': data.get('diferencial_insolacao_porta_sul', ''),

                    'area_porta_leste': data.get('area_porta_leste', ''),
                    'coeficiente_porta_leste': data.get('coeficiente_porta_leste', ''),
                    'tipo_porta_leste': data.get('tipo_porta_leste', ''),
                    'diferencial_insolacao_leste': data.get('diferencial_insolacao_porta_leste', ''),

                    'area_porta_oeste': data.get('area_porta_oeste', ''),
                    'coeficiente_porta_oeste': data.get('coeficiente_porta_oeste', ''),
                    'tipo_porta_oeste': data.get('tipo_porta_oeste', ''),
                    'diferencial_insolacao_oeste': data.get('diferencial_insolacao_porta_oeste', ''),
                },

                'telhado_form': {
                    'tipo_telhado': data.get('tipo_telhado', ''),
                    'coeficiente_telhado': data.get('coeficiente_transmissao_telhado', ''),
                    'area_telhado': data.get('area_telhado', ''),
                    'diferencial_insolacao_telhado': data.get('diferencial_insolacao_telhado', '')
                },

                'termico_form': {
                    'calor_sensivel_pessoa': data.get('calor_sensivel_pessoa', ''),
                    'calor_latente_pessoa': data.get('calor_latente_pessoa', ''),
                    'numero_pessoas': data.get('numero_pessoas', ''),
                    'taxa_iluminacao': data.get('taxa_iluminacao', ''),
                    'dissipacao_equipamentos': data.get('dissipacao_equipamentos', ''),
                    'area_piso': data.get('area_piso', ''),
                    'pe_direito': data.get('pe_direito', ''),
                    'temperatura_interna': data.get('temperatura_interna', ''),
                    'taxa_renovacao': data.get('taxa_renovacao', ''),
                    'umidade_relativa_interna': data.get('umidade_relativa_interna', ''),
                    'umidade_absoluta_interna': data.get('umidade_absoluta_interna', ''),
                }
            }

            return JsonResponse(response_data)

        except Exception as e:
            return JsonResponse({'success': False, 'error': str(e)})

    return JsonResponse({'success': False, 'error': 'Nenhum arquivo CSV enviado ou formato inválido.'})



@login_required
def sistema_renovacao(request, projeto_id, ambiente_id):
    """
    Exibe os resultados do sistema de renovação para um ambiente específico.
    """
    if request.user.is_authenticated and request.user.tenant:
        connection.set_schema(request.user.tenant.schema_name)

    projeto = get_object_or_404(Projeto, id=projeto_id)
    ambiente = get_object_or_404(Ambiente, id=ambiente_id)

    try:
        termicos = DadosTermicos.objects.get(ambiente=ambiente)
        renovador_resultado = escolher_aparelho_renovacao(
            termicos.area_piso,
            termicos.pe_direito,
            termicos.numero_pessoas,
            termicos.taxa_renovacao
        )

        # Calcula a vazão total da combinação selecionada
        vazao_total_combinacao = sum(
            renovador['velocidades'][0]['vazao_maxima_m3h']
            for renovador in renovador_resultado.get('melhor_comb', [])
        )

        # Adiciona informações adicionais ao resultado
        renovador_resultado.update({
            'vazao_total_combinacao': vazao_total_combinacao,
            'numero_aparelhos': len(renovador_resultado.get('melhor_comb', [])),
            'atende_necessidade': vazao_total_combinacao >= renovador_resultado['vazao_total_ar_exterior']
        })

    except DadosTermicos.DoesNotExist:
        renovador_resultado = {
            "melhor_comb": [],
            "vazao_total_ar_exterior": 0,
            "vazao_total_combinacao": 0,
            "numero_aparelhos": 0,
            "atende_necessidade": False
        }

    return render(request, 'ctermica/sistema_renovacao.html', {
        'projeto': projeto,
        'ambiente': ambiente,
        'renovador_resultado': renovador_resultado,
    })




from calculotermica.relatorio_completo_projeto import gerar_relatorio_todos_ambientes

@login_required
def relatorio_completo_projeto_view(request, projeto_id):
    if request.user.is_authenticated and request.user.tenant:
        connection.set_schema(request.user.tenant.schema_name)
    return gerar_relatorio_todos_ambientes(request, projeto_id)



from ctermica.pmoc import gerar_pmoc 

@login_required
def gerar_pmoc_view(request, projeto_id): 
    if request.user.is_authenticated and request.user.tenant:
        connection.set_schema(request.user.tenant.schema_name)

    projeto = get_object_or_404(Projeto, id=projeto_id)
    return gerar_pmoc(request, projeto) 



from calculotermica.relatorio_termo_instal import gerar_termo_instalacao

@login_required
def gerar_termo_instalacao_view(request, projeto_id):
    if request.user.is_authenticated and request.user.tenant:
        connection.set_schema(request.user.tenant.schema_name)

    projeto = get_object_or_404(Projeto, id=projeto_id)
    return gerar_termo_instalacao(request, projeto)


from calculotermica.relatorio_termo_manutencao import gerar_termo_de_referencia

@login_required
def gerar_termo_manutencao_view(request, projeto_id):
    if request.user.is_authenticated and request.user.tenant:
        connection.set_schema(request.user.tenant.schema_name)

    projeto = get_object_or_404(Projeto, id=projeto_id)
    return gerar_termo_de_referencia(request, projeto)




@login_required
def cadastrar_equipamento_existente(request, projeto_id):
    if request.user.tenant:
        connection.set_schema(request.user.tenant.schema_name)

    projeto = get_object_or_404(Projeto, id=projeto_id)

    if request.method == 'POST':
        nome_ambiente = request.POST.get("nome_ambiente")
        tipo = request.POST.get("tipo_aparelho")
        modelo = request.POST.get("modelo")

        Ambiente.objects.create(
            projeto=projeto,
            nome_ambiente=nome_ambiente,
            tipo_aparelho=tipo,
            carga_termica_total_ambiente=0,
            equipamento_existente=True  # <- TAG MARCADA AQUI
        )

        messages.success(request, f"Equipamento '{modelo}' cadastrado como existente no ambiente '{nome_ambiente}'.")
        return redirect('cadastrar_ambiente', projeto_id=projeto.id)

    return render(request, "ctermica/cadastrar_existente.html", {
        "projeto": projeto,
        "hiwall": HIWALL_MODELOS,
        "tipoduto": TIPODUTO_MODELOS,
        "cassete": CASSETE_4VIAS_MODELOS
    })
