using System.Linq;
using Codelyzer.Analysis;
using Codelyzer.Analysis.Model;
using CTA.FeatureDetection.Common.Extensions;
using CTA.FeatureDetection.Common.Models.Features.Base;

namespace CTA.FeatureDetection.AuthType.CompiledFeatures
{
    public class OpenIdFeature : WebConfigFeature
    {
        /// <summary>
        /// Determines if OpenId Authentication is being used in a given project based on references and
        /// method invocations in code.
        ///
        /// Qualifications:
        /// 1. using DotNetOpenAuth;
        ///
        /// 2. IAppBuilder.UseOpenIdConnectAuthentication(...)
        /// 
        /// </summary>
        /// <param name="analyzerResult">Source code analysis results</param>
        /// <returns>Whether or not Federated Authentication is used</returns>
        public override bool IsPresent(AnalyzerResult analyzerResult)
        {
            return analyzerResult.ProjectResult.ContainsNugetDependency(Constants.DotNetOpenAuthReferenceIdentifier)
                   || analyzerResult.ProjectResult.SourceFileResults.Any(s =>
                       s.AllInvocationExpressions().Any(i => i.SemanticOriginalDefinition?.StartsWith(Constants.OpenIdConnectAuthenticationQualifiedName) == true));
        }
    }
}