let UserError = require('vn-loopback/util/user-error');

module.exports = Self => {
    require('../methods/item/filter')(Self);
    require('../methods/item/clone')(Self);
    require('../methods/item/updateTaxes')(Self);
    require('../methods/item/getBalance')(Self);
    require('../methods/item/lastEntriesFilter')(Self);
    require('../methods/item/getSummary')(Self);
    require('../methods/item/getCard')(Self);
    require('../methods/item/regularize')(Self);
    require('../methods/item/getVisibleAvailable')(Self);
    require('../methods/item/new')(Self);
    require('../methods/item/getWasteByWorker')(Self);
    require('../methods/item/getWasteByItem')(Self);
    require('../methods/item/createIntrastat')(Self);
    require('../methods/item/buyerWasteEmail')(Self);
    require('../methods/item/labelPdf')(Self);
    require('../methods/item/setVisibleDiscard')(Self);
    require('../methods/item/get')(Self);

    Self.validatesPresenceOf('originFk', {message: 'Cannot be blank'});

    Self.observe('before save', async function(ctx) {
        await Self.availableId(ctx);
    });

    Self.availableId = async function(ctx) {
        if (ctx.isNewInstance) {
            try {
                let query = `SELECT i1.id + 1 as id FROM vn.item i1
                LEFT JOIN vn.item i2 ON i1.id + 1 = i2.id
                WHERE i2.id IS NULL ORDER BY i1.id LIMIT 1`;

                let newId = await Self.rawSql(query);

                ctx.instance.id = newId[0].id;
                return ctx.instance.id;
            } catch (e) {
                throw new UserError(e);
            }
        }
    };
};