import qbs
import qbs.FileInfo
import qbs.TextFile

import "pkgconfig.js" as HelperFunctions

Module {
    property string fileName: product.targetName + ".pc"
    property bool autoDetect: true
    property var transformFunction // function(product, moduleName, propertyName, valueElement)
    property stringList excludedDependencies

    property string nameEntry: product.name
    property string descriptionEntry: product.name
    property string versionEntry: product.version
    property string urlEntry
    property stringList cflagsEntry: []
    property stringList libsEntry: []
    property stringList libsPrivateEntry: []
    property stringList requiresEntry: []
    property stringList requiresPrivateEntry: []
    property stringList conflictsEntry: []

    property var customVariables

    property bool _usePrefix: autoDetect && qbs.installPrefix

    additionalProductTypes: ["Exporter.pkgconfig.pc"]

    Rule {
        multiplex: true
        requiresInputs: false

        // Make sure all relevant library artifacts have been created by the time we run.
        auxiliaryInputs: {
            if (!autoDetect)
                return undefined;
            if (product.type.contains("staticlibrary"))
                return ["staticlibrary"];
            if (product.type.contains("dynamiclibrary"))
                return ["dynamiclibrary"];
        }

        Artifact {
            filePath: product.Exporter.pkgconfig.fileName
            fileTags: ["Exporter.pkgconfig.pc"]
        }
        prepare: {
            var cmd = new JavaScriptCommand();
            cmd.description = "Creating " + output.fileName;
            cmd.sourceCode = function() {
                var f = new TextFile(output.filePath, TextFile.WriteOnly);
                if (product.Exporter.pkgconfig._usePrefix)
                    f.writeLine("prefix=" + product.qbs.installPrefix + "\n");
                var customVariables = product.Exporter.pkgconfig.customVariables;
                if (customVariables) {
                    for (var customVar in customVariables)
                        f.writeLine(customVar + "=" + customVariables[customVar]);
                    f.writeLine("");
                }
                var autoDetectedData = HelperFunctions.collectAutodetectedData(product);
                HelperFunctions.writeEntry(product, f, "Name", "nameEntry", true);
                HelperFunctions.writeEntry(product, f, "Description", "descriptionEntry", true);
                HelperFunctions.writeEntry(product, f, "Version", "versionEntry", true);
                HelperFunctions.writeEntry(product, f, "URL", "urlEntry");
                HelperFunctions.writeEntry(product, f, "Cflags", "cflagsEntry", false,
                                           autoDetectedData.cflags);
                HelperFunctions.writeEntry(product, f, "Libs", "libsEntry", false,
                                           autoDetectedData.libs);
                HelperFunctions.writeEntry(product, f, "Libs.private", "libsPrivateEntry");
                HelperFunctions.writeEntry(product, f, "Requires", "requiresEntry", false,
                                           autoDetectedData.requires);
                HelperFunctions.writeEntry(product, f, "Requires.private", "requiresPrivateEntry",
                                           false, autoDetectedData.requiresPrivate);
                HelperFunctions.writeEntry(product, f, "Conflicts", "conflictsEntry");
            };
            return [cmd];
        }
    }

    validate: {
        if (requiresEntry && excludedDependencies
                && requiresEntry.containsAny(excludedDependencies)) {
            throw "The contents of Export.pkgconfig.requiresEntry and "
                    + "Export.pkgconfig.excludedDependencies must not overlap.";
        }
    }
}
