using Microsoft.AspNet.Identity;
using Microsoft.Owin;
using Microsoft.Owin.Security.Cookies;
using Owin;
using Owin.Security.Providers.Evernote;
using Owin.Security.Providers.PayPal;
using Owin.Security.Providers.ArcGISPortal;
using Owin.Security.Providers.Typeform;

namespace OwinOAuthProvidersDemo
{
	public partial class Startup
	{
		// For more information on configuring authentication, please visit http://go.microsoft.com/fwlink/?LinkId=301864
		public void ConfigureAuth(IAppBuilder app)
		{
			// Enable the application to use a cookie to store information for the signed in user
			app.UseCookieAuthentication(new CookieAuthenticationOptions
			{
				AuthenticationType = DefaultAuthenticationTypes.ApplicationCookie,
				LoginPath = new PathString("/Account/Login")
			});
			// Use a cookie to temporarily store information about a user logging in with a third party login provider
			app.UseExternalSignInCookie(DefaultAuthenticationTypes.ExternalCookie);
            //app.UseDeviantArtAuthentication("id", "secret");
            //app.UseUntappdAuthentication("id", "secret");
            // Uncomment the following lines to enable logging in with third party login providers
            //app.UseMicrosoftAccountAuthentication(
            //    clientId: "",
            //    clientSecret: "");

            //app.UseTwitterAuthentication(
            //   consumerKey: "",
            //   consumerSecret: "");

            //app.UseFacebookAuthentication(
            //   appId: "",
            //   appSecret: "");

            //app.UseGoogleAuthentication();

            //app.UseLinkedInAuthentication("", "");

            //app.UseYahooAuthentication("", "");

            //app.UseTripItAuthentication("", "");

            //app.UseGitHubAuthentication("", "");

            //app.UseBufferAuthentication("", "");

            //app.UseRedditAuthentication("", "");

            //app.UseStackExchangeAuthentication(
            //    clientId: "",
            //    clientSecret: "",
            //    key: "");

            //app.UseInstagramInAuthentication("", "");

            //var options = new GooglePlusAuthenticationOptions
            //{
            //    ClientId = "",
            //    ClientSecret = "",
            //    RequestOfflineAccess = true,
            //    Provider = new GooglePlusAuthenticationProvider
            //    {
            //        OnAuthenticated = async context => System.Diagnostics.Debug.WriteLine(String.Format("Refresh Token: {0}", context.RefreshToken))
            //    }
            //};
            //options.MomentTypes.Add("http://schemas.google.com/AddActivity");
            //options.MomentTypes.Add("http://schemas.google.com/CheckInActivity");
            //options.MomentTypes.Add("http://schemas.google.com/BuyActivity");
            //app.UseGooglePlusAuthentication(options);

            /*
             * Twitch sign-ins use /signin-Twitch as the URL for authentication
             *

             */

            ////Simple Twitch Sign-in
            //app.UseTwitchAuthentication("", "");

            ////More complex Twitch Sign-in
            //var opt = new TwitchAuthenticationOptions()
            //{
            //    ClientId = "",
            //    ClientSecret = "",
            //    Provider = new TwitchAuthenticationProvider()
            //    {
            //        OnAuthenticated = async z =>
            //        {
            ////            Getting the twitch users picture
            //            z.Identity.AddClaim(new Claim("Picture", z.User.GetValue("logo").ToString()));
            //        }
            ////    You should be able to access these claims with  HttpContext.GetOwinContext().Authentication.GetExternalLoginInfoAsync().Claims in your Account Controller
            //        //    Commonly used in the ExternalLoginCallback() in AccountController.cs
            //        /*

            //           if (user != null)
            //                {
            //                    var claim = (await AuthenticationManager.GetExternalLoginInfoAsync()).ExternalIdentity.Claims.First(
            //                    a => a.Type == "Picture");
            //                    user.Claims.Add(new IdentityUserClaim() { ClaimType = claim.Type, ClaimValue = claim.Value });
            //                    await SignInAsync(user, isPersistent: false);
            //                    return RedirectToLocal(returnUrl);
            //                }
            //         */
            //    }
            //};
            //app.UseTwitchAuthentication(opt);

            //app.UseOpenIDAuthentication("http://me.yahoo.com/", "Yahoo");

            //app.UseOpenIDAuthentication("https://openid.stackexchange.com/", "StackExchange");

            //app.UseOpenIDAuthentication("https://www.google.com/accounts/o8/id", "Google");

            //app.UseSteamAuthentication(applicationKey: "");

            //app.UseOpenIDAuthentication("http://orange.fr", "Orange");
            // Use OpenId provider login uri instead of discovery uri
            //app.UseOpenIDAuthentication("http://openid.orange.fr/server", "Orange", true);

            //app.UseSalesforceAuthentication(
            //    clientId: "",
            //    clientSecret: "");

            // Salesforce Option 1: don't specify explicit Endpoint config and use Production endpoint defaults
            //var salesforceOptions1 = new SalesforceAuthenticationOptions
            //{
            //    ClientId = "",
            //    ClientSecret = "",
            //    Provider = new SalesforceAuthenticationProvider()
            //    {
            //        OnAuthenticated = async context =>
            //        {
            //            System.Diagnostics.Debug.WriteLine(context.AccessToken);
            //            System.Diagnostics.Debug.WriteLine(context.RefreshToken);
            //            System.Diagnostics.Debug.WriteLine(context.OrganizationId);
            //        }
            //    }
            //};

            // Salesforce Option 2: ask for Sandbox environment; no need to know what those endpoints are
            //var salesforceOptions2 = new SalesforceAuthenticationOptions
            //{
            //    Endpoints =
            //        new SalesforceAuthenticationOptions.SalesforceAuthenticationEndpoints
            //        {
            //            Environment = Owin.Security.Providers.Salesforce.Constants.SandboxEnvironment
            //        },
            //    ClientId = "",
            //    ClientSecret = "",
            //    Provider = new SalesforceAuthenticationProvider()
            //    {
            //        OnAuthenticated = async context =>
            //        {
            //            System.Diagnostics.Debug.WriteLine(context.AccessToken);
            //            System.Diagnostics.Debug.WriteLine(context.RefreshToken);
            //            System.Diagnostics.Debug.WriteLine(context.OrganizationId);
            //        }
            //    }
            //};

            // Salesforce Option 3: explicitly specify endpoints (will take precedence over Environment choice)
            //var salesforceOptions3 = new SalesforceAuthenticationOptions
            //{
            //    Endpoints =
            //        new SalesforceAuthenticationOptions.SalesforceAuthenticationEndpoints
            //        {
            //            AuthorizationEndpoint = "https://ap1.salesforce.com/services/oauth2/authorize",
            //            TokenEndpoint = "https://ap1.salesforce.com/services/oauth2/token"
            //        },
            //    ClientId = "",
            //    ClientSecret = "",
            //    Provider = new SalesforceAuthenticationProvider()
            //    {
            //        OnAuthenticated = async context =>
            //        {
            //            System.Diagnostics.Debug.WriteLine(context.AccessToken);
            //            System.Diagnostics.Debug.WriteLine(context.RefreshToken);
            //            System.Diagnostics.Debug.WriteLine(context.OrganizationId);
            //        }
            //    }
            //};
            //app.UseSalesforceAuthentication(salesforceOptions1);

            ////app.UseShopifyAuthentication("", "");

            //app.UseArcGISOnlineAuthentication(
            //    clientId: "",
            //    clientSecret: "");

            //app.UseArcGISPortalAuthentication(new ArcGISPortalAuthenticationOptions(
            //    "My ArcGIS Portal",
            //    "https://arcgisportal.mydomain.com/",
            //    "",
            //    ""));

            //app.UseWordPressAuthentication(
            //    clientId: "",
            //    clientSecret: "");

            //app.UseDropboxAuthentication(
            //    appKey: "",
            //    appSecret: "");

            //app.UseHealthGraphAuthentication(
            //    clientId: "",
            //    clientSecret: "");

            //app.UseBoxAuthentication(
            //    appKey: "",
            //    appSecret: "");

            //app.UseBaiduAuthentication(
            //    apiKey: "",
            //    secretKey: "");

            //app.UseBattleNetAuthentication(new BattleNetAuthenticationOptions
            //{
            //	ClientId = "",
            //	ClientSecret = ""
            //});
            //app.UseBattleNetAuthentication(
            //	clientId: "",
            //	clientSecret: "");

            //app.UseAsanaAuthentication("", "");

            //app.UseEveOnlineAuthentication("", "");

            //app.UseSoundCloudAuthentication("", "");

            //app.UseFoursquareAuthentication(
            //	clientId: "",
            //	clientSecret: "");

            // PayPal no longer supports Tls 1.0 or 1.1
            // https://devblog.paypal.com/upcoming-security-changes-notice/
            // http://stackoverflow.com/questions/34939523/the-request-was-aborted-could-not-create-ssl-tls-secure-channel-sandbox-account
            // System.Net.ServicePointManager.SecurityProtocol = System.Net.ServicePointManager.SecurityProtocol | System.Net.SecurityProtocolType.Tls12;
            // The Return URL must be configured in the PayPal application to https://[hostname][:port]/signin-paypal
            // PayPalAuthenticationOptions payPalOptions = new PayPalAuthenticationOptions(true);
            // payPalOptions.ClientId = "";
            // payPalOptions.ClientSecret = "";
            // payPalOptions.Scope.Add("email");
            // payPalOptions.Scope.Add("profile");
            // payPalOptions.Scope.Add("address");
            // payPalOptions.Scope.Add("https://uri.paypal.com/services/expresscheckout");

            // app.UsePayPalAuthentication(payPalOptions);

            //app.UseWargamingAccountAuthentication("", WargamingAuthenticationOptions.Region.NorthAmerica);

            //app.UseFlickrAuthentication("", "");
            //app.UseVisualStudioAuthentication(
            //	appId: "",
            //	appSecret: "");

            //app.UseSpotifyAuthentication(
            //    clientId: "",
            //    clientSecret: "");

            //var options = new SlackAuthenticationOptions
            //{
            //    ClientId = "",
            //    ClientSecret = "",
            //    TeamId = "" // optional
            //};
            //options.Scope.Add("identify");
            //app.UseSlackAuthentication(options);

            //app.UseGitterAuthentication(
            //    clientId: "",
            //    clientSecret: ""
            //);

            //app.UseImgurAuthentication(
            //    new ImgurAuthenticationOptions
            //    {
            //        ClientId = "",
            //        ClientSecret = ""
            //    });

            //var options = new BacklogAuthenticationOptions
            //{
            //    ClientId = "",
            //    ClientSecret = "",
            //    ContractName = "",
            //    CallbackPath = new PathString(""),  // ex.new PathString("/OauthTokenRequest")
            //    Provider = new BacklogAuthenticationProvider
            //    {
            //        OnAuthenticated = async context => await System.Threading.Tasks.Task.Run(()=> { System.Diagnostics.Debug.WriteLine(String.Format("Refresh Token: {0}", context.RefreshToken)); })
            //    }
            //};

            //app.UseBacklogAuthentication(options);

            //var cosignOptions = new CosignAuthenticationOptions
            //{
            //    AuthenticationType = "Cosign",
            //    SignInAsAuthenticationType = signInAsType,
            //    CosignServer = "weblogin.umich.edu",
            //    CosignServicePort = 6663,
            //    IdentityServerHostInstance = "core1",
            //    ClientServer = "cosignservername"
            //};
            //app.UseCosignAuthentication(cosignOptions);

            //app.UseVimeoAuthentication("", "");

            //app.UseFitbitAuthentication(new FitbitAuthenticationOptions
            //{
            //    ClientId = "",
            //    ClientSecret = ""
            //});

            //app.UseOnshapeAuthentication(
            //    appKey: "",
            //    appSecret: "");
            //
            //
            //app.UseOnshapeAuthentication(new OnshapeAuthenticationOptions()
            //{
            //  AppKey = "",
            //  AppSecret = "",
            //  CallbackPath = new PathString("/oauthRedirect"),
            //  Hostname = "partner.dev.onshape.com"
            //});

            //app.UseVKontakteAuthentication("", "");

            //app.UseXingAuthentication("", "");

            //app.UseDoYouBuzzAuthentication("", "");
            //app.("", "");
            //app.UseOrcidAuthentication("","");

            //app.UseDiscordAuthentication("", "");
            //app.UseGeniAuthentication("", "");
            //app.UseMyHeritageAuthentication("", "");

            //app.UseWSO2Authentication("", "", "");

            //app.UseEvernoteAuthentication(new EvernoteAuthenticationOptions()
            //{
            //      IsSandBox = true,
            //      AppKey = "",
            //      AppSecret = ""
            //});

            //app.UsePodbeanAuthentication(new PodbeanAuthenticationOptions
            //{
            //      AppId = "",
            //      AppSecret = "",
            //      DebugUsingRequestHeadersToBuildBaseUri = true
            //});

            // WARNING:
            // Typeform doesn't supply the user's ID so use this provider for authorization only, not authentication 
            // because each time you sign in with the same Typeform account it will yield a distinct UserId.
            //var typeformOptions = new Owin.Security.Providers.Typeform.TypeformAuthenticationOptions
            //{
            //    ClientId = "",
            //    ClientSecret = "",
            //};
            //typeformOptions.Scope.Add("forms:read");
            //app.UseTypeformAuthentication(typeformOptions);
        }
    }
}