'use strict';

let CodeWriter = require('./CodeWriter');

function fixIndentation(lines) {
    let length = lines.length;
    let startLine = 0;
    let endLine = length;

    for (; startLine<length; startLine++) {
        let line = lines[startLine];
        if (line.trim() !== '') {
            break;
        }
    }

    for (; endLine>startLine; endLine--) {
        let line = lines[endLine-1];
        if (line.trim() !== '') {
            break;
        }
    }

    if (endLine === startLine) {
        return '';
    }

    if (startLine !== 0 || endLine !== length) {
        lines = lines.slice(startLine, endLine);
    }

    let firstLine = lines[0];
    let indentToRemove = /^\s*/.exec(firstLine)[0];

    if (indentToRemove) {
        for (let i=0; i<lines.length; i++) {
            let line = lines[i];
            if (line.startsWith(indentToRemove)) {
                lines[i] = line.substring(indentToRemove.length);
            }
        }
    }

    return lines.join('\n');
}

function normalizeTemplateSrc(src) {
    let lines = src.split(/\r\n|\n\r|\n/);
    if (lines.length) {
        if (lines[0].trim() === '') {
            return fixIndentation(lines);
        }
    }

    return src.trim();
}
class InlineCompiler {
    constructor(context, compiler) {
        this.context = context;
        this.compiler = compiler;
        this.builder = context.builder;

        context.setInline(true);
    }

    compile(src) {
        src = normalizeTemplateSrc(src);
        // console.log('TEMPLATE SRC:>\n' + src + '\n<');
        return this.compiler.compile(src, this.context);
    }

    get staticCode() {
        let staticNodes = this.context.getStaticNodes();

        if (!staticNodes || staticNodes.length === 0) {
            return null;
        }

        let codeWriter = new CodeWriter(this.context.options, this.builder);
        codeWriter.write(staticNodes);
        return codeWriter.getCode();
    }
}

module.exports = InlineCompiler;