# cargasparedes.py
import os
import pandas as pd
import numpy as np
from django.conf import settings
from django.shortcuts import get_object_or_404
from projeto.models import Projeto
from termicos.models import DadosTermicos
from .ctermicacalc import obter_diferenciais_temperatura_paredes, obter_diferenciais_temperatura_insolacao_parede

# Função para carregar dados climáticos do CSV para paredes externas

def carregar_temperaturas_projeto2(projeto_id):
    projeto = get_object_or_404(Projeto, id=projeto_id)
    caminho_csv = os.path.join(settings.BASE_DIR, f"arquivos_climaticos/{projeto.nome_projeto}/dados_climaticos_{projeto.nome_projeto}.csv")
    
    if not os.path.exists(caminho_csv):
        raise FileNotFoundError(f"O arquivo {caminho_csv} não foi encontrado.")

    # Aqui, fazemos a leitura dos dados climáticos
    dados = pd.read_csv(caminho_csv, sep=';')
    temperaturas_externas = dados["temperature_2m"].values
    umidade_absoluta_externa = dados["umidade_absoluta"].values
    calor_latente_agua = dados["calor_latente"].values

    return temperaturas_externas, umidade_absoluta_externa, calor_latente_agua


def carregar_temperaturas_projeto(projeto_id):
    projeto = get_object_or_404(Projeto, id=projeto_id)
    caminho_csv = os.path.join(settings.BASE_DIR, f"arquivos_climaticos/{projeto.nome_projeto}/dados_climaticos_{projeto.nome_projeto}.csv")
    
    if not os.path.exists(caminho_csv):
        raise FileNotFoundError(f"O arquivo {caminho_csv} não foi encontrado.")
    
    df_climatico = pd.read_csv(caminho_csv, delimiter=';')
    df_climatico['time'] = pd.to_datetime(df_climatico['time'])
    df_diurno = df_climatico[(df_climatico['time'].dt.hour >= 6) & (df_climatico['time'].dt.hour <= 18)]
    temperaturas = df_diurno['temperature_2m'].values
    
    return temperaturas

# Função para calcular carga térmica com base no tipo e orientação da parede
def calcular_carga_termica_parede(projeto_id, parede, termicos, orientacao):
    temperaturas_externas = carregar_temperaturas_projeto(projeto_id)
    temperatura_interna = termicos.temperatura_interna
    carga_termica = []

    tipo_parede = getattr(parede, f'tipo_parede_{orientacao}', None)
    area_parede = getattr(parede, f'area_parede_{orientacao}', None)
    coeficiente_parede = getattr(parede, f'coeficiente_parede_{orientacao}', None)

    if tipo_parede == 'externa':
        diferencial = temperaturas_externas - temperatura_interna
    else:
        diferenciais_temperatura = obter_diferenciais_temperatura_paredes()
        key = f"{tipo_parede}_{orientacao}"
        diferencial = diferenciais_temperatura.get(key)
    
    if diferencial is not None and area_parede is not None and coeficiente_parede is not None:
        carga_termica = coeficiente_parede * area_parede * diferencial

    return carga_termica

# Função para calcular carga térmica devido à insolação
def calcular_carga_insolacao_parede(parede, orientacao):
    diferenciais_insolacao = obter_diferenciais_temperatura_insolacao_parede()
    key = getattr(parede, f'diferencial_insolacao_{orientacao}', None)
    diferencial_insolacao = diferenciais_insolacao.get(key, np.zeros(12))
    
    area_parede = getattr(parede, f'area_parede_{orientacao}', None)
    coeficiente_parede = getattr(parede, f'coeficiente_parede_{orientacao}', None)

    if area_parede is not None and coeficiente_parede is not None:
        carga_insolacao = coeficiente_parede * area_parede * diferencial_insolacao
    else:
        carga_insolacao = np.zeros(12)

    return carga_insolacao
