import { QueryOptions, SyncOptions } from "sequelize";
import sequelizeConfig from "../config/sequelize.config";
import Source from "../models/source.model";
import Channel from "../models/channel.model";
import Category from "../models/category.model";
import Authority from "../models/authority.model";

interface ConnectionOptions extends QueryOptions {
    sync: boolean;
}

export default class DatabaseService {
    static relationship() {
		Authority.sync();
        Source.belongsTo(Channel, { onDelete : "CASCADE", onUpdate : 'CASCADE' });
        Channel.belongsTo(Category,{
            foreignKey : 'category_id',
            onDelete: "SET NULL",
            onUpdate: 'CASCADE'
        })
        Channel.hasMany(Source, {
            foreignKey: 'channel_id',
            onDelete: "CASCADE",
            onUpdate: 'CASCADE'
        });
    }
    static async sync(options?: SyncOptions) {
        await sequelizeConfig.sync(options);
    }
    static async connect(options?: ConnectionOptions) {
        DatabaseService.relationship();
        if (options?.sync) await DatabaseService.sync();
        await sequelizeConfig.authenticate(options);
		console.log("\n\n\nDatabase Connected.\n\n\n");
    }
}