using System;
using System.Threading.Tasks;
using Microsoft.Owin;
using Owin;
using DD4T.RestService.WebApi;
using Autofac;
using Autofac.Integration.WebApi;
using DD4T.ContentModel.Contracts.Logging;
using Microsoft.Owin.Security.Cookies;
using Microsoft.Owin.Security;
using Thinktecture.IdentityModel.Owin;
using System.Collections.Generic;
using System.Security.Claims;
using System.Configuration;



[assembly: OwinStartup(typeof(MyDD4T.RestService.Startup))]

namespace MyDD4T.RestService
{
    
    public class Startup
    {
        private const string authenticationType = "Basic";
        public void Configuration(IAppBuilder app)
        {
            log4net.Config.XmlConfigurator.Configure();

            app.UseBasicAuthentication(new BasicAuthenticationOptions("MyDD4T login", Validate)
                            {
                                AuthenticationMode = AuthenticationMode.Active,
                                AuthenticationType = authenticationType
                            });
            app.ForceAuthentication(authenticationType);
            app.UseDD4TWebApi();
        }

        private Task<IEnumerable<Claim>> Validate(string id, string secret)
        {
            var username = ConfigurationManager.AppSettings["Username"];
            var password = ConfigurationManager.AppSettings["Password"];
            List<Claim> list = null;
            if (id.Equals(username) && secret.Equals(password))
            {
                list = new List<Claim>();
                list.Add(new Claim(ClaimTypes.Name, id));
            }

            return Task.FromResult<IEnumerable<Claim>>(list);
        }
    }
}

//// Extensions methods


namespace Owin
{
    public static class AppBuilderExtensions
    {
        public static IAppBuilder ForceAuthentication(this IAppBuilder app, string authenticationType)
        {
           return  app.Use(async (ctx, next) =>
                {
                    var result = await ctx.Authentication.AuthenticateAsync(authenticationType);
                    if (result == null || result.Identity == null)
                    {
                        ctx.Authentication.Challenge(authenticationType);
                    }
                    else
                    {
                        await next();
                    }
                });
        }
    }
}