from flask import Flask, request, jsonify
import pymongo
from datetime import datetime
import pytz

app = Flask(__name__)

# Conexión con MongoDB
client = pymongo.MongoClient("mongodb+srv://daniel:daniel89@cluster0.ktnrq.azure.mongodb.net/")

# Bases de datos y colecciones
pecera_db = client["peceraDB"]
caldera_db = client["calderaDB"]
pecera_collection = pecera_db["datos"]
reles_collection = pecera_db["reles"]
calefacion_collection = caldera_db["calefacionGasoil"]

@app.route('/caldera/', methods=['POST'])
def recibir_datos_caldera():
    try:
        data = request.get_json()
        campos = ['sonda1', 'sonda2', 'sonda3', 'bmeTemp', 'bmeHum', 'bmePres', 'bmeGas']
        if not all(campo in data for campo in campos):
            return jsonify({"error": "Faltan datos"}), 400

        data_to_insert = {campo: float(data[campo]) for campo in campos}
        data_to_insert["timestamp"] = datetime.now(pytz.timezone("Europe/Madrid")).isoformat()

        calefacion_collection.insert_one({"datos": data_to_insert})
        return jsonify({"message": "Datos caldera almacenados"}), 200

    except Exception as e:
        app.logger.error(f"Error caldera: {e}")
        return jsonify({"error": "Error procesando datos"}), 500

@app.route('/pecera/data', methods=['POST'])
def recibir_datos_pecera():
    try:
        data = request.get_json()
        if not all(k in data for k in ['t1', 'h1', 't2']):
            return jsonify({"error": "Datos incompletos"}), 400

        data_to_insert = {
            "t1": float(data['t1']),
            "h1": float(data['h1']),
            "t2": float(data['t2']),
            "timestamp": datetime.now(pytz.timezone("Europe/Madrid")).isoformat()
        }
        pecera_collection.insert_one(data_to_insert)
        return jsonify({"message": "Datos pecera almacenados"}), 200

    except Exception as e:
        app.logger.error(f"Error pecera: {e}")
        return jsonify({"error": "Error procesando datos"}), 500

@app.route('/pecera/control', methods=['GET'])
def obtener_estado_dispositivos():
    estado = reles_collection.find_one({}, {"_id": 0}) or {}
    # Asegura que los campos existen
    estado.setdefault("relay1", False)
    estado.setdefault("relay2", False)
    estado.setdefault("pantalla", True)  # Por defecto la pantalla encendida
    estado.setdefault("auto", True)
    return jsonify(estado), 200

@app.route('/pecera/control', methods=['POST'])
def actualizar_estado_dispositivos():
    data = request.get_json()
    # Pantalla es obligatoria en las nuevas llamadas. Si quieres dejarlo opcional para compatibilidad antigua, usa: data.get('pantalla', True)
    if not all(k in data for k in ['relay1', 'relay2', 'pantalla', 'auto']):
        return jsonify({"error": "Faltan parámetros"}), 400

    reles_collection.delete_many({})
    reles_collection.insert_one({
        "relay1": data['relay1'],
        "relay2": data['relay2'],
        "pantalla": data['pantalla'],
        "auto": data['auto']
    })
    return jsonify({"message": "Estado actualizado"}), 200

@app.route('/pecera/historico', methods=['GET'])
def historico_datos():
    datos = list(pecera_collection.find().sort("timestamp", -1).limit(50))
    datos.reverse()
    return jsonify([
        {"timestamp": d["timestamp"], "t1": d["t1"], "h1": d["h1"], "t2": d["t2"]} for d in datos
    ])

@app.route('/pecera/dashboard', methods=['GET', 'POST'])
def dashboard():
    if request.method == 'POST':
        relay1 = 'relay1' in request.form
        relay2 = 'relay2' in request.form
        pantalla = 'pantalla' in request.form
        auto = 'auto' in request.form
        reles_collection.delete_many({})
        reles_collection.insert_one({"relay1": relay1, "relay2": relay2, "pantalla": pantalla, "auto": auto})

    estado = reles_collection.find_one({}, {"_id": 0}) or {}
    estado.setdefault("relay1", False)
    estado.setdefault("relay2", False)
    estado.setdefault("pantalla", True)
    estado.setdefault("auto", True)

    return f"""
    <!DOCTYPE html>
    <html>
    <head>
        <title>Dashboard Pecera</title>
        <script src='https://cdn.jsdelivr.net/npm/chart.js'></script>
    </head>
    <body>
        <h2>Panel de Control + Gráfica</h2>
        <form method='POST'>
            <label><input type='checkbox' name='relay1' {'checked' if estado.get('relay1') else ''}> Bombeo</label><br>
            <label><input type='checkbox' name='relay2' {'checked' if estado.get('relay2') else ''}> Burbujeo</label><br>
            <label><input type='checkbox' name='pantalla' {'checked' if estado.get('pantalla') else ''}> Pantalla LCD encendida</label><br>
            <label><input type='checkbox' name='auto' {'checked' if estado.get('auto') else ''}> Modo automático</label><br><br>
            <button type='submit'>Actualizar estado</button>
        </form>
        <p><strong>Nota:</strong> Si el modo automático está activado, el calefactor se regula por temperatura.</p>

        <hr>
        <canvas id='grafica' width='600' height='300'></canvas>
        <script>
        async function cargarDatos() {{
            const res = await fetch('/pecera/historico');
            const data = await res.json();
            const labels = data.map(d => new Date(d.timestamp).toLocaleTimeString());
            const t1 = data.map(d => d.t1);
            const h1 = data.map(d => d.h1);
            const t2 = data.map(d => d.t2);

            new Chart(document.getElementById('grafica'), {{
                type: 'line',
                data: {{
                    labels: labels,
                    datasets: [
                        {{ label: 'Temp. ambiente (°C)', data: t1, borderColor: 'orange', borderWidth: 2, fill: false }},
                        {{ label: 'Humedad (%)', data: h1, borderColor: 'blue', borderWidth: 2, fill: false }},
                        {{ label: 'Temp. agua (°C)', data: t2, borderColor: 'green', borderWidth: 2, fill: false }}
                    ]
                }},
                options: {{ responsive: true, scales: {{ y: {{ beginAtZero: false }} }} }}
            }});
        }}
        cargarDatos();
        </script>
    </body>
    </html>
    """

if __name__ == '__main__':
    app.run(host='0.0.0.0', port=7000, debug=True)
