import numpy as np

#inicio para paredes######################################

def obter_diferenciais_temperatura_paredes():
    """
    Retorna os diferenciais de temperatura para paredes internas com áreas climatizadas e não climatizadas,
    agora com 13 valores para representar as 13 horas do dia (06:00 às 18:00).
    """
    diferenciais_temperatura = {
        'interna_nao_climatizada_norte': np.array([2.0, 2.5, 3.5, 4.5, 4.8, 5.0, 5.0, 4.5, 3.8, 3.0, 2.2, 1.5, 1.2]),
        'interna_nao_climatizada_sul':   np.array([1.5, 1.8, 2.2, 2.5, 2.7, 3.0, 3.2, 3.0, 2.8, 2.5, 2.0, 1.5, 1.2]),
        'interna_nao_climatizada_leste': np.array([3.5, 4.0, 5.0, 6.0, 5.5, 5.0, 4.2, 3.5, 3.0, 2.5, 2.0, 1.5, 1.2]),
        'interna_nao_climatizada_oeste': np.array([2.5, 3.0, 3.8, 4.5, 5.2, 6.0, 6.2, 5.5, 4.8, 4.0, 3.0, 2.2, 1.5]),

        'interna_climatizada_norte': np.array([1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1]),
        'interna_climatizada_sul': np.array([1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1]),
        'interna_climatizada_leste': np.array([1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1]),
        'interna_climatizada_oeste': np.array([1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1])
    }
    return diferenciais_temperatura


def obter_diferenciais_temperatura_insolacao_parede():
    """
    Retorna os diferenciais de temperatura devido à insolação para cada orientação
    e cor da parede, com 13 valores representando o intervalo de 06h às 18h.
    """
    diferenciais_insolacao = {
        # Norte (mais suave)
        'parede_clara_norte': np.array([2.5, 3.0, 3.5, 4.0, 4.5, 4.0, 3.5, 3.0, 2.5, 2.0, 1.5, 1.0, 0.5]),
        'parede_media_norte': np.array([3.0, 3.5, 4.0, 4.5, 5.0, 4.5, 4.0, 3.5, 3.0, 2.5, 2.0, 1.5, 1.0]),
        'parede_escura_norte': np.array([3.5, 4.0, 4.5, 5.0, 5.5, 5.0, 4.5, 4.0, 3.5, 3.0, 2.5, 2.0, 1.5]),

        # Sul (mantido zero por conservadorismo, pode ajustar)
        'parede_clara_sul': np.zeros(13),
        'parede_media_sul': np.zeros(13),
        'parede_escura_sul': np.zeros(13),

        # Leste (pico de manhã)
        'parede_clara_leste': np.array([4.0, 5.0, 5.5, 5.5, 5.0, 4.5, 4.0, 3.0, 2.0, 1.5, 1.0, 0.5, 0.2]),
        'parede_media_leste': np.array([4.5, 5.5, 6.0, 6.0, 5.5, 5.0, 4.5, 3.5, 2.5, 2.0, 1.5, 1.0, 0.5]),
        'parede_escura_leste': np.array([5.0, 6.0, 6.5, 6.5, 6.0, 5.5, 5.0, 4.0, 3.0, 2.5, 2.0, 1.5, 1.0]),

        # Oeste (pico à tarde)
        'parede_clara_oeste': np.array([0.5, 1.0, 1.5, 2.0, 2.5, 3.0, 4.0, 5.0, 5.5, 5.0, 4.5, 4.0, 3.5]),
        'parede_media_oeste': np.array([1.0, 1.5, 2.0, 2.5, 3.0, 3.5, 4.5, 5.5, 6.0, 5.5, 5.0, 4.5, 4.0]),
        'parede_escura_oeste': np.array([1.5, 2.0, 2.5, 3.0, 3.5, 4.0, 5.0, 6.0, 6.5, 6.0, 5.5, 5.0, 4.5]),
    }
    return diferenciais_insolacao

#fim para paredes######################################

#
#
#
#

#inicio para vidros ###################################



import numpy as np

def obter_diferenciais_temperatura_vidros():
    """
    Retorna os diferenciais de temperatura por condução para vidros internos,
    considerando se o ambiente adjacente é climatizado ou não, e a orientação solar.
    Os valores são estimativas médias para uso em simulações térmicas horárias (06h às 18h).
    """
    diferenciais_temperatura_vidros = {
        # Ambientes internos com áreas NÃO climatizadas
        'interna_nao_climatizada_norte': np.array([2.5, 3.0, 3.5, 4.0, 4.0, 3.5, 3.0, 3.5, 3.5, 3.0, 2.5, 2.0, 1.5]),
        'interna_nao_climatizada_sul':   np.array([2.0, 2.5, 3.0, 3.5, 3.5, 3.0, 2.5, 3.0, 3.0, 2.5, 2.0, 1.5, 1.0]),
        'interna_nao_climatizada_leste': np.array([3.0, 3.5, 4.0, 4.5, 4.5, 4.0, 3.5, 4.0, 4.0, 3.5, 3.0, 2.5, 2.0]),
        'interna_nao_climatizada_oeste': np.array([3.0, 3.5, 4.0, 4.5, 4.5, 4.0, 3.5, 4.0, 4.0, 3.5, 3.0, 2.5, 2.0]),

        # Ambientes internos com áreas CLIMATIZADAS
        'interna_climatizada_norte': np.array([1.0] * 13),
        'interna_climatizada_sul':   np.array([1.0] * 13),
        'interna_climatizada_leste': np.array([1.0] * 13),
        'interna_climatizada_oeste': np.array([1.0] * 13),
    }

    return diferenciais_temperatura_vidros



import numpy as np

def obter_diferenciais_temperatura_insolacao_vidros():
    """
    Retorna os diferenciais de temperatura devido à insolação para vidros em diferentes orientações,
    considerando valores mais conservadores com base na literatura técnica.
    """
    diferenciais_insolacao_vidros = {
        # NORTE
        'vidro_transparente_norte': np.array([2.5, 3.0, 3.5, 4.0, 3.5, 3.0, 2.5, 3.0, 3.5, 3.0, 2.5, 2.0, 1.5]),
        'vidro_cortina_clara_norte': np.array([2.0, 2.5, 3.0, 3.5, 3.0, 2.5, 2.0, 2.5, 3.0, 2.5, 2.0, 1.5, 1.0]),
        'vidro_blackout_preto_norte': np.array([1.0] * 13),

        # SUL (sem insolação direta, conservadormente mantido como zero)
        'vidro_transparente_sul': np.zeros(13),
        'vidro_cortina_clara_sul': np.zeros(13),
        'vidro_blackout_preto_sul': np.zeros(13),

        # LESTE
        'vidro_transparente_leste': np.array([3.0, 3.5, 4.0, 4.5, 4.0, 3.5, 3.0, 3.5, 4.0, 3.5, 3.0, 2.5, 2.0]),
        'vidro_cortina_clara_leste': np.array([2.5, 3.0, 3.5, 4.0, 3.5, 3.0, 2.5, 3.0, 3.5, 3.0, 2.5, 2.0, 1.5]),
        'vidro_blackout_preto_leste': np.array([1.0] * 13),

        # OESTE (radiação mais intensa no fim da tarde)
        'vidro_transparente_oeste': np.array([3.5, 4.0, 4.5, 5.0, 4.5, 4.0, 3.5, 4.0, 4.5, 4.0, 3.5, 3.0, 2.5]),
        'vidro_cortina_clara_oeste': np.array([3.0, 3.5, 4.0, 4.5, 4.0, 3.5, 3.0, 3.5, 4.0, 3.5, 3.0, 2.5, 2.0]),
        'vidro_blackout_preto_oeste': np.array([1.0] * 13),
    }

    return diferenciais_insolacao_vidros




#fim para vidros #####################################

#
#
#
#

#inicio para portas de madeira e portas de vidros ########################

import numpy as np

def obter_diferenciais_temperatura_porta():
    """ 
    Retorna os diferenciais de temperatura por condução térmica (∆T) entre ambientes internos e externos,
    para diferentes orientações e tipos de ambiente.
    """
    diferenciais_temperatura = {
        'interna_nao_climatizada_norte': np.array([2.5, 3.0, 3.5, 4.0, 4.0, 3.5, 3.0, 3.5, 3.5, 3.0, 2.5, 2.0, 1.5]),
        'interna_nao_climatizada_sul':   np.array([2.0, 2.5, 3.0, 3.5, 3.5, 3.0, 2.5, 3.0, 3.0, 2.5, 2.0, 1.5, 1.0]),
        'interna_nao_climatizada_leste': np.array([3.0, 3.5, 4.0, 4.5, 4.5, 4.0, 3.5, 4.0, 4.0, 3.5, 3.0, 2.5, 2.0]),
        'interna_nao_climatizada_oeste': np.array([3.0, 3.5, 4.0, 4.5, 4.5, 4.0, 3.5, 4.0, 4.0, 3.5, 3.0, 2.5, 2.0]),

        'interna_climatizada_norte': np.array([1.0] * 13),
        'interna_climatizada_sul':   np.array([1.0] * 13),
        'interna_climatizada_leste': np.array([1.0] * 13),
        'interna_climatizada_oeste': np.array([1.0] * 13),
    }

    return diferenciais_temperatura




def obter_diferenciais_temperatura_insolacao_porta():
    """
    Retorna os diferenciais de temperatura devido à insolação para portas
    em diferentes materiais e orientações, com valores mais conservadores
    baseados em literatura técnica.
    """
    diferenciais = {}

    # Materiais típicos
    materiais = {
        "clara": 2.0,
        "media": 2.5,
        "escura": 3.0,
        "transparente": 3.2,
        "cortina_clara": 2.4,
        "blackout": 1.0,
        "aluminio_refletivo": 1.5,
        "aluminio_neutro": 2.2,
        "aluminio_absorvedor": 2.8,
        "aco_refletivo": 2.0,
        "aco_convencional": 2.8,
        "aco_exposto": 3.5,
        "pvc_refletivo": 1.8,
        "pvc_neutro": 2.5,
        "pvc_absorvedor": 3.0,
        "composta_refletiva": 2.2,
        "composta_neutra": 2.7,
        "composta_absorvedora": 3.2,
        "isolante_convencional": 1.0,
        "isolante_refletivo": 1.2,
        "isolante_multicamadas": 1.5,
    }

    # Orientações com pesos solares típicos
    orientacoes = {
        "norte": [0.7, 0.9, 1.0, 1.1, 1.0, 0.9, 0.7, 0.9, 1.0, 0.9, 0.7, 0.5, 0.3],
        "sul":   [0.0] * 13,
        "leste": [0.9, 1.0, 1.1, 1.2, 1.1, 1.0, 0.9, 1.0, 1.1, 1.0, 0.9, 0.8, 0.7],
        "oeste": [1.0, 1.1, 1.2, 1.3, 1.2, 1.1, 1.0, 1.1, 1.2, 1.1, 1.0, 0.9, 0.8],
    }

    # Mapeamento combinando materiais com orientações
    combinacoes = {
        "madeira": ["clara", "media", "escura"],
        "vidro": ["transparente", "cortina_clara", "blackout"],
        "aluminio": ["refletivo", "neutro", "absorvedor"],
        "aco": ["refletivo", "convencional", "exposto"],
        "pvc": ["refletivo", "neutro", "absorvedor"],
        "composta": ["refletiva", "neutra", "absorvedora"],
        "isolante": ["convencional", "refletivo", "multicamadas"],
    }

    for orientacao, pesos in orientacoes.items():
        for categoria, tipos in combinacoes.items():
            for tipo in tipos:
                chave_tipo = f"{categoria}_{tipo}"
                chave = f"porta_{chave_tipo}_{orientacao}"
                valor_base = materiais.get(chave_tipo, 1.0)
                diferencial = np.round(np.array(pesos) * valor_base, 2)
                diferenciais[chave] = diferencial

    return diferenciais


#fim para portas de vidro e madeira ##############3

#
#
#
#

#inicio para telhado ###################

import numpy as np

import numpy as np

def obter_diferenciais_temperatura_tipo_telhado():
    """
    Retorna os diferenciais de temperatura para telhados de diferentes tipos e condições
    (externo, interno não climatizado, interno climatizado).
    """
    diferenciais_temperatura_telhado = {
        
        # Internos com áreas não climatizadas: aquecem moderadamente por troca térmica com a estrutura externa
        'interno_nao_climatizado': np.array([5.5, 7.0, 9.0, 11.0, 13.0, 14.5, 15.0, 13.5, 11.0, 9.0, 7.5, 6.5, 5.5]),
        
        # Internos climatizados: apresentam baixa variação de temperatura devido ao controle térmico
        'interno_climatizado': np.array([1.5] * 13),
    }

    return diferenciais_temperatura_telhado

def obter_diferenciais_temperatura_insolacao_telhado():
    """
    Retorna os diferenciais de temperatura devido à insolação para tipos de telhados específicos.
    """
    diferenciais_insolacao_telhado = {
        # Lajes claras: baixa absorção de calor, com uma curva de temperatura mais suavizada
        'telhado_laje_clara': np.array([8.5, 11.5, 14.0, 17.0, 19.0, 21.5, 22.0, 20.0, 17.0, 14.0, 11.5, 9.5, 8.5]),
        
        # Lajes escuras: alta absorção, com maior retenção de calor ao longo do dia
        'telhado_laje_escura': np.array([12.0, 15.5, 19.0, 23.0, 27.0, 30.0, 31.0, 28.0, 24.0, 19.0, 15.0, 13.0, 12.0]),
        
        'telhado_americana': np.array([7.0, 9.0, 11.0, 13.5, 15.0, 16.5, 17.0, 15.0, 12.5, 10.0, 8.5, 7.5, 7.0]),
        'telhado_colonial':  np.array([8.0, 10.5, 12.5, 15.0, 17.0, 18.5, 19.0, 17.0, 14.5, 11.5, 9.5, 8.5, 8.0]),
        'telhado_portuguesa': np.array([9.0, 11.5, 13.5, 16.0, 18.0, 19.5, 20.0, 18.0, 15.5, 12.5, 10.0, 9.0, 9.0]),
        
        # Telhado de metal simples: muito alta absorção com picos intensos devido à ausência de isolamento
        'telhado_metal_simples': np.array([18.0, 22.0, 27.0, 32.0, 36.0, 38.0, 39.0, 36.0, 32.0, 26.0, 22.0, 19.0, 18.0]),
        
        # Telhado de metal sanduíche: bem isolado, variando pouco em relação à temperatura ambiente
        'telhado_metal_sanduiche': np.array([4.5, 5.5, 7.0, 8.5, 10.0, 11.0, 11.5, 10.5, 8.5, 7.0, 6.0, 5.0, 4.5]),
    }

    return diferenciais_insolacao_telhado
