import { beforeEach, describe, expect, it } from "bun:test";
import { createCategory } from "../../src/server/services/category.service.ts";
import { createItem } from "../../src/server/services/item.service.ts";
import {
	getCategoryTotals,
	getGlobalTotals,
} from "../../src/server/services/totals.service.ts";
import { createTestDb } from "../helpers/db.ts";

describe("Totals Service", () => {
	let db: any;
	let userId: number;

	beforeEach(async () => {
		({ db, userId } = await createTestDb());
	});

	describe("getCategoryTotals", () => {
		it("returns weight sum, cost sum, item count per category", async () => {
			const shelter = await createCategory(db, userId, {
				name: "Shelter",
				icon: "tent",
			});
			await createItem(db, userId, {
				name: "Tent",
				weightGrams: 1200,
				priceCents: 35000,
				categoryId: shelter?.id,
			});
			await createItem(db, userId, {
				name: "Tarp",
				weightGrams: 300,
				priceCents: 8000,
				categoryId: shelter?.id,
			});

			const totals = await getCategoryTotals(db, userId);
			expect(totals).toHaveLength(1); // Only Shelter has items
			expect(totals[0].categoryName).toBe("Shelter");
			expect(totals[0].totalWeight).toBe(1500);
			expect(totals[0].totalCost).toBe(43000);
			expect(totals[0].itemCount).toBe(2);
		});

		it("excludes empty categories (no items)", async () => {
			await createCategory(db, userId, { name: "Shelter", icon: "tent" });
			// No items added
			const totals = await getCategoryTotals(db, userId);
			expect(totals).toHaveLength(0);
		});
	});

	describe("getGlobalTotals", () => {
		it("returns overall weight, cost, count", async () => {
			await createItem(db, userId, {
				name: "Tent",
				weightGrams: 1200,
				priceCents: 35000,
				categoryId: 1,
			});
			await createItem(db, userId, {
				name: "Spork",
				weightGrams: 20,
				priceCents: 500,
				categoryId: 1,
			});

			const totals = await getGlobalTotals(db, userId);
			expect(totals).toBeDefined();
			expect(totals?.totalWeight).toBe(1220);
			expect(totals?.totalCost).toBe(35500);
			expect(totals?.itemCount).toBe(2);
		});

		it("returns zeros when no items exist", async () => {
			const totals = await getGlobalTotals(db, userId);
			expect(totals).toBeDefined();
			expect(totals?.totalWeight).toBe(0);
			expect(totals?.totalCost).toBe(0);
			expect(totals?.itemCount).toBe(0);
		});
	});
});
