using Microsoft.VisualStudio.Shell.Interop;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Runtime.InteropServices;
using System.Text;
using System.Threading.Tasks;

namespace Microsoft.VisualStudio.Project
{
    //Written by KorsarNek for ANX.Framework
#if DEV11_OR_LATER
    [ComVisible(true)]
    [Guid("DC188DAC-F250-45CB-AA77-B9E6FB1679C3")]
    public class ReferenceManagerUser : IVsReferenceManagerUser
    {
        IVsReferenceProviderContext[] contexts;
        IReferenceContainer referenceContainer;

        public ReferenceManagerUser(IVsReferenceProviderContext[] contexts, IReferenceContainer referenceContainer)
        {
            if (contexts == null)
                throw new ArgumentNullException("contexts");

            if (referenceContainer == null)
                throw new ArgumentNullException("referenceContainer");

            this.contexts = contexts;
            this.referenceContainer = referenceContainer;
        }
        
        public void ChangeReferences(uint operation, IVsReferenceProviderContext changedContext)
        {
            __VSREFERENCECHANGEOPERATION mod = (__VSREFERENCECHANGEOPERATION)operation;
            if (mod == __VSREFERENCECHANGEOPERATION.VSREFERENCECHANGEOPERATION_ADD)
            {
                foreach (IVsReference reference in changedContext.References)
                {
                    //Checks internally if duplicates would be created.
                    referenceContainer.AddReference(reference);
                }
            }
            else if (mod == __VSREFERENCECHANGEOPERATION.VSREFERENCECHANGEOPERATION_REMOVE)
            {
                foreach (IVsReference reference in changedContext.References)
                {
                    //Checks internally if duplicates would be created.
                    referenceContainer.RemoveReference(reference);
                }
            }
        }

        public Array GetProviderContexts()
        {
            return contexts;
        }
    }
#endif
}