import numpy as np
from .ctermicacalc import (
    obter_diferenciais_temperatura_tipo_telhado,
    obter_diferenciais_temperatura_insolacao_telhado
)
from .cargasparedes import carregar_temperaturas_projeto

# Função para calcular carga térmica de temperatura para telhados
def calcular_carga_termica_telhado(projeto_id, telhado, termicos):
    """
    Calcula a carga térmica de temperatura para um telhado com base no diferencial de temperatura.
    """
    # Carrega as temperaturas externas do projeto
    temperaturas_externas = carregar_temperaturas_projeto(projeto_id)
    temperatura_interna = termicos.temperatura_interna
    tipo_telhado = getattr(telhado, 'tipo_telhado', None)
    area_telhado = getattr(telhado, 'area_telhado', None)
    coeficiente_telhado = getattr(telhado, 'coeficiente_telhado', None)

    # Seleciona o diferencial de temperatura de acordo com o tipo de telhado
    if tipo_telhado == 'externo':
        diferencial = temperaturas_externas - temperatura_interna
    else:
        diferenciais_temperatura = obter_diferenciais_temperatura_tipo_telhado()
        diferencial = diferenciais_temperatura.get(tipo_telhado, np.zeros(len(temperaturas_externas)))

    # Calcula a carga térmica ou retorna zero se algum parâmetro estiver ausente
    if diferencial is not None and area_telhado is not None and coeficiente_telhado is not None:
        carga_termica = coeficiente_telhado * area_telhado * diferencial
    else:
        carga_termica = np.zeros(len(temperaturas_externas))

    return carga_termica

# Função para calcular carga de insolação para telhados
def calcular_carga_insolacao_telhado(projeto_id, telhado, termicos):
    """
    Calcula a carga de insolação para um telhado com base no diferencial de insolação.
    """
    diferenciais_insolacao = obter_diferenciais_temperatura_insolacao_telhado()
    key = getattr(telhado, 'diferencial_insolacao_telhado', None)
    diferencial_insolacao = diferenciais_insolacao.get(key, np.zeros(13))
    
    area_telhado = getattr(telhado, 'area_telhado', None)
    coeficiente_telhado = getattr(telhado, 'coeficiente_telhado', None)

    # Calcula a carga de insolação ou retorna zero se algum parâmetro estiver ausente
    if area_telhado is not None and coeficiente_telhado is not None:
        carga_insolacao = coeficiente_telhado * area_telhado * diferencial_insolacao
    else:
        carga_insolacao = np.zeros(13)

    return carga_insolacao

# Função de agregação para calcular todas as cargas térmicas e de insolação para telhados
def calcular_cargas_telhados(projeto_id, telhados, termicos):
    """
    Agrega as cargas térmicas e de insolação para todos os telhados do ambiente.
    Retorna dois arrays: cargas térmicas e cargas de insolação para todos os horários.
    """
    cargas_termo_telhados_total = np.zeros(13)  # Total das cargas térmicas para cada horário
    cargas_insolacao_telhados_total = np.zeros(13)  # Total das cargas de insolação para cada horário

    for telhado in telhados:
        carga_termica = calcular_carga_termica_telhado(projeto_id, telhado, termicos)
        carga_insolacao = calcular_carga_insolacao_telhado(projeto_id, telhado, termicos)

        # Acumula as cargas térmicas e de insolação em cada horário
        cargas_termo_telhados_total += carga_termica
        cargas_insolacao_telhados_total += carga_insolacao

    # Retornar dois valores: total de cargas térmicas e de insolação
    return cargas_termo_telhados_total, cargas_insolacao_telhados_total

