from flask import Flask, request, jsonify
import logging
import mysql.connector

app = Flask(__name__)

# Configure logging
logging.basicConfig(level=logging.INFO, format="%(asctime)s - %(levelname)s - %(message)s")

# MySQL Configuration
DB_CONFIG = {
    'host': "localhost",
    'user': "techcod2_techcod2_juakalienterpr",
    'password': "techcod2_juakalienterpr@",
    'database': "techcod2_juakalienterprises"
}

def get_db():
    """Establish a database connection."""
    return mysql.connector.connect(**DB_CONFIG)

@app.route('/callback', methods=['POST'])
def mpesa_callback():
    """Handles M-Pesa Callback."""
    data = request.get_json()
    logging.info(f"M-Pesa Callback Received: {data}")

    try:
        # Check if the callback contains the necessary data
        stk_callback = data.get("Body", {}).get("stkCallback", {})
        result_code = stk_callback.get("ResultCode")

        if result_code == 0:
            # Extract metadata values safely
            merchant_request_id = stk_callback.get("MerchantRequestID", "")
            checkout_request_id = stk_callback.get("CheckoutRequestID", "")
            callback_metadata = stk_callback.get("CallbackMetadata", {}).get("Item", [])

            amount = next((item["Value"] for item in callback_metadata if item.get("Name") == "Amount"), None)
            mpesa_receipt_number = next((item["Value"] for item in callback_metadata if item.get("Name") == "MpesaReceiptNumber"), None)

            if not (amount and mpesa_receipt_number and checkout_request_id):
                logging.error("Missing required metadata fields.")
                return jsonify({"status": "error", "message": "Incomplete callback metadata."})

            # Store in database
            db = get_db()
            cursor = db.cursor()
            try:
                cursor.execute("""
                    UPDATE deposits 
                    SET status='Completed', mpesa_receipt=%s 
                    WHERE checkout_request_id=%s
                """, (mpesa_receipt_number, checkout_request_id))
                db.commit()
                logging.info(f"Payment successful for CheckoutRequestID: {checkout_request_id}")
                return jsonify({"status": "success", "message": "Payment successful."})
            except Exception as e:
                db.rollback()
                logging.error(f"Database error: {str(e)}")
                return jsonify({"status": "error", "message": f"Database error: {str(e)}"})
            finally:
                cursor.close()
                db.close()
        else:
            logging.warning(f"Payment failed with ResultCode: {result_code}")
            return jsonify({"status": "error", "message": "Payment failed."})

    except Exception as e:
        logging.error(f"Unexpected error: {str(e)}")
        return jsonify({"status": "error", "message": "An unexpected error occurred."})

if __name__ == '__main__':
    app.run(debug=True, port=5000)
