import { copy } from './common';
import DefinitionPattern from './DefinitionPattern';
import sparqljs from 'sparqljs';
import attributeGetter from '../SparqlAttribute/getter';
import { prependBound } from './_bound';


export enum ARITHMETIC_SYMBOL {
    EQUAL = '=',
    GREATER = '>=',
    LOWER = '<=',
}

export function arithmetic_filter(arithmetic_symbol: ARITHMETIC_SYMBOL, reference: string, definition: DefinitionPattern, json_pointer: string, value: string | number) {
    let incremented_definition = copy(definition);

    let { attribute, nestedPath } = { ...attributeGetter(reference, json_pointer) };
    let pointerToDefinition = incremented_definition;
    nestedPath.forEach((path) => {
        pointerToDefinition = pointerToDefinition.subQuery[path];
    });
    let operation: sparqljs.OperationExpression = <sparqljs.OperationExpression>{
        type: 'operation',
        operator: arithmetic_symbol,
        args: ['?' + attribute.name, `"${value}"`]
    };
    let arithmetic: sparqljs.FilterPattern;;
    if (attribute.optional) {
        arithmetic = {
            type: 'filter',
            expression:
                prependBound(operation, attribute.name)
        };
    } else {
        arithmetic = {
            type: 'filter',
            expression:
                operation
        };
    }
    (<sparqljs.Pattern[]>pointerToDefinition.query.where).push(<sparqljs.Pattern>arithmetic);

    return incremented_definition;
}

export default arithmetic_filter;