import SparqlObject from './SparqlObject';
import SparqlAttribute from '../SparqlAttribute/SparqlAttribute'
import {ConfigurationElementI, Type, ConfigurationAttribute} from '../Core/types'
import formatter from '../common/stringifier'
import {binding, isUri, escapeRegExp} from './common'
// import {parseRepresentation} from './_representation'
import sparqljs from 'sparqljs'

function bindingAsRegex(str: string) {
    return '(?<![a-zA-Z])\\?' + str + '(?=[^a-zA-Z_])'
}

// function postInit(this: SparqlObject) {
//     let parsedRepresentation = parseRepresentation.apply(this)
//     let triples = ((<sparqljs.Query>parsedRepresentation).where as Array<sparqljs.BgpPattern>)[0].triples;
//     triples.forEach((triple) => {
//         let tripleAsString = [triple.subject, triple.predicate, triple.object]
//             .map((str) => {
//                 if (isUri(<string>str)) {
//                     return '<' + str + '>';
//                 } else {
//                     return str;
//                 }
//             }).join(' ');
//         this.attributes.forEach((attribute) => {
//             if (tripleAsString.search(escapeRegExp(attribute.binding)) !== -1) {
//                 attribute.triples.push(tripleAsString);
//             }
//         });
//     })
// }




export function initialisation(this: SparqlObject, configuration: ConfigurationElementI) {
    this.reference = configuration.reference;
    // this.coreDefinition = configuration.definition;
    this.coreDefinition = computeDefinition(configuration);
    this.prefixes = configuration.prefixes || {};
    this.primaryKey = configuration.primaryKey;
    let out = 'SELECT * WHERE { ' + this.coreDefinition + ' }'
    let parser = new sparqljs.Parser(
        this.prefixes
        );
        this.parsedDefinition = ((<sparqljs.Query>parser.parse(out)).where as Array<sparqljs.Pattern>);
        console.log(this.parsedDefinition)
    configuration.attributes.forEach((configurationAttribute) => {
        let sparqlAttribute = new SparqlAttribute(this, configurationAttribute);
        this.attributes.push(sparqlAttribute)
    });

}


function computeDefinition(configuration: ConfigurationElementI) {
    // console.log('there')
    return configuration.attributes.filter((attribute) => (attribute.reference !== null && attribute.reference !== undefined))
    .reduce((accDefinition, referencedAttribute) => {
        console.log(referencedAttribute.reference)
        return formatter(accDefinition, {[referencedAttribute.name]: '?' + referencedAttribute.name + '_pKey'},
        {
            asRegExp: false,
            keyPrefix: '?',
            keySuffix: ''
        })
    }, configuration.definition)
}
export default initialisation