import { describe, it, expect } from 'vitest';
import demoData from '$lib/data/demo-data.json';

describe('demo-data.json', () => {
	describe('serenityScore', () => {
		it('should have a value between 0 and 100', () => {
			expect(demoData.serenityScore.value).toBeGreaterThanOrEqual(0);
			expect(demoData.serenityScore.value).toBeLessThanOrEqual(100);
		});

		it('should have a valid emoji', () => {
			expect(['💚', '🟡', '🔴']).toContain(demoData.serenityScore.emoji);
		});

		it('should have a valid trend', () => {
			expect(['stable', 'up', 'down']).toContain(demoData.serenityScore.trend);
		});

		it('should have components with scores and labels', () => {
			const { components } = demoData.serenityScore;

			expect(components).toHaveProperty('notes');
			expect(components).toHaveProperty('absences');
			expect(components).toHaveProperty('devoirs');

			for (const [, component] of Object.entries(components)) {
				expect(component).toHaveProperty('score');
				expect(component).toHaveProperty('label');
				expect(typeof component.score).toBe('number');
				expect(typeof component.label).toBe('string');
				expect(component.score).toBeGreaterThanOrEqual(0);
				expect(component.score).toBeLessThanOrEqual(100);
			}
		});
	});

	describe('schedule', () => {
		it('should have today array with schedule items', () => {
			expect(Array.isArray(demoData.schedule.today)).toBe(true);
			expect(demoData.schedule.today.length).toBeGreaterThan(0);
		});

		it('should have valid schedule items with time, subject, and room', () => {
			for (const item of demoData.schedule.today) {
				expect(item).toHaveProperty('time');
				expect(item).toHaveProperty('subject');
				expect(item).toHaveProperty('room');
				expect(typeof item.time).toBe('string');
				expect(typeof item.subject).toBe('string');
				expect(typeof item.room).toBe('string');
			}
		});
	});

	describe('grades', () => {
		it('should have recent array with grade items', () => {
			expect(Array.isArray(demoData.grades.recent)).toBe(true);
		});

		it('should have valid grade items', () => {
			for (const item of demoData.grades.recent) {
				expect(item).toHaveProperty('subject');
				expect(item).toHaveProperty('value');
				expect(item).toHaveProperty('max');
				expect(item).toHaveProperty('date');
				expect(typeof item.value).toBe('number');
				expect(typeof item.max).toBe('number');
			}
		});
	});

	describe('homework', () => {
		it('should have upcoming array with homework items', () => {
			expect(Array.isArray(demoData.homework.upcoming)).toBe(true);
		});

		it('should have valid homework items', () => {
			for (const item of demoData.homework.upcoming) {
				expect(item).toHaveProperty('subject');
				expect(item).toHaveProperty('title');
				expect(item).toHaveProperty('dueDate');
				expect(item).toHaveProperty('status');
				expect(['pending', 'done', 'late']).toContain(item.status);
			}
		});
	});
});
