"use strict";

const Expression = require('./expression');
const NoteSet = require('../note_set');

/**
 * Search string is lower cased for case insensitive comparison. But when retrieving properties
 * we need case sensitive form so we have this translation object.
 */
const PROP_MAPPING = {
    "noteid": "noteId",
    "title": "title",
    "type": "type",
    "mime": "mime",
    "isprotected": "isProtected",
    "isarchived": "isArchived",
    "datecreated": "dateCreated",
    "datemodified": "dateModified",
    "utcdatecreated": "utcDateCreated",
    "utcdatemodified": "utcDateModified",
    "parentcount": "parentCount",
    "childrencount": "childrenCount",
    "attributecount": "attributeCount",
    "labelcount": "labelCount",
    "relationcount": "relationCount"
};

class PropertyComparisonExp extends Expression {
    static isProperty(name) {
        return name in PROP_MAPPING;
    }

    constructor(propertyName, comparator) {
        super();

        this.propertyName = PROP_MAPPING[propertyName];
        this.comparator = comparator;
    }

    execute(inputNoteSet, searchContext) {
        const resNoteSet = new NoteSet();

        for (const note of inputNoteSet.notes) {
            let value = note[this.propertyName];

            if (value !== undefined && value !== null && typeof value !== 'string') {
                value = value.toString();
            }

            if (value) {
                value = value.toLowerCase();
            }

            if (this.comparator(value)) {
                resNoteSet.add(note);
            }
        }

        return resNoteSet;
    }
}

module.exports = PropertyComparisonExp;
