const app = require('vn-loopback/server/server');
const ParameterizedSQL = require('loopback-connector').ParameterizedSQL;

describe('buyUltimateFromInterval()', () => {
    let today;
    let future;
    beforeAll(() => {
        let date = new Date();
        let month = `${date.getMonth() + 1}`;
        let futureMonth = `${date.getMonth() + 2}`;
        let day = date.getDate();
        let year = date.getFullYear();
        let futureYear = year;

        if (month.toString().length < 2) month = '0' + month;
        if (futureMonth.toString().length < 2) futureMonth = '0' + futureMonth;
        if (futureMonth.toString() == '13') {
            futureMonth = '01';
            futureYear + 1;
        }


        if (day.toString().length < 2) day = `0${day}`;

        today = [year, month, day].join('-');
        future = [futureYear, futureMonth, day].join('-');
    });

    it(`should create a temporal table with it's data`, async() => {
        let stmts = [];
        let stmt;

        stmts.push('START TRANSACTION');

        let params = {
            warehouseFk: 1,
            started: today,
            ended: today
        };

        stmt = new ParameterizedSQL('CALL vn.buyUltimateFromInterval(?, ?, ?)', [
            params.warehouseFk,
            params.started,
            params.ended
        ]);
        stmts.push(stmt);

        let buyUltimateFromIntervalTableIndex = stmts.push(`SELECT * FROM tmp.buyUltimateFromInterval`) - 1;

        stmts.push('ROLLBACK');

        let sql = ParameterizedSQL.join(stmts, ';');
        let result = await app.models.Ticket.rawStmt(sql);

        let buyUltimateFromIntervalTable = result[buyUltimateFromIntervalTableIndex];

        expect(buyUltimateFromIntervalTable.length).toEqual(2);

        expect(buyUltimateFromIntervalTable[0].itemFk).toEqual(1);
        expect(buyUltimateFromIntervalTable[1].itemFk).toEqual(3);

        expect(buyUltimateFromIntervalTable[0].warehouseFk).toEqual(1);
        expect(buyUltimateFromIntervalTable[1].warehouseFk).toEqual(1);

        expect(buyUltimateFromIntervalTable[0].buyFk).toEqual(3);
        expect(buyUltimateFromIntervalTable[1].buyFk).toEqual(5);

        expect(buyUltimateFromIntervalTable[0].landed).toEqual(new Date(today));
        expect(buyUltimateFromIntervalTable[1].landed).toEqual(new Date(today));
    });

    it(`should create a temporal table with it's data in which started value is assigned to ended`, async() => {
        let params = {
            warehouseFk: 1,
            started: today,
            ended: null
        };

        let query = `
        START TRANSACTION;
        CALL vn.buyUltimateFromInterval(?, ?, ?);
        SELECT * FROM tmp.buyUltimateFromInterval;
        ROLLBACK;`;

        let result = await app.models.Ticket.rawSql(query, [
            params.warehouseFk,
            params.started,
            params.ended
        ]);

        let buyUltimateFromIntervalTable = result[2];

        expect(buyUltimateFromIntervalTable.length).toEqual(2);

        expect(buyUltimateFromIntervalTable[0].itemFk).toEqual(1);
        expect(buyUltimateFromIntervalTable[1].itemFk).toEqual(3);

        expect(buyUltimateFromIntervalTable[0].warehouseFk).toEqual(1);
        expect(buyUltimateFromIntervalTable[1].warehouseFk).toEqual(1);

        expect(buyUltimateFromIntervalTable[0].buyFk).toEqual(3);
        expect(buyUltimateFromIntervalTable[1].buyFk).toEqual(5);

        expect(buyUltimateFromIntervalTable[0].landed).toEqual(new Date(today));
        expect(buyUltimateFromIntervalTable[1].landed).toEqual(new Date(today));
    });

    it(`should create a temporal table with it's data in which ended value is a date in the future`, async() => {
        let params = {
            warehouseFk: 1,
            started: today,
            ended: future
        };

        let query = `
        START TRANSACTION;
        CALL vn.buyUltimateFromInterval(?, ?, ?);
        SELECT * FROM tmp.buyUltimateFromInterval;
        ROLLBACK;`;

        let result = await app.models.Ticket.rawSql(query, [
            params.warehouseFk,
            params.started,
            params.ended
        ]);

        let buyUltimateFromIntervalTable = result[2];

        expect(buyUltimateFromIntervalTable.length).toEqual(2);

        expect(buyUltimateFromIntervalTable[0].itemFk).toEqual(1);
        expect(buyUltimateFromIntervalTable[1].itemFk).toEqual(3);

        expect(buyUltimateFromIntervalTable[0].warehouseFk).toEqual(1);
        expect(buyUltimateFromIntervalTable[1].warehouseFk).toEqual(1);

        expect(buyUltimateFromIntervalTable[0].buyFk).toEqual(3);
        expect(buyUltimateFromIntervalTable[1].buyFk).toEqual(5);

        expect(buyUltimateFromIntervalTable[0].landed).toEqual(new Date(today));
        expect(buyUltimateFromIntervalTable[1].landed).toEqual(new Date(today));
    });
});