import os
import base64
import uuid
from flask import Flask, request, jsonify
from pymongo import MongoClient

# Import your shared device types
from shared import deviceTypes

app = Flask(__name__)

# ---------------------------------------------------------
# Configuration & Setup
# ---------------------------------------------------------

# Configure MongoDB connection (adjust the URI as needed for your environment)
MONGO_URI = os.getenv("MONGO_URI", "mongodb://localhost:27017/")
client = MongoClient(MONGO_URI)
db = client["microwave_network_db"]
cooking_collection = db["cooking_parameters"]
device_network_collection = db["device_network"]

# Ensure the photo storage directory exists when the app starts
PHOTO_DIR = "storage/dishPhotos"
os.makedirs(PHOTO_DIR, exist_ok=True)

# ---------------------------------------------------------
# Routes
# ---------------------------------------------------------

@app.route("/")
def hello_world():
    return "<p>Hello, World!</p>"


@app.route("/cooking-params", methods=["POST"])
def cooking_params():
    data = request.get_json()
    
    if not data:
        return jsonify({"error": "Invalid or missing JSON payload"}), 400

    # 1. Handle the Photo
    photo_b64 = data.get("photo")
    if photo_b64:
        # Generate a unique filename using UUID to avoid overwriting
        filename = f"dish_{uuid.uuid4().hex}.jpg"
        filepath = os.path.join(PHOTO_DIR, filename)
        
        try:
            # Decode the base64 string and save it as a binary file
            with open(filepath, "wb") as f:
                f.write(base64.b64decode(photo_b64))
            
            # Replace the giant base64 string in the dictionary with the local file path 
            # so we don't bloat the MongoDB document
            data["photo"] = filepath
            
        except Exception as e:
            return jsonify({"error": f"Failed to save photo: {str(e)}"}), 500

    # 2. Save to MongoDB
    try:
        # Insert the dictionary directly into Mongo (it will retain your exact JSON keys)
        cooking_collection.insert_one(data)
        
        # Remove the Mongo-injected '_id' object before returning the response
        data.pop("_id", None)
        return jsonify({"message": "Cooking parameters saved successfully", "data": data}), 201
        
    except Exception as e:
        return jsonify({"error": f"Database error: {str(e)}"}), 500


@app.route("/device-network", methods=["POST"])
def device_network():
    data = request.get_json()
    
    if not data:
        return jsonify({"error": "Invalid or missing JSON payload"}), 400


    # 2. Save to MongoDB
    try:
        # Insert the dictionary directly into Mongo (it will retain your exact JSON keys)
        device_network_collection.insert_one(data)
        
        return "", 200
        
    except Exception as e:
        return jsonify({"error": f"Database error: {str(e)}"}), 500


if __name__ == "__main__":
    app.run(debug=True)