package nl.vpro.magnolia.importer.scripts.geschiedenis


/**
 * Script to help me split large xml file into multiple separate
 * Date: Dec 13, 2010 Time: 11:44:38 AM
 * @author Ernst Bunders
 */

File input = new File('/home/ernst/tmp/website.geschiedenis.xml')
//File input = new File('/home/ernst/tmp/config.modules.site-geschiedenis.templates.xml')
outputDir = new File('/home/ernst/tmp/output')
baseName = 'website.geschiedenis'

File baseOutput = new File(outputDir, 'website.geschiedenis.xml')

writerStack = new ArrayList<PrintWriter>()
writerStack.push(baseOutput.newPrintWriter())


def current = null
currentIndent = 0


splits = [
        '^[ ]*<sv:node sv:name="nieuws".*$':'nieuws',
        '^[ ]*<sv:node sv:name="andere-tijden".*$':'andere-tijden',
        '^[ ]*<sv:node sv:name="ovt".*$':'ovt',
        '^[ ]*<sv:node sv:name="dossiers".*$':'dossiers',
]

//splits = [
//        '^\\s+<sv:node sv:name="gsHome".*$':'gsHome',
//        '^\\s+<sv:node sv:name="gsEpisode".*$':'gsEpisode'
//]

input.eachLine {String line->
    if(current){
        //we are inside a split
        if(lineEndsSplit(line)){
            println "Line ends split: ${current} :: [${line}] indent: ${currentIndent}"
            writerStack.last().write("${line}\n")/*write the line first then pop back to parent writer*/
            writerStack.last().flush()
            writerStack.pop()
            current = null
        }else{
            writerStack.last().write("${line}\n")
        }
    }else{
        //we are inside the root
        current = lineStartsSplit(line)
        if(current){
            println "Line starts split: ${current} :: [${line}] indent: ${currentIndent}"
            writerStack.push(createWriter(current))
            writerStack.last().write("${injectNsDeclarations(line)}\n")
        }else{
            writerStack.last().write("${line}\n")
        }
    }
}

writerStack.last().flush()

String injectNsDeclarations(String line){
    String nsDeclarations = ' xmlns:sv="http://www.jcp.org/jcr/sv/1.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"'
    return line.replaceFirst('>$', "${nsDeclarations}>")
}

PrintWriter createWriter(def entry) {
    File f = new File("${outputDir}/${baseName}.${entry.value}.xml")
    println "create file ${f.getAbsolutePath()}"
    def writer =  f.newPrintWriter()
    writer.write('<?xml version="1.0" encoding="UTF-8" ?>')
    return writer
}

Object lineStartsSplit(String line) {
    def entry = splits.entrySet().find{ entry->
        String pattern = entry.key
        if(line.matches(pattern)){
            currentIndent = getIndent(line)
            return true
        }
    }

    return entry
}

int  getIndent(String line) {
    return line.find("^ *").size()
}

boolean lineEndsSplit(String line) {
    return getIndent(line) == currentIndent
}
