<?php

/*
|--------------------------------------------------------------------------
| Application Routes
|--------------------------------------------------------------------------
|
| Here is where you can register all of the routes for an application.
| It's a breeze. Simply tell Laravel the URIs it should respond to
| and give it the Closure to execute when that URI is requested.
|
*/
/*
 * User Routes
*/

Route::get("create", "AccountController@createAccountView");

Route::post("create", "AccountController@createAccountSubmit");

Route::get("login", "AccountController@loginView");

Route::post("login", "AccountController@loginSubmit");

Route::get("login-desktop", "AccountController@loginDesktopView");

Route::get("refreshed-token-desktop", "AccountController@getRefreshedTokenForDesktop");

Route::get("account/dashboard", "AccountController@dashboard");

Route::get("account/update-gateway", "GatewayRequestUpdateController@updateGateway");

Route::get("callback-url", "AccountController@oauthCallback");

Route::get("logout", "AccountController@logout");

Route::post("api-login", "AccountController@apiLoginSubmit");

Route::get("forgot-password", "AccountController@forgotPassword");

Route::get("reset-password", "AccountController@resetPassword");

Route::post("reset-password", "AccountController@resetPasswordSubmit");

Route::post("forgot-password", "AccountController@forgotPasswordSubmit");

Route::get("confirm-user-registration", "AccountController@confirmAccountCreation");

Route::post("confirm-user-registration", "AccountController@confirmAccountCreation");

Route::get("setUserTimezone", function () {
    Session::set("user_timezone", Input::get("timezone"));
});

Route::get("allocation-request", "AccountController@allocationRequestView");

Route::post("allocation-request", "AccountController@allocationRequestSubmit");

Route::get("account/settings", "UserSettingsController@getUserSettings");
Route::get("account/credential-store", "UserSettingsController@getCredentialStore");
Route::post("account/set-default-credential", "UserSettingsController@setDefaultCredential");
Route::post("account/add-credential", "UserSettingsController@addCredential");
Route::post("account/delete-credential", "UserSettingsController@deleteCredential");

Route::get("account/user-compute-resources", "UserSettingsController@getComputeResources");
Route::post("account/add-user-crp", "UserSettingsController@addUserComputeResourcePreference");
Route::post("account/update-user-crp", "UserSettingsController@updateUserComputeResourcePreference");
Route::post("account/delete-user-crp", "UserSettingsController@deleteUserComputeResourcePreference");

Route::get("account/user-storage-resources", "UserSettingsController@getStorageResources");
Route::post("account/add-user-srp", "UserSettingsController@addUserStorageResourcePreference");
Route::post("account/update-user-srp", "UserSettingsController@updateUserStorageResourcePreference");
Route::post("account/delete-user-srp", "UserSettingsController@deleteUserStorageResourcePreference");

Route::get("account/user-profile", "UserSettingsController@getUserProfile");
Route::post("account/user-profile", "UserSettingsController@updateUserProfile");
Route::get("account/user-profile-update-email", "UserSettingsController@showUpdateEmailView");
Route::post("account/user-profile-update-email", "UserSettingsController@submitUpdateEmail");
Route::get("user-profile-confirm-email", "UserSettingsController@confirmUpdateEmail");

/*
 * The following routes will not work without logging in.
 *
*/

/*
 * Project Routes
*/

Route::get("project/create", "ProjectController@createView");

Route::post("project/create", "ProjectController@createSubmit");

Route::get("project/summary", "ProjectController@summary");

Route::get("project/edit", "ProjectController@editView");

Route::post("project/edit", "ProjectController@editSubmit");

Route::get("project/browse", "ProjectController@browseView");

Route::post("project/browse", "ProjectController@browseView");

Route::get("project/shared-users", "ProjectController@sharedUsers");

Route::get("project/unshared-users", "ProjectController@unsharedUsers");

Route::get("project/all-users", "ProjectController@allUsers");

/*
 * Experiment Routes
*/

Route::get("experiment/create", "ExperimentController@createView");

Route::post("experiment/create", "ExperimentController@createSubmit");

Route::get("experiment/summary", "ExperimentController@summary");

Route::post("experiment/summary", "ExperimentController@expChange");

Route::post("experiment/clone", "ExperimentController@cloneExperiment");

Route::get("experiment/edit", "ExperimentController@editView");

Route::post("experiment/edit", "ExperimentController@editSubmit");

Route::get("experiment/getQueueView", "ExperimentController@getQueueView");

Route::get("experiment/browse", "ExperimentController@browseView");

Route::post("experiment/browse", "ExperimentController@browseView");

Route::get("experiment/shared-users", "ExperimentController@sharedUsers");

Route::get("experiment/unshared-users", "ExperimentController@unsharedUsers");
Route::post("experiment/update-sharing", "ExperimentController@updateSharing");

Route::get("download", function(){
    if(Input::has("path") && (0 == strpos(Input::get("path"), Session::get('username'))
            || 0 == strpos(Input::get("path"), "/" . Session::get('username')))){
        $path = Input::get("path");

        if (strpos($path, '/../') !== false || strpos($path, '/..') !== false || strpos($path, '../') !== false)
            return null;

        if(0 === strpos($path, '/')){
            $path = substr($path, 1);
        }
        $downloadLink = Config::get('pga_config.airavata')['experiment-data-absolute-path'] . '/' . $path;
        return Response::download( $downloadLink);
    }else if(Input::has("id") && (0 == strpos(Input::get("id"), "airavata-dp"))){
        $id = Input::get("id");

        $dataRoot = Config::get("pga_config.airavata")["experiment-data-absolute-path"];
        if(!((($temp = strlen($dataRoot) - strlen("/")) >= 0 && strpos($dataRoot, "/", $temp) !== false)))
            $dataRoot = $dataRoot . "/";

        $dataProductModel = Airavata::getDataProduct(Session::get('authz-token'), $id);
        $currentOutputPath = "";
        foreach ($dataProductModel->replicaLocations as $rp) {
            if($rp->replicaLocationCategory == Airavata\Model\Data\Replica\ReplicaLocationCategory::GATEWAY_DATA_STORE){
                $currentOutputPath = $rp->filePath;
                break;
            }
        }

        //TODO check permission
        $path = str_replace($dataRoot, "", parse_url($currentOutputPath, PHP_URL_PATH));
        $downloadLink = parse_url(URL::to('/') . Config::get('pga_config.airavata')['experiment-data-absolute-path'] . '/' . $path, PHP_URL_PATH);
        return Response::download( $downloadLink);
    }
});

Route::get("files/browse", "FilemanagerController@browse");

Route::get("files/get","FilemanagerController@get");

/*
 * Group Routes
 */
Route::get("group/create", "GroupController@createView");

Route::post("group/create", "GroupController@createSubmit");

Route::get("group/view", "GroupController@viewView");

Route::post("group/edit", "GroupController@editSubmit");

/*
 * Compute Resources Routes
*/

Route::get("cr/create", function () {
    return Redirect::to("cr/create/step1");
});

Route::get("cr/create", "ComputeResourceController@createView");

Route::post("cr/create", "ComputeResourceController@createSubmit");

Route::get("cr/edit", "ComputeResourceController@editView");

Route::post("cr/edit", "ComputeResourceController@editSubmit");

Route::get("cr/view", "ComputeResourceController@viewView");

Route::get("cr/browse", "ComputeResourceController@browseView");

Route::post("cr/delete-jsi", "ComputeResourceController@deleteActions");

Route::post("cr/delete-dmi", "ComputeResourceController@deleteActions");

Route::post("cr/delete-cr", "ComputeResourceController@deleteActions");

/*
 * Data Storage Resources Routes
*/

Route::get("sr/create", function () {
    return Redirect::to("sr/create/step1");
});

Route::get("sr/create", "StorageResourceController@createView");

Route::post("sr/create", "StorageResourceController@createSubmit");

Route::get("sr/edit", "StorageResourceController@editView");

Route::post("sr/edit", "StorageResourceController@editSubmit");

Route::get("sr/view", "StorageResourceController@srView");

Route::get("sr/browse", "StorageResourceController@browseView");

Route::post("sr/delete-jsi", "StorageResourceController@deleteActions");

Route::post("sr/delete-dmi", "StorageResourceController@deleteActions");

Route::post("sr/delete-sr", "StorageResourceController@deleteActions");

/*
 * Application Catalog Routes
*/

Route::get("app/module", "ApplicationController@showAppModuleView");

Route::post("app/module-create", "ApplicationController@modifyAppModuleSubmit");

Route::post("app/module-edit", "ApplicationController@modifyAppModuleSubmit");

Route::post("app/module-delete", "ApplicationController@deleteAppModule");

Route::get("app/interface", "ApplicationController@showAppInterfaceView");

Route::post("app/interface-create", "ApplicationController@createAppInterfaceSubmit");

Route::post("app/interface-clone", "ApplicationController@cloneAppInterfaceSubmit");

Route::post("app/interface-edit", "ApplicationController@editAppInterfaceSubmit");

Route::post("app/interface-delete", "ApplicationController@deleteAppInterface");

Route::get("app/deployment", "ApplicationController@showAppDeploymentView");

Route::post("app/deployment-create", "ApplicationController@createAppDeploymentSubmit");

Route::post("app/deployment-edit", "ApplicationController@editAppDeploymentSubmit");

Route::post("app/deployment-delete", "ApplicationController@deleteAppDeployment");

Route::get("gp/create", "GatewayprofileController@createView");

Route::post("gp/create", "GatewayprofileController@createSubmit");

Route::post("gp/edit", "GatewayprofileController@editGP");

Route::get("gp/browse", "GatewayprofileController@browseView");

Route::post("gp/delete-gp", "GatewayprofileController@delete");

Route::post("gp/remove-cr", "GatewayprofileController@delete");

Route::post("gp/add-crp", "GatewayprofileController@modifyCRP");

Route::post("gp/update-crp", "GatewayprofileController@modifyCRP");

Route::post("gp/add-srp", "GatewayprofileController@modifySRP");

Route::post("gp/update-srp", "GatewayprofileController@modifySRP");

Route::post("gp/update-idp", "GatewayprofileController@modifyIDP");

Route::post("gp/remove-sr", "GatewayprofileController@delete");

Route::post("gp/credential-store-token-change", "GatewayprofileController@cstChange");


//DataCat
Route::get("datacat/select", "DataCatController@select");
Route::get("datacat/summary", "DataCatController@summary");


//Management Dashboard
//Added to reroute the admin page to the new django portal
if(  Config::get('pga_config.portal')['super-admin-portal'] == false and  Config::get('pga_config.portal')['reroute-to-django'] == true){
  Route::get("admin/dashboard", "AdminController@reRoute");
}
else{
  Route::get("admin/dashboard", "AdminController@dashboard");
}

Route::get("admin/dashboard/gateway", "AdminController@gatewayView");

Route::get("admin/dashboard/users", "AdminController@usersView");

Route::post("admin/dashboard/users", "AdminController@searchUsersView");

Route::get("admin/dashboard/roles", "AdminController@rolesView");

Route::get("admin/dashboard/experiments", "AdminController@experimentsView");

Route::get("admin/dashboard/experimentsOfTimeRange", "AdminController@getExperimentsOfTimeRange");

Route::get("admin/dashboard/experimentStatistics", "AdminController@experimentStatistics");

Route::get("admin/dashboard/resources", "AdminController@resourcesView");

Route::get("admin/dashboard/experiment/summary", function () {
    return Redirect::to("experiment/summary?expId=" . urlencode($_GET["expId"]) . "&dashboard=true");
});

Route::get("admin/dashboard/credential-store", "AdminController@credentialStoreView");

Route::get("manage/users", "AdminController@usersView");

Route::post("admin/adduser", "AdminController@addAdminSubmit");

Route::get("admin/getusercountinrole", "AdminController@getUserCountInRole");

Route::post("admin/addgatewayadmin", "AdminController@addGatewayAdminSubmit");

Route::post("admin/add-role", "AdminController@addRole");

Route::post("admin/check-roles", "AdminController@getRoles");

Route::post("admin/delete-role", "AdminController@deleteRole");

Route::post("admin/enable-cr", "AdminController@enableComputeResource");

Route::post("admin/disable-cr", "AdminController@disableComputeResource");

Route::post("admin/enable-sr", "AdminController@enableStorageResource");

Route::post("admin/disable-sr", "AdminController@disableStorageResource");

Route::post("admin/add-roles-to-user", "AdminController@addRolesToUser");

Route::post("admin/remove-role-from-user", "AdminController@removeRoleFromUser");

Route::post("admin/create-ssh-token", "AdminController@createSSH");

Route::post("admin/remove-ssh-token", "AdminController@removeSSH");

Route::post("admin/create-pwd-token", "AdminController@createPWD");

Route::post("admin/remove-pwd-token", "AdminController@removePWD");

//GatewayProviders
Route::get("provider/request-gateway", "AdminController@checkRequest");
Route::get("provider/add-gateway", "AdminController@requestGateway");
Route::get("provider/update-details", "GatewayRequestUpdateController@updateDetails");
//notices
Route::get("admin/dashboard/notices", "AdminController@noticesView");

Route::post("add-notice", "AdminController@addNotice");

Route::post("update-notice", "AdminController@updateNotice");

Route::post("delete-notice", "AdminController@deleteNotice");

Route::post("notice-seen-ack", "AccountController@noticeSeenAck");

//Super Admin Specific calls

Route::get("admin/add-gateway", "AdminController@createGateway");
Route::get("admin/add-new-gateway", "AdminController@addGateway");

Route::get("admin/update-gateway-request", "AdminController@updateGateway");

/*
* Theme Pages Routes
*/
Route::get( "pages/{theme_view}", function( $theme_view){

	//In some cases, theme doesn't get loaded in session, so doing that here
	//as well incase it does not.
	if(! Session::has("theme")){
		Session::put("theme", Config::get('pga_config.portal')['theme']);
	}
    return View::make("pages", array("page" => $theme_view) );
});

//Airavata Server Check
Route::get("airavata/down", function () {
    return View::make("server-down");
});

/*
 * Test Routes.
*/

Route::get("testjob", function () {
    return Markdown::render( View::make('edit-mode'));
});

/*handling errors on production */
App::missing(function($exception)
{
    return Response::view('error', array(), 404);
});

/*
 * Following base Routes need to be at the bottom.
*/
Route::controller("home", "HomeController");

Route::controller("/", "HomeController");
