import numpy as np
from .ctermicacalc import (
    obter_diferenciais_temperatura_insolacao_porta,
    obter_diferenciais_temperatura_porta,
)
from projeto.models import Projeto
from termicos.models import DadosTermicos
from django.shortcuts import get_object_or_404
from .cargasparedes import carregar_temperaturas_projeto


# Função para calcular carga de insolação para portas (modelo unificado)
def calcular_carga_insolacao_porta(porta, orientacao):
    diferenciais_insolacao = obter_diferenciais_temperatura_insolacao_porta()
    key = getattr(porta, f'diferencial_insolacao_{orientacao}', None)
    diferencial_insolacao = diferenciais_insolacao.get(key, np.zeros(13))

    area_porta = getattr(porta, f'area_porta_{orientacao}', None)
    coeficiente_porta = getattr(porta, f'coeficiente_porta_{orientacao}', None)

    if area_porta is not None and coeficiente_porta is not None:
        carga_insolacao = coeficiente_porta * area_porta * diferencial_insolacao
    else:
        carga_insolacao = np.zeros(13)

    return carga_insolacao


# Função para calcular carga térmica de temperatura para portas (modelo unificado)
def calcular_carga_termica_porta(projeto_id, porta, termicos, orientacao):
    temperaturas_externas = carregar_temperaturas_projeto(projeto_id)
    temperatura_interna = termicos.temperatura_interna
    tipo_porta = getattr(porta, f'tipo_porta_{orientacao}', None)
    area_porta = getattr(porta, f'area_porta_{orientacao}', None)
    coeficiente_porta = getattr(porta, f'coeficiente_porta_{orientacao}', None)

    if tipo_porta == 'externa':
        diferencial = temperaturas_externas - temperatura_interna
    else:
        diferenciais_temperatura = obter_diferenciais_temperatura_porta()
        key = f"{tipo_porta}_{orientacao}"
        diferencial = diferenciais_temperatura.get(key, np.zeros(len(temperaturas_externas)))

    if diferencial is not None and area_porta is not None and coeficiente_porta is not None:
        carga_termica = coeficiente_porta * area_porta * diferencial
    else:
        carga_termica = np.zeros(len(temperaturas_externas))

    return carga_termica


# Agregador geral das cargas de portas unificadas
def calcular_cargas_portas(projeto_id, porta, termicos):
    cargas_termo_portas = {}
    cargas_insolacao_portas = {}

    total_carga_termica = np.zeros(13)
    total_carga_insolacao = np.zeros(13)

    for orientacao in ['norte', 'sul', 'leste', 'oeste']:
        carga_termica = calcular_carga_termica_porta(projeto_id, porta, termicos, orientacao)
        carga_insolacao = calcular_carga_insolacao_porta(porta, orientacao)

        cargas_termo_portas[orientacao] = carga_termica
        cargas_insolacao_portas[orientacao] = carga_insolacao

        total_carga_termica += carga_termica
        total_carga_insolacao += carga_insolacao

    return cargas_termo_portas, cargas_insolacao_portas, total_carga_termica, total_carga_insolacao


