import type { PrismaClient } from "@calcom/prisma";

export class PrismaOOORepository {
  constructor(private prismaClient: PrismaClient) {}

  async findManyOOO({
    startTimeDate,
    endTimeDate,
    allUserIds,
  }: {
    startTimeDate: Date;
    endTimeDate: Date;
    allUserIds: number[];
  }) {
    return this.prismaClient.outOfOfficeEntry.findMany({
      where: {
        userId: {
          in: allUserIds,
        },
        OR: [
          // outside of range
          // (start <= 'dateTo' AND end >= 'dateFrom')
          {
            start: {
              lte: endTimeDate,
            },
            end: {
              gte: startTimeDate,
            },
          },
          // start is between dateFrom and dateTo but end is outside of range
          // (start <= 'dateTo' AND end >= 'dateTo')
          {
            start: {
              lte: endTimeDate,
            },

            end: {
              gte: endTimeDate,
            },
          },
          // end is between dateFrom and dateTo but start is outside of range
          // (start <= 'dateFrom' OR end <= 'dateTo')
          {
            start: {
              lte: startTimeDate,
            },

            end: {
              lte: endTimeDate,
            },
          },
        ],
      },
      select: {
        id: true,
        start: true,
        end: true,
        user: {
          select: {
            id: true,
            name: true,
          },
        },
        toUser: {
          select: {
            id: true,
            username: true,
            name: true,
          },
        },
        reason: {
          select: {
            id: true,
            emoji: true,
            reason: true,
          },
        },
      },
    });
  }

  async findUserOOODays({userId, dateTo, dateFrom}: {userId: number, dateTo: string, dateFrom: string}) {
    return this.prismaClient.outOfOfficeEntry.findMany({
            where: {
              userId,
              OR: [
                // outside of range
                // (start <= 'dateTo' AND end >= 'dateFrom')
                {
                  start: {
                    lte: dateTo,
                  },
                  end: {
                    gte: dateFrom,
                  },
                },
                // start is between dateFrom and dateTo but end is outside of range
                // (start <= 'dateTo' AND end >= 'dateTo')
                {
                  start: {
                    lte: dateTo,
                  },
    
                  end: {
                    gte: dateTo,
                  },
                },
                // end is between dateFrom and dateTo but start is outside of range
                // (start <= 'dateFrom' OR end <= 'dateTo')
                {
                  start: {
                    lte: dateFrom,
                  },
    
                  end: {
                    lte: dateTo,
                  },
                },
              ],
            },
            select: {
              id: true,
              start: true,
              end: true,
              user: {
                select: {
                  id: true,
                  name: true,
                },
              },
              toUser: {
                select: {
                  id: true,
                  username: true,
                  name: true,
                },
              },
              reason: {
                select: {
                  id: true,
                  emoji: true,
                  reason: true,
                },
              },
            },
          });
  }
}
