const Mongoose = require("mongoose");

class Mongy{
    constructor(){
        this.connected = false;

        this.Schemas = {};
        this.Models = {};
    }
    createModel(name,collection,structure){
        this.Schemas[name] = new Mongoose.Schema(structure);
        this.Models[name] = new Mongoose.model(name,this.Schemas[name],collection);
    }
    instantiate(name,data){
        return new this.Models[name](data);
    }
    saveModel(model){
        return new Promise((resolve, reject) => {
            model.save((err,res) => {
                if (err) reject(err);

                resolve(res);
            });
        });
    }
    async connect(url){
        Mongoose.connect(url,{
            useNewUrlParser: true
        });
        this.db = Mongoose.connection;

        await this.open();

        this.connected = true;
    }
    async open(){
        const {db} = this;
        return new Promise((resolve, reject) => {
            db.once('open', function() {
                resolve();
            });
        });
    }
    find(modelName,query){
        const model = this.Models[modelName];

        return new Promise((resolve,reject) => {
            model.find(query,(error,result) => {
                if (error) reject(error);
                resolve(result);
            });
        });
    }
    remove(modelName,query){
        const model = this.Models[modelName];
        return new Promise((resolve,reject) => {
            model.find(query).remove(() => {
                resolve(true);
            });
        });
    }
}

module.exports = Mongy;