import { checkAccess } from '../utils/userUtils.js';
import DiaryDate from '../models/DiaryDates.js';
import HttpError from '../exceptions/HttpError.js';
import Group from '../models/Group.js';

import { devLog } from '../utils/logger.js';
class GroupService {

    async checkDiaryDateToClub(clubId, dateId) {
        const diaryDate = await DiaryDate.findOne({
            where: {
                id: dateId,
                clubId: clubId
            }
        });
        if (!diaryDate) {
            throw new HttpError('Datum nicht gefunden oder passt nicht zum Verein', 404);
        }
    }

    async addGroup(userToken, clubId, dateId, name, lead) {
        await checkAccess(userToken, clubId);
        await this.checkDiaryDateToClub(clubId, dateId);
        const group = await Group.create({
            diaryDateId: dateId,
            name,
            lead
        });
        return group;
    }
 
    async getGroups(userToken, clubId, dateId) {
        await checkAccess(userToken, clubId);
        await this.checkDiaryDateToClub(clubId, dateId);
        const groups = await Group.findAll({
            where: {
                diaryDateId: dateId
            }
        });
        return groups;
    }

    async changeGroup(userToken, groupId, clubId, dateId, name, lead) {
        devLog("changeGroup: ", groupId, clubId, dateId, name, lead);
        await checkAccess(userToken, clubId);
        await this.checkDiaryDateToClub(clubId, dateId);
        const group = await Group.findOne({
            where: {
                id: groupId,
                diaryDateId: dateId
            }
        });
        if (!group) {
            throw new HttpError('Gruppe nicht gefunden oder passt nicht zum angegebenen Datum und Verein', 404);
        }
        group.name = name;
        group.lead = lead;
        await group.save();
        return group;
    }

    async deleteGroup(userToken, groupId, clubId, dateId) {
        await checkAccess(userToken, clubId);
        await this.checkDiaryDateToClub(clubId, dateId);
        const group = await Group.findOne({
            where: {
                id: groupId,
                diaryDateId: dateId
            }
        });
        if (!group) {
            throw new HttpError('Gruppe nicht gefunden oder passt nicht zum angegebenen Datum und Verein', 404);
        }
        await group.destroy();
        return { success: true };
    }
}

export default new GroupService();