"""
Optimus Research Center - Real-Time System & Resource Monitor
Reads actual system telemetry via psutil and database task counts.
No fake or simulated readings.
"""

import time
import psutil
from datetime import datetime
from typing import Dict, Any
from app.config import settings
from app.core.database import SessionLocal
from app.core import models


START_TIME = time.time()


def get_system_telemetry() -> Dict[str, Any]:
    """Returns actual hardware and process telemetry."""
    cpu_percent = psutil.cpu_percent(interval=None)
    mem = psutil.virtual_memory()
    disk = psutil.disk_usage(str(settings.BASE_DIR))
    proc = psutil.Process()
    proc_mem_mb = proc.memory_info().rss / (1024 * 1024)

    uptime_seconds = int(time.time() - START_TIME)

    db = SessionLocal()
    try:
        active_tasks = db.query(models.CoordinationTask).filter(
            models.CoordinationTask.status == "RUNNING"
        ).count()
        pending_tasks = db.query(models.CoordinationTask).filter(
            models.CoordinationTask.status == "PENDING"
        ).count()
        failed_tasks = db.query(models.CoordinationTask).filter(
            models.CoordinationTask.status == "FAILED"
        ).count()
        completed_tasks = db.query(models.CoordinationTask).filter(
            models.CoordinationTask.status == "COMPLETED"
        ).count()

        total_projects = db.query(models.ResearchProject).count()
        total_experiments = db.query(models.Experiment).count()
        total_models = db.query(models.AIModelRecord).count()
        total_evidence = db.query(models.ScientificEvidence).count()
    finally:
        db.close()

    return {
        "status": "OPERATIONAL",
        "timestamp_utc": datetime.utcnow().isoformat(),
        "uptime_seconds": uptime_seconds,
        "cpu_usage_percent": round(cpu_percent, 1),
        "system_ram_total_mb": round(mem.total / (1024 * 1024), 1),
        "system_ram_used_mb": round(mem.used / (1024 * 1024), 1),
        "system_ram_percent": mem.percent,
        "app_process_memory_mb": round(proc_mem_mb, 1),
        "disk_free_gb": round(disk.free / (1024 * 1024 * 1024), 2),
        "disk_used_percent": disk.percent,
        "active_tasks": active_tasks,
        "pending_tasks": pending_tasks,
        "failed_tasks": failed_tasks,
        "completed_tasks": completed_tasks,
        "total_projects": total_projects,
        "total_experiments": total_experiments,
        "total_models": total_models,
        "total_evidence": total_evidence,
        "application_version": settings.VERSION,
        "packager_version": settings.PACKAGER_VERSION,
        "digital_optimus_integration": "DISCONNECTED (STANDALONE V1.1)"
    }
