from django.http import HttpResponse,JsonResponse
from django.shortcuts import render, redirect
from datetime import datetime, timedelta
from collections import defaultdict
import io, json, csv, requests, locale

from .models import *

def obtener_temperaturas(dias):
    lat = -32.868999
    lon = -70.15175

    url = "https://api.open-meteo.com/v1/forecast"
    # "hourly": "temperature_2m,relative_humidity_2m,precipitation,wind_speed_10m",
    params = {
        "latitude": lat,
        "longitude": lon,
        "hourly": "temperature_2m,relative_humidity_2m,precipitation,wind_speed_10m",
        "past_days": dias,
        "timezone": "America/Santiago"
    }

    response = requests.get(url, params=params)
    data = response.json()

    return data["hourly"]

from django.contrib.auth import authenticate, login
from django.contrib.auth.forms import AuthenticationForm
def grafico_vacio(request):
    if request.user.is_authenticated:
        return render(request,'grafico_dinamico.html')
    else:
        if request.method == "POST":
            form = AuthenticationForm(request, data=request.POST)
    
            if form.is_valid():
                user = form.get_user()
                login(request, user)
                return redirect("grafico_vacio2")
        else:
            form = AuthenticationForm()
    
        return render(request, "login.html", {
            "form": form
        })

from .models import Experimentos_Colbun_externa,Mediciones_externa
from zoneinfo import ZoneInfo
def data_para_grafico(request,tipo):
    #hoy = datetime.datetime.now().astimezone(ZoneInfo("America/Santiago"))
    hoy = datetime.datetime.now(datetime.UTC)
    if tipo == 'dia':
        #inicio = datetime.datetime(hoy.year,hoy.month,hoy.day,0,0,1).astimezone(ZoneInfo("America/Santiago"))
        inicio = hoy - datetime.timedelta(hours=24)
        experimentos_0 = Experimentos_Colbun_externa.objects.filter(genko="Colbun_0",fecha__range=(inicio,hoy)).using('external_db_datos_1')
        #experimentos_1 = Experimentos_Colbun_externa.objects.filter(genko="Colbun_1",fecha__range=(inicio,hoy)).using('external_db_datos_1')
        
        #experimentos_0 = Experimentos_Colbun.objects.filter(fecha__range=(inicio,hoy)).using('db_genko_0')
        #experimentos_1 = Experimentos_Colbun.objects.filter(fecha__range=(inicio,hoy)).using('db_genko_1')
    
    if tipo == 'semana':
        inicio = hoy - datetime.timedelta(days=7)
        
        experimentos_0 = Experimentos_Colbun_externa.objects.filter(genko="Colbun_0",fecha__range=(inicio,hoy)).using('external_db_datos_1')
        #experimentos_1 = Experimentos_Colbun_externa.objects.filter(genko="Colbun_1",fecha__range=(inicio,hoy)).using('external_db_datos_1')

        #experimentos_0 = Experimentos_Colbun.objects.filter(fecha__range=(inicio,hoy)).using('db_genko_0')
        #experimentos_1 = Experimentos_Colbun.objects.filter(fecha__range=(inicio,hoy)).using('db_genko_1')

    if tipo == 'mes':
        inicio = hoy - datetime.timedelta(days=30)
        
        experimentos_0 = Experimentos_Colbun_externa.objects.filter(genko="Colbun_0",fecha__range=(inicio,hoy)).using('external_db_datos_1')
        #experimentos_1 = Experimentos_Colbun_externa.objects.filter(genko="Colbun_1",fecha__range=(inicio,hoy)).using('external_db_datos_1')

        #experimentos_0 = Experimentos_Colbun.objects.filter(fecha__range=(inicio,hoy)).using('db_genko_0')
        #experimentos_1 = Experimentos_Colbun.objects.filter(fecha__range=(inicio,hoy)).using('db_genko_1')

    datos = []
    if tipo == 'dia':
        experimentos_filtrados = experimentos_0
    if tipo == 'semana':
        experimentos_filtrados = experimentos_0[::8]
    if tipo == 'mes':
        experimentos_filtrados = experimentos_0[::16]

    ids_experimentos = [e.id for e in experimentos_filtrados]
    mediciones_por_experimento = Mediciones_externa.objects.filter(experimento_id__in=ids_experimentos, altura=3100).using('external_db_datos_1').select_related('experimento')
    #mediciones_por_experimento = Mediciones_externa.objects.filter(experimento_id__in=ids_experimentos, altura=75).using('external_db_datos_1').select_related('experimento')
    #mediciones_por_experimento = Mediciones.objects.filter(experimento_id__in=ids_experimentos, altura=75).using('db_genko_0').select_related('experimento')

    meds_por_experimento = defaultdict(list)
    for m in mediciones_por_experimento:
        meds_por_experimento[m.experimento_id].append(m)
    
    valor_max = 24000
    for experimento in experimentos_filtrados:
        fecha_local = experimento.fecha.astimezone(ZoneInfo("America/Santiago"))
        for m in meds_por_experimento[experimento.id]:
            t = fecha_local + timedelta(seconds=m.tiempo)
            datos.append({
                'x': t.strftime("%Y-%m-%dT%H:%M:%S"),
                'y': 100*(valor_max - m.v_lectura)/valor_max
            })

    datos_1 = []
    """
    if tipo == 'dia':
        experimentos_filtrados = experimentos_1
    if tipo == 'semana':
        experimentos_filtrados = experimentos_1
    if tipo == 'mes':
        experimentos_filtrados = experimentos_1
    ids_experimentos = [e.id for e in experimentos_filtrados]
    mediciones_por_experimento = Mediciones_externa.objects.filter(experimento_id__in=ids_experimentos, altura=0).using('external_db_datos_1').select_related('experimento')
    #mediciones_por_experimento = Mediciones_externa.objects.filter(experimento_id__in=ids_experimentos, altura=75).using('external_db_datos_1').select_related('experimento')
    #mediciones_por_experimento = Mediciones.objects.filter(experimento_id__in=ids_experimentos, altura=75).using('db_genko_1').select_related('experimento')

    meds_por_experimento = defaultdict(list)
    for m in mediciones_por_experimento:
        meds_por_experimento[m.experimento_id].append(m)

    for experimento in experimentos_filtrados:
        fecha_local = experimento.fecha.astimezone(ZoneInfo("America/Santiago"))
        for m in meds_por_experimento[experimento.id]:
            t = fecha_local + timedelta(seconds=m.tiempo)
            datos_1.append({
                'x': t.strftime("%Y-%m-%dT%H:%M:%S"),
                'y': m.v_lectura
            })
    
    try:
        max_value_0 = max(datos, key=lambda d: d['y'])
    except:
        max_value_0 = {'y':0}
    
    try:
        max_value_1 = max(datos_1, key=lambda d: d['y'])
    except:
        max_value_1 = {'y':0}
    """
    
    try:
        #return JsonResponse({"data":datos,"data_1":datos_1,"fecha_min":inicio.strftime("%Y-%m-%dT%H:%M:%S"),"fecha_max":(hoy-datetime.timedelta(hours=4)).strftime("%Y-%m-%dT%H:%M:%S"),"v_max":round(max(max_value_0['y'],max_value_1['y']),-1)})
        return JsonResponse({"data":datos[::10],"data_1":datos_1,"fecha_min":(inicio.astimezone(ZoneInfo("America/Santiago"))).strftime("%Y-%m-%dT%H:%M:%S"),"fecha_max":(hoy.astimezone(ZoneInfo("America/Santiago"))).strftime("%Y-%m-%dT%H:%M:%S"),"v_max":5})
    except:
        return JsonResponse({"data":datos,"data_1":datos_1,"v_max":0,"fecha_min":inicio.strftime("%Y-%m-%dT%H:%M:%S"),"fecha_max":hoy.strftime("%Y-%m-%dT%H:%M:%S")})

def data_para_grafico_temperatura(request,tipo):
    hoy = datetime.datetime.now(ZoneInfo("America/Santiago"))
    if tipo == 'dia':
        antes = hoy - datetime.timedelta(days=1)
        
        data = obtener_temperaturas(1)

        horas_cl = [datetime.datetime.fromisoformat(v) for v in data['time']]
        temperaturas = data['temperature_2m']
        vientos = data['wind_speed_10m']
    if tipo == 'semana':
        antes = hoy - datetime.timedelta(days=7)
        
        data = obtener_temperaturas(7)
        horas_cl = [datetime.datetime.fromisoformat(v) for v in data['time']]
        temperaturas = data['temperature_2m']
        vientos = data['wind_speed_10m']
    if tipo == 'mes':
        antes = hoy - datetime.timedelta(days=30)
        
        data = obtener_temperaturas(30)
        horas_cl = [datetime.datetime.fromisoformat(v) for v in data['time']]
        temperaturas = data['temperature_2m']
        vientos = data['wind_speed_10m']

    # Util para meteostat
    #df = obtener_temperaturas_1()
    #horas = df.index.tolist() #strftime('%Y-%m-%dT%H:%M')
    #horas_cl = [datetime.datetime(year=v.year,month=v.month,day=v.day,hour=v.hour,minute=v.minute,second=v.second) - datetime.timedelta(hours=3) for v in horas]
    #temperaturas = df['temp'].tolist()
    return JsonResponse({"horas":horas_cl,"temperaturas":temperaturas,"temperatura_max":max(temperaturas),"vientos":vientos,"viento_max":max(vientos),"fecha_min":antes.strftime("%Y-%m-%dT%H:%M:%S"),"fecha_max":hoy.strftime("%Y-%m-%dT%H:%M:%S")})