/*
 * Licensed to the Apache Software Foundation (ASF) under one
 * or more contributor license agreements.  See the NOTICE file
 * distributed with this work for additional information
 * regarding copyright ownership.  The ASF licenses this file
 * to you under the Apache License, Version 2.0 (the
 * "License"); you may not use this file except in compliance
 * with the License.  You may obtain a copy of the License at
 *
 *   http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing,
 * software distributed under the License is distributed on an
 * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
 * KIND, either express or implied.  See the License for the
 * specific language governing permissions and limitations
 * under the License.
 */
var childProcess = require('child_process');
var fs = require('fs');
var path = require('path');

module.exports = function computeCommitId (callback, cachedGitVersion) {

    if (cachedGitVersion) {
        callback(cachedGitVersion);
        return;
    }

    var cordovaJSDir = path.join(__dirname, '../../');

    // make sure .git directory exists in cordova.js repo
    if (fs.existsSync(path.join(__dirname, '../../.git'))) {
        var gitPath = 'git';
        var args = 'rev-list HEAD --max-count=1';
        childProcess.exec(gitPath + ' ' + args, {cwd: cordovaJSDir}, function (err, stdout, stderr) {
            var isWindows = process.platform.slice(0, 3) === 'win';
            if (err && isWindows) {
                gitPath = '"' + path.join(process.env['ProgramFiles'], 'Git', 'bin', 'git.exe') + '"';
                childProcess.exec(gitPath + ' ' + args, function (err, stdout, stderr) {
                    if (err) {
                        console.warn('Error during git describe: ' + err);
                        done('???');
                    } else {
                        done(stdout);
                    }
                });
            } else if (err) {
                console.warn('Error during git describe: ' + err);
                done('???');
            } else {
                done(stdout);
            }
        });
    } else {
        // console.log('no git');
        // Can't compute commit ID
        done('???');
    }

    function done (stdout) {
        var version = stdout.trim();
        cachedGitVersion = version;
        callback(version);
    }
};
