import { 
	WebServer, 
	UploadDetails
} from './webserver';

import {
	Router
} from './router';

import {
	KeyValuePairs
} from './keyvaluepairs';

import * as process from 'process';


import { 
	ServerResponse
} from 'http';

import {
	inspect
} from 'util';

class WebPageProcess
{
	private _hostname: string = process.env["SERVER_IP_ADDRESS"] || '127.0.0.1';	// In local computer
	private _port: number = 1339;

	private _products: {name:string, description:string, price:number}[] = [];
		
	Start(): void
	{
		let router: Router = new Router();
		let server: WebServer = new WebServer(this._hostname, this._port, router, "./clientside/html");

		router.AddRoute('/products', 'GET', 'productmanagement');		
		
		// REST HTTP Methods
		// 1. GET => READ  => URI (What you are selecting)
		// 2. POST => ADD => URI (What you are selecting)+BODY(Data)
		// 3. PUT => EDIT => URI (What you are selecting)+BODY(Data)
		// 4. DELETE => DELETE => URI (What you are selecting)
		router.AddRoute('/products/add', 'POST', 
						(url: string, response: ServerResponse, 
						data: KeyValuePairs):boolean => {
							
			let productIndex: number;
			let result: { done: boolean, productid: number };
			
			response.writeHead(200, { 'content-type': 'application/json' });
			
			this._products.push(
			{
				name: data.name,
				description: data.description,
				price: data.price
			});
			productIndex = this._products.length - 1; // Added to end of array
			
			result = { done: true, productid: productIndex };
			response.write(JSON.stringify(result));
			return true;
		});
		
		
		router.AddRoute('/products/read', 'GET', 
			(url: string, response: ServerResponse, 
			data: KeyValuePairs):boolean => {

			response.writeHead(200, { 'content-type': 'application/json' });
			
			response.write(JSON.stringify(this._products.filter(s => typeof s != "undefined")));
			return true;
		});
		
		router.AddRoute('/products/read/$productid:int', 'GET', 
			(url: string, response: ServerResponse, 
			data: KeyValuePairs):boolean => {
				
			response.writeHead(200, { 'content-type': 'application/json' });
			
			if(typeof this._products[data.productid] != "undefined")
				response.write(JSON.stringify({done:true, product:this._products[data.productid]}));
			else
				response.write(JSON.stringify({done:false}));
			return true;
		});		
		
		router.AddRoute('/products/put/$productid:int', 'PUT', 
				(url: string, response: ServerResponse, 
				data: KeyValuePairs):boolean => {
		
			let result: { done: boolean, productid: number };
			
			response.writeHead(200, { 'content-type': 'application/json' });
			
			this._products[data.productid] = {
				name: data.name,
				description: data.description,
				price: data.price
			};
						
			result = { done: true, productid: data.productid };
			response.write(JSON.stringify(result));
			return true;
		});
		
		router.AddRoute('/products/delete/$productid:int', 'DELETE', 
				(url: string, response: ServerResponse, 
				data: KeyValuePairs):boolean => {
		
			let result: { done: boolean, productid: number };
			
			response.writeHead(200, { 'content-type': 'application/json' });
			
			delete this._products[data.productid];
			
			result = { done: true, productid: data.productid };
			response.write(JSON.stringify(result));
			return true;
		});		
					
		server.Listen();
	}
}

(function ()
{
	(new WebPageProcess()).Start();
})();
	



