using System;
using System.Collections.Generic;
using System.Text;
using System.Xml;
using System.IO;


using NPanday.ProjectImporter.Digest;
using NPanday.ProjectImporter.Digest.Model;
using NPanday.Utils;
using NPanday.Model.Pom;

using NPanday.Artifact;
using System.Windows.Forms;

/// Author: Leopoldo Lee Agdeppa III

namespace NPanday.ProjectImporter.Converter.Algorithms
{
    public abstract class AbstractPomConverter : IPomConverter
    {
        protected GacUtility gacUtil;
        protected ArtifactContext artifactContext;
        protected List<Artifact.Artifact> localArtifacts;
        protected string mainPomFile;
        protected NPanday.Model.Pom.Model parent;
        protected string groupId;
        protected string version;


        protected ProjectDigest projectDigest;



        public ProjectDigest ProjectDigest
        {
            get { return projectDigest; }
        }

        protected NPanday.Model.Pom.Model model;

        public NPanday.Model.Pom.Model Model
        {
            get { return model; }
        }


        public AbstractPomConverter(ProjectDigest projectDigest, string mainPomFile, NPanday.Model.Pom.Model parent, string groupId)
        {

            artifactContext = new ArtifactContext();
            this.localArtifacts = artifactContext.GetArtifactRepository().GetArtifacts();
            this.projectDigest = projectDigest;
            this.mainPomFile = mainPomFile;
            this.parent = parent;
            this.groupId = FilterID(groupId);
            this.version = parent != null ? parent.version : null;

            this.gacUtil = new GacUtility();
            this.model = new NPanday.Model.Pom.Model();
            
            // Add build Tag
            this.model.build = new NPanday.Model.Pom.Build();

        }

        #region AddEmbeddedResources


        private bool isResgenSupported(string rsrc)
        {
            bool isSupported=false;
            if (rsrc.Contains(".txt") || rsrc.Contains(".resx") || rsrc.Contains(".resource"))
            {
                isSupported = true ;
            }
            return isSupported;
        }

        /// <summary>
        /// Auto Generate the Resources unsupported by Resgen.exe
        /// </summary>
        /// <param name="rsrcList"></param>
        protected void AddResources(List<string> rsrcList)
        {
            List<NPanday.Model.Pom.Resource> resources = new List<NPanday.Model.Pom.Resource>();
            
            if (model.build.resources != null)
            {
                resources.AddRange(model.build.resources);
            }

            // Add other resource file
            
            Resource r = new Resource();
            r.directory = "./";
            r.includes = rsrcList.ToArray();
            resources.Add(r);

            model.build.resources = resources.ToArray();



        }
        
        protected void AddEmbeddedResources()
        {
            if (projectDigest != null && projectDigest.EmbeddedResources != null && projectDigest.EmbeddedResources.Length > 0)
            {
                Plugin embeddedResourcePlugin = AddPlugin(
                    "npanday.plugin",
                    "maven-resgen-plugin",
                    null,
                    false
                );


                List<Dictionary<string, string>> embeddedResourceList = new List<Dictionary<string, string>>();
                List<string> resourceList = new List<string>();   
                foreach (EmbeddedResource embeddedResource in projectDigest.EmbeddedResources)
                {
                    if (isResgenSupported(embeddedResource.IncludePath))
                    {
                        Dictionary<string, string> value = new Dictionary<string, string>();
                        string sourceFile = embeddedResource.IncludePath;
                        if (sourceFile == null)
                            continue;

                        value.Add("sourceFile", sourceFile);
                        value.Add("name", parseEmbeddedName(projectDigest.RootNamespace, sourceFile));

                        embeddedResourceList.Add(value);
                    }
                    else
                    {
                        resourceList.Add(embeddedResource.IncludePath);
                    }
                }
                if (embeddedResourceList.Count > 0)
                {
                    AddPluginConfiguration(embeddedResourcePlugin, "embeddedResources", embeddedResourceList);
                }
                if (resourceList.Count > 0)
                {
                    AddResources(resourceList);
                }
            }
        }

        string parseEmbeddedName(string nameSpace, string sourceFilePath)
        {
            string returnVal = string.Empty;
            FileInfo sourceFileInfo = new FileInfo(sourceFilePath);
            if ("vb".Equals(projectDigest.Language))
            {
                returnVal = sourceFileInfo.Name.Replace(".resx", string.Empty);
            }
            else if ("csharp".Equals(projectDigest.Language))
            {
                foreach (string name in sourceFilePath.Split("\\".ToCharArray(), StringSplitOptions.RemoveEmptyEntries))
                {
                    if (name.IndexOf(".") < 0)
                    {
                        returnVal += name.Trim().Replace(' ', '_') + ".";
                    }
                    else
                    {
                        returnVal += name.Substring(0, name.LastIndexOf("."));
                    }

                }
            }
            return string.Format("{0}.{1}", nameSpace, returnVal);
        }

        #endregion
        #region AddWebReferences
        /// <summary>
        /// Adds WebReference as Plugin
        /// Author: Shein Melicer G. Ernacio
        /// </summary>
        protected void AddWebReferences()
        {
            if (projectDigest != null && projectDigest.WebReferenceUrls != null && projectDigest.WebReferenceUrls.Length > 0)
            {
                Plugin webReferencePlugin = AddPlugin(
                    "npanday.plugin",
                    "maven-wsdl-plugin",
                    null,
                    false
                );

                AddPluginExecution(webReferencePlugin, "wsdl", null);

                List<Dictionary<string, string>> webReferenceUrlList = new List<Dictionary<string, string>>();

                foreach (WebReferenceUrl webReferenceUrl in projectDigest.WebReferenceUrls)
                {
                    Dictionary<string, string> value = new Dictionary<string, string>();
                    string name = webReferenceUrl.RelPath;

                    if (name != null)
                    {
                        int startIndex = name.IndexOf("\\");
                        if (startIndex >= 0)
                        {
                            name = name.Substring(startIndex + 1);
                        }
                        name = getNameSpace(name);
                        value.Add("namespace", name);
                        value.Add("output", webReferenceUrl.RelPath);
                        DirectoryInfo dirInfo = new DirectoryInfo(Path.Combine(projectDigest.FullDirectoryName, webReferenceUrl.RelPath));
                        FileInfo[] fileInfo = dirInfo.GetFiles("*.wsdl");
                        if (fileInfo.Length > 0)
                        {
                            value.Add("path", Path.Combine(webReferenceUrl.RelPath, fileInfo[0].Name));
                        }
                        else
                        {
                            value.Add("path", webReferenceUrl.RelPath + name + ".wsdl");
                        }

                        webReferenceUrlList.Add(value);
                    }
                }

                AddPluginConfiguration(webReferencePlugin, "webreferences", webReferenceUrlList);

            }
        }

        string getNameSpace(string relPath)
        {
            if (string.IsNullOrEmpty(relPath))
                return string.Empty;
            if (relPath.EndsWith("\\"))
                relPath = relPath.Substring(0, relPath.Length - 1);
            return relPath.Replace("\\", ".");
        }
        #endregion
        public abstract void ConvertProjectToPomModel(bool writePom, string scmTag);

        public void ConvertProjectToPomModel(string scmTag)
        {
            ConvertProjectToPomModel(true,scmTag);
        }

        private string FilterID(string partial)
        {
            string filtered = string.Empty;
            if (partial.EndsWith("."))
            {
                partial = partial.Substring(0, partial.Length - 1);
            }
            char before = '*';
            foreach (char item in partial)
            {

                if ((Char.IsNumber(item) || Char.IsLetter(item)) || ((item == '.' && before != '.') || (item == '-' && before != '-')))
                {
                    filtered += item;
                }
                before = item;
            }

            return filtered;
        }

        bool HasSpecialCharacters(string partial)
        {
            bool isSpecial = false;
            foreach (char item in partial)
            {

                if ((!Char.IsNumber(item) && !Char.IsLetter(item)) && item != '.' && item != '-')
                {
                    isSpecial = true;
                }
            }

            return isSpecial;
        }


        protected void GenerateHeader(string packaging)
        {
            // Add Parent Header
            if (parent != null)
            {
                model.parent = new NPanday.Model.Pom.Parent();
                model.parent.artifactId = FilterID(parent.artifactId);
                model.parent.groupId = FilterID(parent.groupId);
                model.parent.version = parent.version;


                if (!string.IsNullOrEmpty(mainPomFile))
                {
                    DirectoryInfo dir = new DirectoryInfo(Path.GetDirectoryName(projectDigest.FullFileName));
                    FileInfo file = new FileInfo(mainPomFile);
                    model.parent.relativePath = PomHelperUtility.GetRelativePath(dir, file);
                }
            }
            else
            {
                model.groupId = !string.IsNullOrEmpty(groupId) ? FilterID(groupId) : FilterID(projectDigest.AssemblyName);
                model.version = string.IsNullOrEmpty(version) ? "1.0-SNAPSHOT" : version;
            }

            string projectName = projectDigest.AssemblyName;
            if (HasSpecialCharacters(projectDigest.AssemblyName))
            {
                string[] projectFullName = projectDigest.FullFileName.Split("\\".ToCharArray());
                projectName = projectFullName[projectFullName.Length - 1];

                if (projectName.Equals("."))
                {
                    projectName = projectFullName[projectFullName.Length - 2];
                }

                if (projectName.Contains(".csproj"))
                {
                    projectName = projectName.Replace(".csproj", "");
                }
                if (projectName.Contains(".vbproj"))
                {
                    projectName = projectName.Replace(".vbproj", "");
                }

            }


            model.artifactId = FilterID(projectName);




            model.modelVersion = "4.0.0";
            model.packaging = packaging;

            model.name = string.Format("{0} : {1}", !string.IsNullOrEmpty(groupId) ? groupId : FilterID(projectDigest.AssemblyName), FilterID(projectDigest.AssemblyName));
            if (!string.IsNullOrEmpty(projectDigest.OutputType))
            {
                model.packaging = projectDigest.OutputType.ToLower();
            }
        }


        protected void AddComReferenceDependency()
        {
            foreach (ComReference comReference in projectDigest.ComReferenceList)
            {
                Dependency comDependency = new Dependency();
                comDependency.groupId = comReference.Include;
                comDependency.artifactId = comReference.Include;
                comDependency.version = comReference.VersionMajor + "." + comReference.VersionMinor + ".0" + ".0";
                comDependency.type = "com_reference";
                comDependency.classifier = string.Format("{0}\\{1}.{2}\\{3}", comReference.Guid, convertDecToHex(comReference.VersionMajor), convertDecToHex(comReference.VersionMinor), convertDecToHex(comReference.Lcid));
                comDependency.classifier = comDependency.classifier.Replace("\\", "-");
                AddDependency(comDependency);
            }
        }

        string convertDecToHex(string decimalNum)
        {
            int decNum;
            if (int.TryParse(decimalNum, out decNum))
            {
                return decNum.ToString("X");
            }
            return decimalNum;
        }


        protected bool IsModelHasDependency(Dependency dependency)
        {
            if (model.dependencies == null)
            {
                return false;
            }

            foreach (Dependency var in model.dependencies)
            {
                if (var.artifactId.Equals(dependency.artifactId) && var.groupId.Equals(dependency.groupId))
                {
                    return true;
                }
            }

            return false;

        }



        protected void AddDependency(Dependency dependency)
        {
            // add dependency if it doesnot exists
            if (!IsModelHasDependency(dependency))
            {
                List<Dependency> dependencies = new List<Dependency>();
                if (model.dependencies != null)
                {
                    dependencies.AddRange(model.dependencies);
                }
                dependencies.Add(dependency);
                model.dependencies = dependencies.ToArray();
                return;
            }
        }



        protected void AddInterProjectDependency(ProjectReference projectRef)
        {

            Dependency interDependency = new Dependency();

            interDependency.artifactId = projectRef.Name;
            interDependency.groupId = !string.IsNullOrEmpty(groupId) ? groupId : projectRef.Name;
            interDependency.version = string.IsNullOrEmpty(version) ? "1.0-SNAPSHOT" : version;
            interDependency.type = "dotnet-library";

            if (projectRef.ProjectReferenceDigest != null
                && !string.IsNullOrEmpty(projectRef.ProjectReferenceDigest.OutputType))
            {
                interDependency.type = projectRef.ProjectReferenceDigest.OutputType.ToLower();
            }

            AddDependency(interDependency);

        }


        protected void AddInterProjectDependenciesToList()
        {
            foreach (ProjectReference projectRef in projectDigest.ProjectReferences)
            {
                AddInterProjectDependency(projectRef);
            }
        }

        protected virtual void AddProjectReferenceDependency(Reference reference)
        {
            Dependency refDependency = ResolveDependency(reference);
            if (refDependency == null)
            {
                return;
            }


            if (!("library".Equals(refDependency.type, StringComparison.OrdinalIgnoreCase)
                  || "dotnet-library".Equals(refDependency.type, StringComparison.OrdinalIgnoreCase)))
            {
                // ignore gac if already in the RSP 
                if (gacUtil.IsRspIncluded(refDependency.artifactId, projectDigest.Language))
                {
                    return;
                }
            }

            AddDependency(refDependency);


        }


        protected void AddProjectReferenceDependenciesToList()
        {
            foreach (Reference reference in projectDigest.References)
            {
                AddProjectReferenceDependency(reference);
            }
        }

        protected Plugin AddPlugin(string groupId, string artifactId)
        {
            return AddPlugin(groupId, artifactId, null, true);
        }

        

        protected Plugin AddPlugin(string groupId, string artifactId, string version, bool extensions)
        {
            List<NPanday.Model.Pom.Plugin> plugins = new List<NPanday.Model.Pom.Plugin>();
            if (model.build.plugins != null)
            {
                plugins.AddRange(model.build.plugins);
            }


            // Add NPanday compile plugin 
            NPanday.Model.Pom.Plugin plugin = new NPanday.Model.Pom.Plugin();
            plugin.groupId = groupId;
            plugin.artifactId = artifactId;
            plugin.version = version;
            plugin.extensions = extensions;
            
            plugins.Add(plugin);
            

            model.build.plugins = plugins.ToArray();

            return plugin;

        }

        protected Plugin FindPlugin(string groupId, string artifactId)
        {
            return FindPlugin(groupId, artifactId, null);
        }

        protected Plugin FindPlugin(string groupId, string artifactId, string version)
        {
            if (model.build.plugins == null)
            {
                return null;
            }

            foreach (Plugin plugin in model.build.plugins)
            {
                if (groupId.ToLower().Equals(plugin.groupId.ToLower(), StringComparison.InvariantCultureIgnoreCase) && artifactId.ToLower().Equals(plugin.artifactId.ToLower(), StringComparison.InvariantCultureIgnoreCase))
                {
                    if (!string.IsNullOrEmpty(version) && version.Equals(plugin.version))
                    {
                        return plugin;
                    }
                    else if (string.IsNullOrEmpty(version))
                    {
                        return plugin;
                    }
                }
            }

            return null;

        }

        /// <summary>
        /// Adds PluginExecution
        /// </summary>
        /// <param name="plugin"></param>
        /// <param name="goal"></param>
        /// <param name="phase"></param>
        protected void AddPluginExecution(Plugin plugin, string goal, string phase)
        {
            if (string.IsNullOrEmpty(goal))
            {
                // there is nothing to write
                return;
            }

            List<PluginExecution> list = new List<PluginExecution>();
            if (plugin.executions == null)
            {
                plugin.executions = new List<PluginExecution>().ToArray();
                list.AddRange(plugin.executions);
            }

            PluginExecution exe = new PluginExecution();

            exe.goals = new string[] { goal };

            list.Add(exe);

            plugin.executions = list.ToArray();
        }


        protected void AddPluginConfiguration(Plugin plugin, string tag, string value)
        {
            if (string.IsNullOrEmpty(tag) || string.IsNullOrEmpty(value))
            {
                // there is nothing to write
                return;
            }

            if (plugin.configuration == null)
            {
                plugin.configuration = new PluginConfiguration();
            }


            List<XmlElement> elems = new List<XmlElement>();
            if (plugin.configuration.Any != null)
            {
                elems.AddRange(plugin.configuration.Any);
            }



            XmlDocument xmlDocument = new XmlDocument();
            XmlElement elem = xmlDocument.CreateElement(tag, @"http://maven.apache.org/POM/4.0.0");
            elem.InnerText = value;



            elems.Add(elem);
            plugin.configuration.Any = elems.ToArray();

        }

        /// <summary>
        /// Design for WebReferenceUrl
        /// </summary>
        /// <param name="plugin">the plugin</param>
        /// <param name="parentTag">myReference</param>
        /// <param name="properties">name-value-property</param>
        protected void AddPluginConfiguration(Plugin plugin, string parentTag, List<Dictionary<string, string>> properties)
        {
            if (string.IsNullOrEmpty(parentTag) || properties == null)
            {
                // there is nothing to write
                return;
            }

            if (properties.Count <= 0)
            {
                // there is nothing to write
                return;
            }

            if (plugin.configuration == null)
            {
                plugin.configuration = new PluginConfiguration();
            }

            List<XmlElement> elems = new List<XmlElement>();
            if (plugin.configuration.Any != null)
            {
                elems.AddRange(plugin.configuration.Any);
            }

            XmlDocument xmlDocument = new XmlDocument();
            XmlElement elem = xmlDocument.CreateElement(parentTag, @"http://maven.apache.org/POM/4.0.0");


            string childElement = parentTag.Substring(0, parentTag.Length - 1);
            foreach (Dictionary<string, string> property in properties)
            {

                XmlNode node = xmlDocument.CreateNode(XmlNodeType.Element, childElement, @"http://maven.apache.org/POM/4.0.0");
                if ("embeddedResources".Equals(parentTag))
                {
                    XmlNode nodeSourceFile = xmlDocument.CreateNode(XmlNodeType.Element, "sourceFile", @"http://maven.apache.org/POM/4.0.0");
                    XmlNode nodeName = xmlDocument.CreateNode(XmlNodeType.Element, "name", @"http://maven.apache.org/POM/4.0.0");
                    nodeName.InnerText = property["name"];
                    nodeSourceFile.InnerText = property["sourceFile"];
                    node.AppendChild(nodeSourceFile);
                    node.AppendChild(nodeName);
                }
                else
                {
                    XmlNode nodeName = xmlDocument.CreateNode(XmlNodeType.Element, "namespace", @"http://maven.apache.org/POM/4.0.0");
                    XmlNode nodePath = xmlDocument.CreateNode(XmlNodeType.Element, "path", @"http://maven.apache.org/POM/4.0.0");
                    XmlNode nodeOutput = xmlDocument.CreateNode(XmlNodeType.Element, "output", @"http://maven.apache.org/POM/4.0.0");
                    nodeName.InnerText = property["namespace"];
                    nodePath.InnerText = property["path"] != null ? property["path"].Replace("\\", "/") : property["path"];
                    nodeOutput.InnerText = property["output"] != null ? property["output"].Replace("\\", "/") : property["output"];
                    node.AppendChild(nodeName);
                    node.AppendChild(nodePath);
                    node.AppendChild(nodeOutput);
                }
                elem.AppendChild(node);
            }

            elems.Add(elem);
            plugin.configuration.Any = elems.ToArray();
        }

        protected void AddPluginConfiguration(Plugin plugin, string parentTag, string childTags, string[] values)
        {
            if (string.IsNullOrEmpty(parentTag) || string.IsNullOrEmpty(childTags) || values == null)
            {
                // there is nothing to write
                return;
            }

            if (values.Length <= 0)
            {
                // there is nothing to write
                return;
            }



            if (plugin.configuration == null)
            {
                plugin.configuration = new PluginConfiguration();
            }


            List<XmlElement> elems = new List<XmlElement>();
            if (plugin.configuration.Any != null)
            {
                elems.AddRange(plugin.configuration.Any);
            }


            XmlDocument xmlDocument = new XmlDocument();
            XmlElement elem = xmlDocument.CreateElement(parentTag, @"http://maven.apache.org/POM/4.0.0");

            foreach (string value in values)
            {
                XmlNode node = xmlDocument.CreateNode(XmlNodeType.Element, childTags, @"http://maven.apache.org/POM/4.0.0");
                node.InnerText = value.Trim();
                elem.AppendChild(node);
            }

            elems.Add(elem);
            plugin.configuration.Any = elems.ToArray();

        }


        protected Dependency ResolveDependency(Reference reference)
        {

            // resolve first from artifact
            Artifact.Artifact artifact = GetArtifact(reference);
            if (artifact != null)
            {
                Dependency dependency = new Dependency();
                dependency.artifactId = artifact.ArtifactId;
                dependency.groupId = artifact.GroupId;
                dependency.version = artifact.Version;
                dependency.type = "dotnet-library";
                return dependency;
            }



            // resolve from GAC
            if (!string.IsNullOrEmpty(gacUtil.GetAssemblyInfo(reference.Name, null, projectDigest.Platform)))
            {
                // Assembly is found at the gac

                Dependency refDependency = new Dependency();
                refDependency.artifactId = reference.Name;
                refDependency.groupId = reference.Name;
                
                if ("MSIL".Equals(reference.ProcessorArchitecture, StringComparison.OrdinalIgnoreCase))
                {
                    if ("4.0.0.0".Equals(reference.Version))
                    {
                        refDependency.type = "gac_msil4";
                    }
                    else
                    {
                        refDependency.type = "gac_msil";
                    }
                }
                else if ("x86".Equals(reference.ProcessorArchitecture, StringComparison.OrdinalIgnoreCase))
                {
                    if ("4.0.0.0".Equals(reference.Version))
                    {
                        refDependency.type = "gac_32_4";
                    }
                    else
                    {
                        refDependency.type = "gac_32";
                    }
                }
                else if ("IA64".Equals(reference.ProcessorArchitecture, StringComparison.OrdinalIgnoreCase) || 
                     "AMD64".Equals(reference.ProcessorArchitecture, StringComparison.OrdinalIgnoreCase))
                {
                    if ("4.0.0.0".Equals(reference.Version))
                    {
                        refDependency.type = "gac_64_4";
                    }
                    else
                    {
                        refDependency.type = "gac_64";
                    }
                }

                //Assemblies that with null ProcessorArchitecture esp ASP.net assmblies (e.g MVC)
                else if ((reference.ProcessorArchitecture == null) && ("31bf3856ad364e35".Equals(reference.PublicKeyToken.ToLower(), StringComparison.OrdinalIgnoreCase)))
                {
                    if ("4.0.0.0".Equals(reference.Version))
                    {
                        refDependency.type = "gac_msil4";
                    }
                    else
                    {
                        refDependency.type = "gac_msil";
                    }
                }

                else
                {
                    refDependency.type = "gac";
                }
                
                refDependency.version = reference.Version ?? "1.0.0.0";
                
				//exclude ProcessArchitecture when loading assembly on a non-32 bit machine
                System.Reflection.Assembly a = System.Reflection.Assembly.Load(new System.Reflection.AssemblyName(gacUtil.GetAssemblyInfo(reference.Name, reference.Version, null)).FullName);
                
				if (reference.PublicKeyToken != null)
                {
                    refDependency.classifier = reference.PublicKeyToken;
                }
                else
                {
                    int start = a.FullName.IndexOf("PublicKeyToken=");
                    int length = (a.FullName.Length)-start;
                    refDependency.classifier = a.FullName.Substring(start,length);
                    refDependency.classifier = refDependency.classifier.Replace("PublicKeyToken=", "");
                }

                return refDependency;

            }

            bool isPathReference = false;

            // resolve using system path
            if (!string.IsNullOrEmpty(reference.HintFullPath) && new FileInfo(reference.HintFullPath).Exists)
            {

                // silent for re-import
                //commented out 
                //if (projectDigest.ExistingPom != null)
                //{
                //    return null;
                //}
                //else
                {
                    string prjRefPath = Path.Combine(projectDigest.FullDirectoryName, ".references");
                    //verbose for new-import
                    if (!reference.HintFullPath.ToLower().StartsWith(prjRefPath.ToLower()) && !reference.Name.Contains("Interop"))
                    {
                        MessageBox.Show(
                         string.Format("Warning: Build may not be portable if local references are used, Reference is not in Maven Repository or in GAC."
                                     + "\nReference: {0}"
                                     + "\nDeploying the reference to a Repository, will make the code portable to other machines",
                             reference.HintFullPath
                         ), "Add Reference", MessageBoxButtons.OK, MessageBoxIcon.Warning);

                        isPathReference = true;
                    }

                }


                // uncomment this if systemPath is supported

                Dependency refDependency = new Dependency();

                if (!isPathReference)
                {
                    refDependency.artifactId = reference.Name;
                   
                    //get version from the name above the last path
                    string[] pathTokens = reference.HintFullPath.Split("\\\\".ToCharArray());
                    refDependency.groupId = pathTokens[pathTokens.Length - 3];
                    refDependency.version = pathTokens[pathTokens.Length-2].Replace(reference.Name+"-","") ?? "1.0.0.0";
                    //refDependency.version = reference.Version ?? "1.0.0.0";
                    
                    refDependency.type = "dotnet-library";
                    //refDependency.scope = "system";
                    //refDependency.systemPath = reference.HintFullPath;

                }
                else
                {
                    refDependency.artifactId = reference.Name;
                    refDependency.groupId = reference.Name;
                    refDependency.version = reference.Version ?? "1.0.0.0";
                    refDependency.type = "dotnet-library";
                    refDependency.scope = "system";
                    refDependency.systemPath = reference.HintFullPath;
                }
                
                return refDependency;
            }

            return null;

        }

        Artifact.Artifact GetArtifactFromRepoUsingEmbeddedAssemblyVersionNumber(Reference reference)
        {
            foreach (Artifact.Artifact artifact in localArtifacts)
            {
                if (artifact.ArtifactId.Equals(reference.Name, StringComparison.OrdinalIgnoreCase)
                    && artifact.Version.Equals(reference.Version, StringComparison.OrdinalIgnoreCase))
                {
                    return artifact;
                }
            }

            return null;
        }


        Artifact.Artifact GetArtifactFromRepoUsingHintPathVersionNumber(Reference reference)
        {
            if (string.IsNullOrEmpty(reference.HintFullPath) || !(new FileInfo(reference.HintFullPath).Exists))
            {
                return null;
            }

            return artifactContext.GetArtifactRepository().GetArtifact(new FileInfo(reference.HintFullPath));

        }



        protected Artifact.Artifact GetArtifact(Reference reference)
        {
            //if (string.IsNullOrEmpty(reference.Name) || string.IsNullOrEmpty(reference.Version))
            //{
            //    return null;
            //}

            //if (localArtifacts == null)
            //{
            //    return null;
            //}

            try
            {

                Artifact.Artifact artifact = GetArtifactFromRepoUsingEmbeddedAssemblyVersionNumber(reference);

                if (artifact == null)
                {
                    artifact = GetArtifactFromRepoUsingHintPathVersionNumber(reference);
                }
                if (artifact == null)
                {
                    artifact = artifactContext.GetArtifactRepository().GetArtifact(new FileInfo(reference.HintPath));
                }
                return artifact;
            }
            catch
            {

                return null;
            }


        }





        protected string GetSourceDir()
        {
            if (projectDigest.Compiles.Length == 0)
            {
                return "./";
            }

            DirectoryInfo common = new DirectoryInfo(Path.GetDirectoryName(projectDigest.Compiles[0].IncludeFullPath));
            foreach (Compile compile in projectDigest.Compiles)
            {
                DirectoryInfo srcInclude = new DirectoryInfo(Path.GetDirectoryName(compile.IncludeFullPath));

                common = PomHelperUtility.GetCommonDirectory(common, srcInclude);

            }



            DirectoryInfo prjDir = new DirectoryInfo(Path.GetDirectoryName(projectDigest.FullFileName));
            string srcDir = PomHelperUtility.GetRelativePath(prjDir, common);

            if (string.IsNullOrEmpty(srcDir))
            {
                return "./";
            }

            if (srcDir.Contains(".."))
            {
                return "./";
            }

            return srcDir;


        }



        protected string GetDefineConfigurationValue()
        {
            List<string> defines = new List<string>();

            if (!string.IsNullOrEmpty(projectDigest.MyType))
            {
                defines.Add(string.Format("_MyType=\"{0}\"", projectDigest.MyType));
            }


            if (!string.IsNullOrEmpty(projectDigest.Platform))
            {
                defines.Add(string.Format("PLATFORM=\"{0}\"", projectDigest.Platform));
            }

            return string.Join(",", defines.ToArray());
        }



    }

}
