/**
 * Usage: node src/tools/generate_document.js 1000
 * will create 1000 new notes and some clones into a current document.db
 */

require('../entities/entity_constructor');
const sqlInit = require('../services/sql_init');
const noteService = require('../services/notes');
const attributeService = require('../services/attributes');
const cls = require('../services/cls');
const cloningService = require('../services/cloning');
const noteRevisionService = require('../services/note_revisions');
const loremIpsum = require('lorem-ipsum').loremIpsum;

const noteCount = parseInt(process.argv[2]);

if (!noteCount) {
    console.error(`Please enter number of notes as program parameter.`);
    process.exit(1);
}

const notes = ['root'];

function getRandomNoteId() {
    const index = Math.floor(Math.random() * notes.length);

    return notes[index];
}

async function start() {
    for (let i = 0; i < noteCount; i++) {
        const title = loremIpsum({
            count: 1,
            units: 'sentences',
            sentenceLowerBound: 1,
            sentenceUpperBound: 10
        });

        const paragraphCount = Math.floor(Math.random() * Math.random() * 100);
        const content = loremIpsum({
            count: paragraphCount,
            units: 'paragraphs',
            sentenceLowerBound: 1,
            sentenceUpperBound: 15,
            paragraphLowerBound: 3,
            paragraphUpperBound: 10,
            format: 'html'
        });

        const {note} = await noteService.createNewNote({
            parentNoteId: getRandomNoteId(),
            title,
            content,
            type: 'text'
        });

        console.log(`Created note ${i}: ${title}`);

        if (Math.random() < 0.04) {
            const noteIdToClone = note.noteId;
            const parentNoteId = getRandomNoteId();
            const prefix = Math.random() > 0.8 ? "prefix" : null;

            const result = await cloningService.cloneNoteToBranch(noteIdToClone, parentNoteId, prefix);

            console.log(`Cloning ${i}:`, result.success ? "succeeded" : "FAILED");
        }

        // does not have to be for the current note
        await attributeService.createAttribute({
            noteId: getRandomNoteId(),
            type: 'label',
            name: 'label',
            value: 'value',
            isInheritable: Math.random() > 0.1 // 10% are inheritable
        });

        await attributeService.createAttribute({
            noteId: getRandomNoteId(),
            type: 'relation',
            name: 'relation',
            value: getRandomNoteId(),
            isInheritable: Math.random() > 0.1 // 10% are inheritable
        });

        noteRevisionService.createNoteRevision(await becca.getNote(getRandomNoteId()));

        notes.push(note.noteId);
    }

    process.exit(0);
}

sqlInit.dbReady.then(cls.wrap(start));
