import { Prisma }         from '@prisma/client';
import { Exercise, User } from '../types/DatabaseTypes.js';
import db                 from '../helpers/DatabaseHelper.js';


class ExerciseManager {
    async get(idOrUrl: string, include: Prisma.ExerciseInclude | undefined = undefined): Promise<Exercise | undefined> {
        const id = idOrUrl.replace('.git', '').split('_').pop()!;

        return await db.exercise.findUnique({
                                                where  : {
                                                    id: id
                                                },
                                                include: include
                                            }) as unknown as Exercise ?? undefined;
    }

    getFromAssignment(assignmentName: string, include: Prisma.ExerciseInclude | undefined = undefined): Promise<Array<Exercise>> {
        return db.exercise.findMany({
                                        where  : {
                                            assignmentName: assignmentName
                                        },
                                        include: include
                                    }) as Promise<Array<Exercise>>;
    }

    async isUserAllowedToAccessExercise(exercise: Exercise, user: User): Promise<boolean> {
        if ( !exercise.members ) {
            exercise.members = await db.exercise.findUnique({
                                                                where: {
                                                                    id: exercise.id
                                                                }
                                                            }).members() ?? [];
        }

        const assignmentStaff = (await db.assignment.findUnique({
                                                                    where: {
                                                                        name: exercise.assignmentName
                                                                    }
                                                                }).staff()) ?? [];

        return exercise.members.findIndex(member => member.id === user.id) !== -1 || assignmentStaff.findIndex(staff => staff.id === user.id) !== -1;
    }
}


export default new ExerciseManager();