import numpy as np
from .cargasparedes import carregar_temperaturas_projeto
from .ctermicacalc import obter_diferenciais_temperatura_vidros, obter_diferenciais_temperatura_insolacao_vidros



# Função para calcular carga de insolação para vidros com chave modificada para `key`
def calcular_carga_insolacao_vidro(vidro, orientacao):
    diferenciais_insolacao = obter_diferenciais_temperatura_insolacao_vidros()
    key = getattr(vidro, f'diferencial_insolacao_{orientacao}', None)
    diferencial_insolacao = diferenciais_insolacao.get(key, np.zeros(13))
    
    area_vidro = getattr(vidro, f'area_vidro_{orientacao}', None)
    coeficiente_vidro = getattr(vidro, f'coeficiente_vidro_{orientacao}', None)

    #print(f"Chave para diferencial de insolação ({orientacao}): {key}")
    #print(f"Diferencial de Insolação ({key}): {diferencial_insolacao}")
    #print(f"Área Vidro ({orientacao}): {area_vidro}")
    #print(f"Coeficiente Vidro ({orientacao}): {coeficiente_vidro}")

    if area_vidro is not None and coeficiente_vidro is not None:
        carga_insolacao = coeficiente_vidro * area_vidro * diferencial_insolacao
    else:
        carga_insolacao = np.zeros(13)
        #print(f"Motivo de carga zero para {orientacao}: Falta de área ou coeficiente.")

    #print(f"Carga Insolação Vidro ({orientacao}): {carga_insolacao}")
    return carga_insolacao



# Função para calcular carga térmica de temperatura para vidros
def calcular_carga_termica_vidro(projeto_id, vidro, termicos, orientacao):
    temperaturas_externas = carregar_temperaturas_projeto(projeto_id)
    temperatura_interna = termicos.temperatura_interna
    tipo_vidro = getattr(vidro, f'tipo_vidro_{orientacao}', None)
    area_vidro = getattr(vidro, f'area_vidro_{orientacao}', None)
    coeficiente_vidro = getattr(vidro, f'coeficiente_vidro_{orientacao}', None)

    if tipo_vidro == 'externo':
        diferencial = temperaturas_externas - temperatura_interna
    else:
        diferenciais_temperatura = obter_diferenciais_temperatura_vidros()
        key = f"{tipo_vidro}_{orientacao}"
        diferencial = diferenciais_temperatura.get(key, np.zeros(len(temperaturas_externas)))

    if diferencial is not None and area_vidro is not None and coeficiente_vidro is not None:
        carga_termica = coeficiente_vidro * area_vidro * diferencial
    else:
        carga_termica = np.zeros(len(temperaturas_externas))

    return carga_termica


# Função de agregação para calcular todas as cargas térmicas e de insolação para vidros
def calcular_cargas_vidros(projeto_id, vidros, termicos):
    cargas_termo_vidros = {}
    cargas_insolacao_vidros = {}

    for orientacao in ['norte', 'sul', 'leste', 'oeste']:
        cargas_termo_vidros[orientacao] = np.zeros(13)
        cargas_insolacao_vidros[orientacao] = np.zeros(13)

        for vidro in vidros:
            carga_termica = calcular_carga_termica_vidro(projeto_id, vidro, termicos, orientacao)
            carga_insolacao = calcular_carga_insolacao_vidro(vidro, orientacao)

            cargas_termo_vidros[orientacao] += carga_termica
            cargas_insolacao_vidros[orientacao] += carga_insolacao

    return cargas_termo_vidros, cargas_insolacao_vidros
