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

export function look_alike(reference: string, definition: DefinitionPattern, json_pointers: string, value: string) {
    let incremented_definition = copy(definition);

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

    return incremented_definition;
}

export default look_alike;