import { ForeignKeyConstraintError } from 'sequelize';
import { Event } from '../event.model';
import { InvalidIdError, InvalidForeignIdError } from '../../controller/customErrors';
import { Category } from '../category.model';

export class EventsDAO {

    async getEvents() : Promise<Array<Event>> {
        const events = await Event.findAll({
            include: {model: Category, as: 'category'}
        });
        return events;
    }

    async getEvent(eventId : number) : Promise<Event> {
        const event : Event|null = await Event.findOne({
            where: {id: eventId},
            include: {model: Category, as: 'category'}
        });
        if (event != null) {
            return event;
        } else {
            throw new InvalidIdError('No event with given eventId.');
        }
    }

    async addEvent(event: Event) : Promise<Event> {
        //Going through values individually, instead of event.dataValues due to contraint conflicts (e.g. if event has non-unique id property).
        let savedEvent = new Event();
        try {
            savedEvent = await Event.create({
                title: event.title,
                description: event.description,
                emoji: event.emoji,
                startDate: event.startDate,
                endDate: event.endDate,
                categoryId: event.categoryId
            });
        } catch (error) {
            if (error instanceof ForeignKeyConstraintError) {
                throw new InvalidForeignIdError('categoryId is not a valid foreign id.');
            } else {
                console.log(error);
            }
        }
        return savedEvent;
    }

    async deleteEvent(eventId: number) {
        const deletedEvents = await Event.destroy({where: {id: eventId}});
        if (deletedEvents == 0) {
            throw new InvalidIdError('No event with given eventId.');
        }
    }

}