import { and, eq, gte, sql } from "drizzle-orm";
import { agents, approvals, organizations, costEvents, issues } from "@rudderhq/db";
import { notFound } from "../errors.js";
import { budgetService } from "./budgets.js";
export function dashboardService(db) {
    const budgets = budgetService(db);
    return {
        summary: async (orgId) => {
            const organization = await db
                .select()
                .from(organizations)
                .where(eq(organizations.id, orgId))
                .then((rows) => rows[0] ?? null);
            if (!organization)
                throw notFound("Organization not found");
            const agentRows = await db
                .select({ status: agents.status, count: sql `count(*)` })
                .from(agents)
                .where(eq(agents.orgId, orgId))
                .groupBy(agents.status);
            const taskRows = await db
                .select({ status: issues.status, count: sql `count(*)` })
                .from(issues)
                .where(eq(issues.orgId, orgId))
                .groupBy(issues.status);
            const pendingApprovals = await db
                .select({ count: sql `count(*)` })
                .from(approvals)
                .where(and(eq(approvals.orgId, orgId), eq(approvals.status, "pending")))
                .then((rows) => Number(rows[0]?.count ?? 0));
            const agentCounts = {
                active: 0,
                running: 0,
                paused: 0,
                error: 0,
            };
            for (const row of agentRows) {
                const count = Number(row.count);
                // "idle" agents are operational — count them as active
                const bucket = row.status === "idle" ? "active" : row.status;
                agentCounts[bucket] = (agentCounts[bucket] ?? 0) + count;
            }
            const taskCounts = {
                open: 0,
                inProgress: 0,
                blocked: 0,
                done: 0,
            };
            for (const row of taskRows) {
                const count = Number(row.count);
                if (row.status === "in_progress")
                    taskCounts.inProgress += count;
                if (row.status === "blocked")
                    taskCounts.blocked += count;
                if (row.status === "done")
                    taskCounts.done += count;
                if (row.status !== "done" && row.status !== "cancelled")
                    taskCounts.open += count;
            }
            const now = new Date();
            const monthStart = new Date(now.getFullYear(), now.getMonth(), 1);
            const [{ monthSpend }] = await db
                .select({
                monthSpend: sql `coalesce(sum(${costEvents.costCents}), 0)::int`,
            })
                .from(costEvents)
                .where(and(eq(costEvents.orgId, orgId), gte(costEvents.occurredAt, monthStart)));
            const monthSpendCents = Number(monthSpend);
            const utilization = organization.budgetMonthlyCents > 0
                ? (monthSpendCents / organization.budgetMonthlyCents) * 100
                : 0;
            const budgetOverview = await budgets.overview(orgId);
            return {
                orgId,
                agents: {
                    active: agentCounts.active,
                    running: agentCounts.running,
                    paused: agentCounts.paused,
                    error: agentCounts.error,
                },
                tasks: taskCounts,
                costs: {
                    monthSpendCents,
                    monthBudgetCents: organization.budgetMonthlyCents,
                    monthUtilizationPercent: Number(utilization.toFixed(2)),
                },
                pendingApprovals,
                budgets: {
                    activeIncidents: budgetOverview.activeIncidents.length,
                    pendingApprovals: budgetOverview.pendingApprovalCount,
                    pausedAgents: budgetOverview.pausedAgentCount,
                    pausedProjects: budgetOverview.pausedProjectCount,
                },
            };
        },
    };
}
//# sourceMappingURL=dashboard.js.map