import sparqljs from 'sparqljs';
import DefinitionPattern from './DefinitionPattern';


let prefixes: {[key: string] : string} = {}

export function generateBody(definition: DefinitionPattern) {
    prefixes = {};
    // let out_query = JSON.parse(JSON.stringify(definition.query)) ;
    let out_query = _generateBody(definition);

    let generator = new sparqljs.Generator(prefixes);
    console.log(out_query)
    return generator.stringify(out_query)
    // Object.keys(definition.subQuery).forEach((refAttribute) => {
    //     let subDefinition = definition.subQuery[refAttribute];
    //     _generateBody(subDefinition);
    // })
}

function _generateBody(definition: DefinitionPattern) {
    let coreQuery = definition.query;
    prefixes = {...prefixes, ...definition.query.prefixes}
    definition.query.prefixes = {}
    Object.keys(definition.subQuery).forEach((refAttribute) => {
        let subDefinition = definition.subQuery[refAttribute];
        let subQuery = subDefinition.query;
        let parser = new sparqljs.Parser();
        let _res = parser.parse(`
        SELECT (?${subDefinition.primaryKey} AS ?${refAttribute}_pKey) WHERE {
            ?uri a ?thing
        }`);
        // // console.log((<unknown & {variables: any[]}>_res).variables[0]);
        // // (<sparqljs.SelectQuery>_res).variables[0];
        // // <unknown>(subQuery.variables).push((<unknown>{
        // //     expression: '?uri',
        // //     variable: '?NALTnode'
        // // }));
        <unknown>(subQuery.variables).push((<unknown & {variables: any[]}>_res).variables[0]);
        (<sparqljs.VariableExpression>subQuery.variables[0]).variable = <sparqljs.Term>('?' + refAttribute);
        _generateBody(subDefinition);
        let addGroup = {
            type: 'group',
            patterns:
                [
                    subQuery
                ]
        };
(<sparqljs.Pattern[]>coreQuery.where).push(<sparqljs.Pattern>addGroup);
        // (<sparqljs.Pattern[]>coreQuery.where).push(<sparqljs.Pattern>subQuery)
    })
    return <sparqljs.SelectQuery>coreQuery;
}

export default generateBody;