import psutil
from fastapi import APIRouter, Depends
from sqlalchemy import func
from sqlalchemy.orm import Session

from app.api.deps import get_current_principal
from app.db.session import get_db
from app.models.dataset import Dataset, DatasetExample
from app.models.knowledge import KnowledgeSource
from app.models.org import Project, User
from app.schemas.dashboard import DashboardSummary, ProjectSummary, SystemStatus
from app.services.ollama_client import is_reachable as ollama_is_reachable

router = APIRouter(prefix="/dashboard", tags=["dashboard"])


@router.get("", response_model=DashboardSummary)
def get_dashboard(db: Session = Depends(get_db), current_user: User = Depends(get_current_principal)):
    projects = db.query(Project).filter(Project.org_id == current_user.org_id).all()
    project_ids = [p.id for p in projects]

    source_counts = dict(
        db.query(KnowledgeSource.status, func.count(KnowledgeSource.id))
        .filter(KnowledgeSource.project_id.in_(project_ids))
        .group_by(KnowledgeSource.status)
        .all()
    )
    example_counts = dict(
        db.query(DatasetExample.status, func.count(DatasetExample.id))
        .join(Dataset, Dataset.id == DatasetExample.dataset_id)
        .filter(Dataset.project_id.in_(project_ids))
        .group_by(DatasetExample.status)
        .all()
    )

    recent_projects = []
    for project in sorted(projects, key=lambda p: p.created_at, reverse=True)[:5]:
        ks_count = db.query(func.count(KnowledgeSource.id)).filter(KnowledgeSource.project_id == project.id).scalar()
        ex_count = (
            db.query(func.count(DatasetExample.id))
            .join(Dataset, Dataset.id == DatasetExample.dataset_id)
            .filter(Dataset.project_id == project.id)
            .scalar()
        )
        recent_projects.append(
            ProjectSummary(id=project.id, name=project.name, knowledge_source_count=ks_count, dataset_example_count=ex_count)
        )

    database_reachable = True
    try:
        db.execute(func.now())
    except Exception:  # noqa: BLE001
        database_reachable = False

    system = SystemStatus(
        ollama_reachable=ollama_is_reachable(),
        database_reachable=database_reachable,
        cpu_percent=psutil.cpu_percent(interval=0.1),
        memory_percent=psutil.virtual_memory().percent,
        disk_percent=psutil.disk_usage("/").percent,
    )

    return DashboardSummary(
        knowledge_sources_by_status={k.value: v for k, v in source_counts.items()},
        dataset_examples_by_status={k.value: v for k, v in example_counts.items()},
        recent_projects=recent_projects,
        system=system,
    )
