import { getPrisma } from '../infrastructure/database/PrismaSingleton';

export class HolidayRepository {
  private prisma = getPrisma();

  list() {
    return this.prisma.holidays.findMany({ orderBy: { date: 'asc' } });
  }

  listByYear(year: number) {
    const from = new Date(Date.UTC(year, 0, 1));
    const to = new Date(Date.UTC(year, 11, 31));
    return this.prisma.holidays.findMany({
      where: { date: { gte: from, lte: to } },
      orderBy: { date: 'asc' },
    });
  }

  listInRange(from: Date, to: Date) {
    return this.prisma.holidays.findMany({
      where: { date: { gte: from, lte: to } },
    });
  }

  findByDate(date: Date) {
    return this.prisma.holidays.findUnique({ where: { date } });
  }

  create(data: { date: Date; name: string; recurringYearly: boolean }) {
    return this.prisma.holidays.create({
      data: { date: data.date, name: data.name, recurring_yearly: data.recurringYearly },
    });
  }

  createMany(data: Array<{ date: Date; name: string; recurringYearly: boolean }>) {
    return this.prisma.holidays.createMany({
      data: data.map((d) => ({
        date: d.date,
        name: d.name,
        recurring_yearly: d.recurringYearly,
      })),
      skipDuplicates: true,
    });
  }

  update(id: number, data: { date?: Date; name?: string; recurringYearly?: boolean }) {
    return this.prisma.holidays.update({
      where: { id },
      data: {
        ...(data.date !== undefined ? { date: data.date } : {}),
        ...(data.name !== undefined ? { name: data.name } : {}),
        ...(data.recurringYearly !== undefined ? { recurring_yearly: data.recurringYearly } : {}),
      },
    });
  }

  delete(id: number) {
    return this.prisma.holidays.delete({ where: { id } });
  }
}
