<?php

	// Purpose:
	//    This is the main file processing all http requests
	use \Psr\Http\Message\ServerRequestInterface as Request;
	use \Psr\Http\Message\ResponseInterface as Response;
	define('_ATT_ROOT_', realpath($_SERVER["DOCUMENT_ROOT"]));
	define('_APP_ROOT_', realpath($_SERVER["DOCUMENT_ROOT"]));
	
	require 'vendor/autoload.php';
	require_once _ATT_ROOT_ . "/middleware/AuthenticationMiddleware.php";
	
	$app = new \Slim\App([
		'settings' => [
		    'addContentLengthHeader' => false
		],
	]);
	
	session_start();
	Logger::configure(_ATT_ROOT_ . "/LogConfig.xml");

	// Get container
	$container = $app->getContainer();
	
	// Register component on container
	$container['view'] = function ($container) {
		return new \Slim\Views\PhpRenderer(_ATT_ROOT_ . "/pages/");
	};	
	
	/*// Purpose(/):
	//    Processes the get page request. Based on the user session unauthenticated or authenticated landing page is rendered
	$app->get('/', function (Request $request, Response $response) use($app) {
		$filename;	
		$userInformation = new \stdClass;
		if (isset($_SESSION['user'])) { // Determine auth Vs Unauth based on User session
			$filename = "index_auth.php";
			require_once _ATT_ROOT_ . "/core/UsersCore.php";
			
			$userId	= $_SESSION['user']->user_id;
			$companyId = $_SESSION['user']->company_id;
			$userCore =	new UsersCore();
			$userInformation = $userCore->getGeneralInfo($userId, $companyId);
		} else {
			$filename = "unauth/index_landing.php";
		}	
		require_once _ATT_ROOT_ . "/core/ConstantsCore.php";
		$constCore = new ConstantsCore();
		$messages = $constCore->getConstants("en_us");

		$this->view->render($response, $filename, ["messages" => $messages, "userInformation" => $userInformation]);
	});*/
	
	// Purpose(/commingsoon):
	//    Processes the get page request. To render the login page
	$app->get('/commingsoon', function (Request $request, Response $response) use($app) {
		
		$filename = "common/commingSoon.php";
		$this->view->render($response, $filename);
	});
	
	// Purpose(/login):
	//    Processes the get page request. To render the login page
	$app->get('/login', function (Request $request, Response $response) use($app) {
		
		//$filename = "unauth/login.php";
		//$filename = "unauth/loginScreen.php";
		$filename = "unauth/loginPage.php";
		$this->view->render($response, $filename);
	});
	
	/*// Purpose(/jobs[/{jobid}]):
	//    
	$app->get('/jobs[/{jobid}]', function(Request $request, Response $response, $args) {
		if (empty($args['jobid'])) {
				$filename = "common/error.php";
				$this->view->render($response, $filename);
			}
			$filename = "unauth/publicOpportunity.php";
			$this->view->render($response, $filename, [
				'jobId' => $args['jobid']
			]);
	});
	*/
	// Purpose(/signup):
	//    Processes the get page request. To render the signup page
	$app->get('/signup', function (Request $request, Response $response) use($app) {
		
		//$filename = "unauth/login.php";
		//$filename = "unauth/signupScreen.php";
		$filename = "unauth/signupPage.php";
		$this->view->render($response, $filename);
	});
	
	// Purpose(/requestfreedemo):
	//    Processes the get page request. To render the signup page
	$app->get('/requestfreedemo', function (Request $request, Response $response) use($app) {
		
		$filename = "unauth/requestFreeDemo.php";
		$this->view->render($response, $filename);
	});
	
	// Purpose(/contactus):
	//    Processes the get page request. To render the signup page
	$app->get('/contactus', function (Request $request, Response $response) use($app) {
		
		$filename = "unauth/contactUs.php";
		$this->view->render($response, $filename);
	});
	
	// Purpose(/aboutus):
	//    Processes the get page request. To render the signup page
	$app->get('/aboutus', function (Request $request, Response $response) use($app) {
		
		$filename = "unauth/aboutUs.php";
		$this->view->render($response, $filename);
	});
	
	// Purpose(/pricing):
	//    Processes the get page request. To render the signup page
	$app->get('/pricing', function (Request $request, Response $response) use($app) {
		
		$filename = "unauth/pricing.php";
		$this->view->render($response, $filename);
	});
	
	// Purpose(/features):
	//    Processes the get page request. To render the signup page
	$app->get('/features', function (Request $request, Response $response) use($app) {
		
		$filename = "unauth/newfeatures.php";
		$this->view->render($response, $filename);
	});
	
	// Purpose(/comparision):
	//    Processes the get page request. To render the signup page
	$app->get('/comparision', function (Request $request, Response $response) use($app) {
		
		$filename = "unauth/comparision.php";
		$this->view->render($response, $filename);
	});
	
	// Purpose(/error):
	//    Processes the get page request. To render the login page
	$app->get('/error', function (Request $request, Response $response) use($app) {
		
		$filename = "unauth/error.php";
		$this->view->render($response, $filename);
	});
	
	// Purpose(/pages/features):
	//    Processes the get page request. To render the features page
	$app->get('/pages/features[/{feature}]', function (Request $request, Response $response) use($app) {
		
		$filename = "unauth/features.php";
		$module = "";
		$userInformation = new \stdClass;
		$viewFeature = "jobsearch";
		if (isset($args['feature'])) {
			$viewFeature = $args['feature'];
		}
		
		require_once _ATT_ROOT_ . "/core/ConstantsCore.php";
		$constCore = new ConstantsCore();
		$messages = $constCore->getConstants("en_us");

		$this->view->render($response, $filename, ["messages" => $messages, "userInformation" => $userInformation, "mainMenu" => $module]);
		
	});
	
	// Purpose(/features):
	//
	$app->get('/attfeatures', function (Request $request, Response $response) use($app) {
		
		$filename = "unauth/features.php";
		$this->view->render($response, $filename);
	});
	
	$app->get('/bundle/scripts/{bundleName}', function($request, $response, $args) use($app) {
		
		$qParam = $request->getQueryParam("q", "");
		$bundleName = $args['bundleName'];
		require_once _ATT_ROOT_ . "/core/configuration/ConfigurationManager.php";
		$config = Attainica\Core\Configuration\ConfigurationManager::getConfiguration();

        $bundle = new \Gvs\ScriptBundle((object) array(
	        "RootFolder" => _ATT_ROOT_,
	        "GenerateHeader" => false,
	        "AutoMinify" => $config->getAutoMinifySetting()
        ));
        $content = $bundle->generateBundledScript($qParam, false);
        
        $memoryFile = fopen('php://memory','rb+');
		fwrite($memoryFile, $content);
		rewind($memoryFile);

        $stream = new \Slim\Http\Stream($memoryFile);
        
        return $response
        	   ->withHeader( 'Content-type', 'application/javascript' )
        	   ->withBody($stream);
        
        
	});

	require_once _ATT_ROOT_ . "/routes/commonUtilities.php";
	
	$app->get('/api/constants[/{locale}]', function($request, $response, $args) use($app) {
		require_once _ATT_ROOT_ . "/core/ConstantsCore.php";
		$constCore = new ConstantsCore();
		$locale = null;
		if (!isset($args['locale'])) {
			$locale = "en_us";
		} else {
			$locale = $args['locale'];
		}
		
		$result = (object) array(
			"Status" => true,
			"Data" => $constCore->getConstants($locale)
		);
		
		handleResponse($request, $response, $result);
	});
	
	// API route for users
	$app->group('/api/users', function() use($app) {
		require_once _ATT_ROOT_ . "/routes/Users.php";
	});
	
	// API route for contacts
	$app->group('/api/contacts', function() use($app) {
		require_once _ATT_ROOT_ . "/routes/Contacts.php";
	});	
	
	// API route for expensetypes
	$app->group('/api/expensetypes', function() use($app) {
		require_once _ATT_ROOT_ . "/routes/ExpenseTypes.php";
	});
	
	// API route for certificates
	$app->group('/api/certificates', function() use($app) {
		require_once _ATT_ROOT_ . "/routes/Certificates.php";
	});
	
	// API route for clients
	$app->group('/api/clients', function() use($app) {
		require_once _ATT_ROOT_ . "/routes/Clients.php";
	});
	
	// API route for partners
	$app->group('/api/partners', function() use($app) {
		require_once _ATT_ROOT_ . "/routes/Partners.php";
	});
	
	// API route for calendar
	$app->group('/api/calendar', function() use($app) {
		require_once _ATT_ROOT_ . "/routes/Calendar.php";
	});
	
	// API route for employees
	$app->group('/api/employees', function() use($app) {
		require_once _ATT_ROOT_ . "/routes/Employees.php";
	});
	
	// API route for employee timesheets
	$app->group('/api/timesheets', function() use($app) {
		require_once _ATT_ROOT_ . "/routes/Timesheets.php";
	});
	
	// API route for employee reimbursements
	$app->group('/api/reimbursements', function() use($app) {
		require_once _ATT_ROOT_ . "/routes/Reimbursements.php";
	}); 
	
	// API route for employee payrolls
	$app->group('/api/payrolls', function() use($app) {
		require_once _ATT_ROOT_ . "/routes/Payrolls.php";
	});
	
	// API route for invoices
	$app->group('/api/invoices', function() use($app) {
		require_once _ATT_ROOT_ . "/routes/Invoices.php";
	});
	
	// API route for bills
	$app->group('/api/bills', function() use($app) {
		require_once _ATT_ROOT_ . "/routes/Bills.php";
	});

	// Purpose(/epages):
	//    Processes the get page request. For loggen out pages
	$app->group('/epages', function() use($app) {
		require_once _ATT_ROOT_ . "/routes/Epages.php";
	});
	
	// Purpose(/ereview):
	//    Processes the get page request. 
	//$app->group('/ereview', function() use($app) {
	//	require_once _ATT_ROOT_ . "/routes/Epages.php";
	//});
	
	// API route for mailinglist
	$app->group('/api/mailinglist', function() use($app) {
		require_once _ATT_ROOT_ . "/routes/MailingList.php";
	});
	
	// API route for consultants
	$app->group('/api/consultants', function() use($app) {
		require_once _ATT_ROOT_ . "/routes/Consultants.php";
	});
	
	// API route for opportunities
	$app->group('/api/opportunities', function() use($app) {
		require_once _ATT_ROOT_ . "/routes/Opportunities.php";
	});
	
	// API route for receipts
	$app->group('/api/receipts', function() use($app) {
		require_once _ATT_ROOT_ . "/routes/Receipts.php";
	});
	
	// API route for payments
	$app->group('/api/payments', function() use($app) {
		require_once _ATT_ROOT_ . "/routes/Payments.php";
	});
	
	// API route for notifications
	$app->group('/api/notifications', function() use($app) {
		require_once _ATT_ROOT_ . "/routes/Notifications.php";
	});

	// API route for experiments
	$app->group('/experiments', function() use($app) {
		require_once _ATT_ROOT_ . "/routes/Experiments.php";
	});

	// API route for window popups
	$app->group('/popup', function() use($app) {
		require_once _ATT_ROOT_ . "/routes/PopupTemplets.php";
    });

	// API route for placements
	$app->group('/api/placements', function() use($app) {
		require_once _ATT_ROOT_ . "/routes/Placements.php";
	});
	
	// API route for marketingmails
	$app->group('/api/marketingmails', function() use($app) {
		require_once _ATT_ROOT_ . "/routes/MarketingMails.php";
	});
	
	// API route for dashboard
	$app->group('/api/dashboard', function() use($app) {
		require_once _ATT_ROOT_ . "/routes/Dashboard.php";
	});
	
	// API route for settings
	$app->group('/api/settings', function() use($app) {
		require_once _ATT_ROOT_ . "/routes/Settings.php";
	});
	
	// API route for company
	$app->group('/api/registration', function() use($app) {
		require_once _ATT_ROOT_ . "/routes/Registration.php";
	});
	
	// API route for company module
	$app->group('/api/company', function() use($app) {
		require_once _ATT_ROOT_ . "/routes/Company.php";
	});
	
	// API route for reports
	$app->group('/api/oldreports', function() use($app) {
		require_once _ATT_ROOT_ . "/routes/Reports.php";
	});	
	
	// API route for my documents
	$app->group('/api/mydocuments', function() use($app) {
		require_once _ATT_ROOT_ . "/routes/MyDocuments.php";
	});
	
	// API route for A-documents
	$app->group('/api/adocuments', function() use($app) {
		require_once _ATT_ROOT_ . "/routes/ADocuments.php";
	});
	
	// API route for Submission Tracking
	$app->group('/api/submissiontrack', function() use($app) {
		require_once _ATT_ROOT_ . "/routes/SubmissionTracking.php";
	});
	
	// API route for Submission Tracking
	$app->group('/api/jobseeker', function() use($app) {
		require_once _ATT_ROOT_ . "/routes/JobSeeker.php";
	});
	
	// API route for Add jobseeker
	$app->group('/api/addjobseeker', function() use($app) {
		require_once _ATT_ROOT_ . "/routes/AddJobSeeker.php";
	});
	
	// API route for bounce emails
	$app->group('/api/bouncemail', function() use($app) {
		require_once _ATT_ROOT_ . "/routes/BounceEmail.php";
	});
	
	// API route for unsubscribe emails
	$app->group('/api/unsubscribe', function() use($app) {
		require_once _ATT_ROOT_ . "/routes/UnsubscribeEmail.php";
	});
	
	$app->group('/api/hrhireworkflow', function() use($app) {
		require_once _ATT_ROOT_ . "/routes/HRHireWorkflow.php";
	});
	
	// API route for common apis
	$app->group('/api/common', function() use($app) {
		require_once _ATT_ROOT_ . "/routes/CommonRoutes.php";
	});
	
	// API route for Document Type apis
	$app->group('/api/documenttypes', function() use($app) {
		require_once _ATT_ROOT_ . "/routes/DocumentTypes.php";
	});
	
	// API route for Billing Dashboard apis
	$app->group('/api/billing', function() use($app) {
		require_once _ATT_ROOT_ . "/routes/BillingDashboard.php";
	});
	
	// API route for ChatBot apis
	$app->group('/api/chatbot', function() use($app) {
		require_once _ATT_ROOT_ . "/routes/ChatBot.php";
	});
	
	$app->get('/api/baseurl', function($request, $response) use($app) {
		if (!empty($_SERVER['HTTP_X_FORWARDED_PROTO'])) {
	        $protocol = $_SERVER['HTTP_X_FORWARDED_PROTO'].'://';
	    } else {
	        $protocol = !empty($_SERVER['HTTPS']) ? "https://" : "http://";
	    }
		$domainName = $_SERVER['HTTP_HOST'].'/';
		$result = (object) array("Status" => true, "BaseUrl" => $protocol.$domainName);
		
		handleResponse($request, $response, $result);
	});
	
	// Purpose(/termsandconditions):
	//
	$app->get('/termsandconditions', function (Request $request, Response $response) use($app) {
		
		//$filename = "common/termsandconditions.php";
		$filename = "unauth/new-tos.php";
		$this->view->render($response, $filename);
	});
	
	// Purpose(/privacypolicy):
	//
	$app->get('/privacypolicy', function (Request $request, Response $response) use($app) {
		
		$filename = "common/privacypolicy.php";
		//$filename = "auth/privacypolicy.php";
		$this->view->render($response, $filename);
	});
	
	// Purpose(/cb):
	//
	$app->group('/cb', function() use($app) {
		
		/// Purpose(/opportunities):
		///    
		$app->get('/opportunities', function($request, $response, $args) use($app) {
			
			$TId = '';
			$REMail = '';
			if (isset($_GET['q'])) {
				$filename = "unauth/chatbot/opportunities.php";
				$this->view->render($response, $filename, [
						'q' => $_GET['q']
				]);
			} else {
				$this->view->render($response, "common/error.php");
			}
		});
		
		/// Purpose(/consultants):
		///    
		$app->get('/consultants', function($request, $response, $args) use($app) {
			
			$TId = '';
			$REMail = '';
			if (isset($_GET['q'])) {
				$filename = "unauth/chatbot/consultants.php";
				$this->view->render($response, $filename, [
						'q' => $_GET['q']
				]);
			} else {
				$this->view->render($response, "common/error.php");
			}
		});
	});
	
	// Purpose(/{code}):
	//    Processes the get page request. Based on the user session unauthenticated or authenticated landing page is rendered
	$app->get('[/{code:.*}]', function (Request $request, Response $response, $args) use($app) {

		$module = $args['code'];
		$availableModules = ["home", "accounting", "masterlist", "marketing", "employees", "adocs"];
		$checkForApi = explode("/", $module);
		
		if ("api" == $checkForApi[0]) {
			$filename = "common/error.php";
			$this->view->render($response, $filename);
		} else if ("jobs" == $checkForApi[0]) {
			if (empty($checkForApi[1])) {
				$filename = "common/error.php";
				$this->view->render($response, $filename);
			}
			$filename = "unauth/publicOpportunity.php";
			$this->view->render($response, $filename, [
				'jobId' => $checkForApi[1]
			]);
		} else {
			if(in_array($module, $availableModules) || $module == "") {
				if(empty($module)) {
					$module = "home";
				}
		
				$userInformation = new \stdClass;
		
				if (isset($_SESSION['user'])) { // Determine auth Vs Unauth based on User session
					$filename = "/index_auth.php";
					require_once _ATT_ROOT_ . "/core/UsersCore.php";
					
					$userId	= $_SESSION['user']->user_id;
					$companyId = $_SESSION['user']->company_id;
					$userCore =	new UsersCore();
					$userInformation = $userCore->getGeneralInfo($userId, $companyId);
				} else {
					//$filename = "unauth/index_landing.php";
					$filename = "unauth/landing_screen.php";
				}	
		
				require_once _ATT_ROOT_ . "/core/ConstantsCore.php";
				$constCore = new ConstantsCore();
				$messages = $constCore->getConstants("en_us");
		
				$this->view->render($response, $filename, ["messages" => $messages, "userInformation" => $userInformation, "mainMenu" => $module]);
				
			} else {
				$filename = "common/error.php";
				$this->view->render($response, $filename);
			}
		}
	});
	
	// AuthenticationMiddleware for authenticate the requests before app runs
	//$app->add(new AuthenticationMiddleware());
	$app->add("AuthenticationMiddleware");
	
	$app->run();
