from flask import Flask, request, jsonify
import sqlite3
from datetime import datetime
import os

app = Flask(__name__)
DB_PATH = "metrics.db"

# Creates the database table if it doesn't exist
def init_db():
    with sqlite3.connect(DB_PATH) as conn:
        conn.execute("""
            CREATE TABLE IF NOT EXISTS metrics (
                id INTEGER PRIMARY KEY AUTOINCREMENT,
                hostname TEXT,
                os TEXT,
                cpu_percent REAL,
                memory_percent REAL,
                disk_usage REAL,
                timestamp TEXT
            )
        """)
    print("Database initialized")

# route for sending metrics
@app.route('/collect', methods=['POST'])
def collect():
    data = request.get_json()

    if not data or "hostname" not in data:
        return jsonify({"error": "Invalid data"}), 400

    timestamp = datetime.now().isoformat()

    with sqlite3.connect(DB_PATH) as conn:
        conn.execute("""
            INSERT INTO metrics (hostname, os, cpu_percent, memory_percent, disk_usage, timestamp)
            VALUES (?, ?, ?, ?, ?, ?)
        """, (
            data.get("hostname"),
            data.get("os"),
            data.get("cpu_percent"),
            data.get("memory_percent"),
            data.get("disk_usage"),
            timestamp
        ))
        conn.commit()

    print(f"[{timestamp}] Data received from {data.get('hostname')}")
    return jsonify({"status": "stored"}), 200

# for posting metrics which you can view in the browser 
@app.route('/metrics', methods=['GET'])
def list_metrics():
    with sqlite3.connect(DB_PATH) as conn:
        cursor = conn.execute("""
            SELECT hostname, os, cpu_percent, memory_percent, disk_usage, timestamp
            FROM metrics
            ORDER BY id DESC
            LIMIT 10
        """)
        rows = cursor.fetchall()

    results = [
        {
            "hostname": row[0],
            "os": row[1],
            "cpu_percent": row[2],
            "memory_percent": row[3],
            "disk_usage": row[4],
            "timestamp": row[5],
        }
        for row in rows
    ]
    return jsonify(results)

if __name__ == '__main__':
    if not os.path.exists(DB_PATH):
        init_db()
    app.run(host='0.0.0.0', port=5000)
