import { eq } from "drizzle-orm";
import { getDb } from "../config/database.js";
import { classes, type Class, type NewClass } from "./classes.schema.js";
import { DatabaseError } from "../shared/errors/application-error.js";

export class ClassesRepository {
  async create(data: NewClass): Promise<Class> {
    const db = getDb();
    await db.insert(classes).values(data);
    const [result] = await db
      .select()
      .from(classes)
      .where(eq(classes.id, data.id));
    if (!result) {
      throw new DatabaseError("Failed to read created class");
    }
    return result;
  }

  async findById(id: string): Promise<Class | undefined> {
    const db = getDb();
    const [result] = await db.select().from(classes).where(eq(classes.id, id));
    return result;
  }

  async list(gradeId?: string): Promise<Class[]> {
    const db = getDb();
    if (gradeId) {
      return db.select().from(classes).where(eq(classes.gradeId, gradeId));
    }
    return db.select().from(classes);
  }

  async update(
    id: string,
    data: Partial<NewClass>,
  ): Promise<Class | undefined> {
    const db = getDb();
    await db.update(classes).set(data).where(eq(classes.id, id));
    const [result] = await db.select().from(classes).where(eq(classes.id, id));
    return result;
  }

  async delete(id: string): Promise<void> {
    const db = getDb();
    await db.delete(classes).where(eq(classes.id, id));
  }
}
