import '@k-core/polyfills';
import 'zone.js/dist/zone-node';
import 'reflect-metadata';
import 'rxjs/Rx';
import * as path from 'path';
import * as express from 'express';
import * as auth from 'http-auth';
import * as cookieParser from 'cookie-parser'
import session from 'express-session'
const XMLHttpRequest = require('xmlhttprequest').XMLHttpRequest

import { Request, Response } from 'express';
import { platformServer, renderModuleFactory } from '@angular/platform-server';
import { ServerAppModule } from './server-app.module';
import { ngExpressEngine } from '@nguniversal/express-engine';
import { ROUTES } from './server-routes';
import { enableProdMode } from '@angular/core';
import { urlkey } from '@k-settings/app-setup'
import { storeId } from '@k-settings/store-helper'
import { DataLayerManager } from '../../../node_modules/@agm/core';
enableProdMode();

const url = require('url')
const app = express();
const port = process.env.PORT || 8000;
const baseUrl = `http://localhost:${port}`;
const cookieTime = 24 * 60 * 60 * 1000

app.engine('html', ngExpressEngine({
	bootstrap: ServerAppModule
}));

app.set('view engine', 'html');
app.set('views', 'src');

function cacheControl(req, res, next) {
	// instruct browser to revalidate in 60 seconds
	res.header('Cache-Control', 'max-age=432000');
	next();
}


// Auth Config
// var USER    = 'Rulle',
// 	PASS    = 'Gardin',
// 	USEAUTH = false;

// var basic = auth.basic({
// 		realm: 'Kake'
// 	}, function(username, password, callback) {
// 		callback(username === USER && password === PASS);
// 	});

// if (USEAUTH) {
// 	app.use(auth.connect(basic));
// }

/**
 * **** LOGIN PAGE REDIRECT ****
 */

// Define the session secret, TODO: Change this to be a dynamic session secret based on project
var secret = '8F7921AEB2BEE5C9CD32CF39E720B6B1C2F89542FA9B9827284422E5AF8433E7'

// Session specs
var sess = {
	resave: false,
	saveUninitialized: true,
	secret: secret,
	cookie: {
		maxAge: cookieTime
	}
}

app.set('trust proxy', 1)

// Define the session code
app.use(session(sess))
app.use(cookieParser())
// Declare XHR, for making XMLHttpRequests, required for Angular
let xhr = new XMLHttpRequest()


/**
 * HTTP_GET for ExpressJS
 * $
 * @param url 
 */
let HttpGet = (url) => {
	xhr.open("GET", url, false)
	xhr.send(null)
	return JSON.parse(xhr.responseText)
}

// Password protection of sub pages
let passwordProtection = (req: any, res, next) => {
	return new Promise(((resolve, reject) => {

		let sessionId = req.session.id
		let host: string = req.get('host')
		var cookie = req.cookies.kakesession

		if (cookie === undefined) {
			res.cookie('kakesession', req.session.id, { maxAge: cookieTime })
		} else {
			sessionId = cookie
		}

		
		
		if(host.indexOf('localhost') === -1)
			//expects Protocol to be https, TODO: figure out why req.protocol returns http
			resolve(HttpGet('https://' + req.get('host') + '/login/check.php?storeId='+storeId + '&guid=' + sessionId))

		else
			// Rejects for localhost
			reject('localhost')


	})).then((response: any) => {
		let data = response

		console.log('has login: ', data.has_login)

		if(data.has_login && !data.logged_in)
			// does the user need to log in?
			res.send('<script>window.location.href="/login?redirect=' + urlkey + '&guid='+ req.session.id +'";</script>');
		else
			// Log in is not required!
			next()
		
	}).catch((message) => {
		console.log('Bypass login check for host: ' + message)
		next()
	})
}


/**
 * Typecasting `req` to `any` so it doesn't fail over `session.id`
 */
app.get('*', (req: any, res, next) => {
	// next()
	passwordProtection(req, res, next)
})


// Serve static files
app.use('/assets', cacheControl, express.static('source/assets', {maxAge: 432000}));
app.use('/', express.static('dist', {index: false}));


ROUTES.forEach((route: string) => {
	app.get(route, (req: Request, res: Response) => {
		console.time(`GET: ${req.originalUrl}`);
		res.render('../dist/index', {
			req: req,
			res: res
		});
		console.timeEnd(`GET: ${req.originalUrl}`);
	});
});

app.listen(port, () => {
	console.log(`Listening at ${baseUrl}`);
});


// import '@k-core/polyfills';
// import 'zone.js/dist/zone-node';
// import 'reflect-metadata';
// import 'rxjs/Rx';
// import * as path from 'path';
// import * as express from 'express';
// import * as auth from 'http-auth';
// import * as cookieParser from 'cookie-parser'
// import session from 'express-session'
// const XMLHttpRequest = require('xmlhttprequest').XMLHttpRequest

// import { Request, Response } from 'express';
// import { platformServer, renderModuleFactory } from '@angular/platform-server';
// import { ServerAppModule } from './server-app.module';
// import { ngExpressEngine } from '@nguniversal/express-engine';
// import { ROUTES } from './server-routes';
// import { enableProdMode } from '@angular/core';
// import { urlkey } from '@k-settings/app-setup'
// import { storeId } from '@k-settings/store-helper'
// import { DataLayerManager } from '../../../node_modules/@agm/core';
// enableProdMode();

// var MemoryStore = require('memorystore')(session)

// const url = require('url')
// const app = express();
// const port = process.env.PORT || 8000;
// const baseUrl = `http://localhost:${port}`;
// const cookieTime = 24 * 60 * 60 * 1000

// app.engine('html', ngExpressEngine({
// 	bootstrap: ServerAppModule
// }));

// app.set('view engine', 'html');
// app.set('views', 'src');

// function cacheControl(req, res, next) {
// 	// instruct browser to revalidate in 60 seconds
// 	res.header('Cache-Control', 'max-age=432000');
// 	next();
// }

 
// // Auth Config
// var USER    = 'Rulle',
// 	PASS    = 'Gardin',
// 	USEAUTH = false;

// var basic = auth.basic({
// 		realm: 'Kake'
// 	}, function(username, password, callback) {
// 		callback(username === USER && password === PASS);
// 	});

// if (USEAUTH) {
// 	app.use(auth.connect(basic));
// }

// /**
//  * **** LOGIN PAGE REDIRECT ****
//  */

// // Define the session secret, TODO: Change this to be a dynamic session secret based on project
// var secret = '8F7921AEB2BEE5C9CD32CF39E720B6B1C2F89542FA9B9827284422E5AF8433E7'

// // Session specs
// var sess = {
// 	name: 'app.sid',
// 	resave: false,
// 	saveUninitialized: true,
// 	secret: secret,
// 	store: new MemoryStore({
// 		checkPeriod: 86400000 // prune expired entries every 24h
// 	})
// }

// app.set('trust proxy', 1)

// // Define the session code
// app.use(session(sess))
// app.use(cookieParser())
// // Declare XHR, for making XMLHttpRequests, required for Angular
// let xhr = new XMLHttpRequest()


// /**
//  * HTTP_GET for ExpressJS
//  * $
//  * @param url 
//  */
// let HttpGet = (url) => {
// 	xhr.open("GET", url, false)
// 	xhr.send(null)
// 	return JSON.parse(xhr.responseText)
// }

// // Password protection of sub pages
// let passwordProtection = (req: any, res, next) => {

// 	let setCookie = new Promise((resolve) => {
// 		let sessionId = req.session.id
// 		var cookie = req.cookies.kakesession

// 		if (cookie === undefined) {
// 			res.cookie('kakesession', req.session.id, { maxAge: cookieTime })
// 		} else {
// 			sessionId = cookie
// 		}
// 		resolve(sessionId)
// 	})

// 	let getLoginState = new Promise((resolve, reject) => {
// 		let sessionId = req.session.id
// 		let host: string = req.get('host')


// 		if(host.indexOf('localhost') === -1)
// 			// expects Protocol to be https, TODO: figure out why req.protocol returns http
// 			resolve(HttpGet('https://' + req.get('host') + '/login/check.php?storeId='+storeId + '&guid=' + sessionId))
// 			// resolve(HttpGet('https://dev.fotex.klean.dk/login/check.php?storeId='+storeId + '&guid=' + req.session.id))
			
// 		else
// 			// Rejects for localhost
// 			reject('localhost')

// 	})

// 	return Promise.all([setCookie, getLoginState]).then((responses: any) => {
// 		let data = responses[1]

// 		try {
// 			if(!responses[0]) {
// 				throw responses[0]
// 			}

// 			// res.status(200).send(responses[0])
// 			// next()
// 			// res.status(200).send(responses)

// 			if(data.has_login && !data.logged_in)
// 				// does the user need to log in?
// 				res.send('<script>window.location.href="/login?redirect=' + urlkey + '&guid='+ responses[0] +'";</script>');
// 			else
// 				// Log in is not required!
// 				next()


// 		} catch(e) {
// 			res.status(503).send(e)
// 		}
		
// 	}).catch((message) => {
// 		console.log('Trying to load locked scope on ' + message)
// 		next()
// 	})
// }


// /**
//  * Typecasting `req` to `any` so it doesn't fail over `session.id`
//  */
// app.get('*', (req: any, res, next) => {

// 		passwordProtection(req, res, next)

// })


// // Serve static files
// app.use('/assets', cacheControl, express.static('source/assets', {maxAge: 432000}));
// app.use('/', express.static('dist', {index: false}));


// ROUTES.forEach((route: string) => {
// 	app.get(route, (req: Request, res: Response) => {
// 		console.time(`GET: ${req.originalUrl}`);
// 		res.render('../dist/index', {
// 			req: req,
// 			res: res
// 		});
// 		console.timeEnd(`GET: ${req.originalUrl}`);
// 	});
// });

// app.listen(port, () => {
// 	console.log(`Listening at ${baseUrl}`);
// });
