// Copyright (c) 2012 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

namespace NaCl.Build.CPPTasks
{
    using System;
    using System.IO;
    using System.Collections.Generic;

    /// <summary>
    /// TODO: Update summary.
    /// </summary>
    public class SDKUtilities
    {
        // The first version of pepper with a known working PNaCl toolchain
        public const int MinPNaCLSDKVersion = 24;
        public const int MinPNaCLSDKRevision = 166868;

        /// <summary>
        /// Find python executable in user's PATH.
        /// </summary>
        public static bool FindPython()
        {
            string envvar = Environment.GetEnvironmentVariable("Path", EnvironmentVariableTarget.Process);
            List<string> pathList = new List<string>(envvar.Split(';'));
            foreach (string path in pathList)
            {
                string testPath = Path.Combine(path, "python.bat");
                if (File.Exists(testPath))
                {
                    return true;
                }
                testPath = Path.Combine(path, "python.exe");
                if (File.Exists(testPath))
                {
                    return true;

                }
            }
            return false;
        }

        /// <summary>
        /// Retrieve the version and revsion of the given NaCl SDK root.
        /// </summary>
        public static int GetSDKVersion(string root, out int revision)
        {
            // Determine version by parsing top level README file.
            string[] lines = File.ReadAllLines(Path.Combine(root, "README"));
            int version = -1;
            revision = -1;
            foreach (var line in lines)
            {
                if (line.StartsWith("Revision"))
                    revision = Convert.ToInt32(line.Split(':')[1]);
                if (line.StartsWith("Version"))
                    version = Convert.ToInt32(line.Split(':')[1]);
            }
            return version;
        }

        /// <summary>
        /// Retrun true if the NaCl SDK at the given location supports
        /// the PNaCl toolchain.
        /// </summary>
        public static bool SupportsPNaCl(string root)
        {
            return CheckVersionAtLeast(root, MinPNaCLSDKVersion, MinPNaCLSDKRevision);
        }

        /// <summary>
        /// Retrun true if the NaCl SDK at the given location supports
        /// the native arm untrusted toolchain.
        /// </summary>
        public static bool SupportsARM(string root)
        {
            return CheckVersionAtLeast(root, 25, 172272);
        }

        /// <summary>
        /// Return true if the NaCl SDK at the given location is at the given
        /// version or higher.
        /// </summary>
        public static bool CheckVersionAtLeast(string root, int version, int revision)
        {
            int sdkRevision;
            int sdkVersion = GetSDKVersion(root, out sdkRevision);
            if (sdkVersion > version)
                return true;
            if (sdkVersion == version && sdkRevision >= revision)
                return true;
            return false;
        }
    }
}
