<?php

class AdminController extends BaseController {

	public function __construct()
	{
		$this->beforeFilter('verifyadmin');
		Session::put("nav-active", "user-console");
	}

	public function reRoute(){
		$data["djangoURL"] = Config::get('pga_config.portal')['airavata-django-url'];
		return View::make("admin/redirect-django", $data);
	}

	public function dashboard(){
        $userInfo = array();
        $data = array();
        $userRoles = Session::get("roles");
        $username = Session::get("username");
        if (Session::has("user-profile")) {
            $userEmail = Session::get("user-profile")->emails[0];
        } else {
            $userEmail = Session::get("iam-user-profile")["email"];
        }
        Session::forget("new-gateway-provider");

        //check for gateway provider users
        if( in_array( "gateway-provider", $userRoles) ) {
            $gatewayOfUser = "";
            Session::put("super-admin", true);
            $gatewaysInfo = AdminUtilities::get_gateways_for_requester( $username );
            Log::info("Gateways: ", $gatewaysInfo);
            Log::info("Username: ", [Session::get("username")]);
            //var_dump( $gatewaysInfo); exit;
            $requestedGateways = array();
            $gatewayApprovalStatuses = AdminUtilities::get_gateway_approval_statuses();

            foreach ($gatewaysInfo as $index => $gateway) {
                $gatewayOfUser = $gateway->gatewayId;
                Session::forget("super-admin");
                Session::put("new-gateway-provider", true);
                Session::put("existing-gateway-provider", true);

                $requestedGateways[ $gateway->airavataInternalGatewayId]["gatewayInfo"] = $gateway;
                $requestedGateways[ $gateway->airavataInternalGatewayId]["approvalStatus"] = $gatewayApprovalStatuses[ $gateway->gatewayApprovalStatus];
                //seeing if admin wants to start managing one of the gateways
                if( Input::has("gatewayId")){
                    if( Input::get("gatewayId") == $gateway->gatewayId)
                    {
                        Session::put("gateway_id", $gateway->gatewayId);
                    }
                }
            }
            $data["requestedGateways"] = $requestedGateways;
            $data["gatewayApprovalStatuses"] = $gatewayApprovalStatuses;
            //to make it accessible to navbar
            Session::put("requestedGateways", $requestedGateways);

            if ($gatewayOfUser == "") {
                $userInfo["username"] = $username;
                $userInfo["email"] = $userEmail;
    			$data["userInfo"] = $userInfo;
    			$data["gatewaysInfo"] = $gatewaysInfo;
                Session::put("new-gateway-provider", true);
            }
        }

		return View::make("account/dashboard", $data);
	}

	public function addAdminSubmit(){
		WSIS::update_user_roles( Input::get("username"), array( "new"=>array("admin"), "deleted"=>array() ) );

   		return View::make("account/admin-dashboard")->with("message", "User has been added to Admin.");
	}

	public function usersView(){
		if( Input::has("role"))
		{
			Session::flash("warning-message", "Please note: the following list "
			. "may not be complete. Only the most recent 100 users have been "
			. "searched for role " . htmlspecialchars(Input::get("role")) . ".");
			$users = IamAdminServicesUtilities::getUsersWithRole(Input::get("role"));
		}
		else
			$users =  Keycloak::listUsers();

		$roles = Keycloak::getAllRoles();
		sort($roles);
		Session::put("admin-nav", "manage-users");
		return View::make("admin/manage-users", array("users" => $users, "roles" => $roles));
	}

	public function getUserCountInRole(){
			$users = IamAdminServicesUtilities::getUsersWithRole(Input::get("role"));
			return count( $users);
	}

	public function searchUsersView(){
		if(Input::has("search_val"))
		{
			$users =  Keycloak::searchUsers(Input::get("search_val"));
		}
		else
			$users = Keycloak::listUsers();

		if(!isset($users) || empty($users)){
			$users = array();
		}
		$roles = Keycloak::getAllRoles();
		sort($roles);
		Session::put("admin-nav", "manage-users");
		return View::make("admin/manage-users", array("users" => $users, "roles" => $roles));
	}

	private function cmp($a, $b)
	{
		return strcmp($b->requestCreationTime, $a->requestCreationTime);
	}

    public function gatewayView(){
    	//only for super admin
		//Session::put("super-admin", true);
		
		$gatewaysInfo = CRUtilities::getAllGatewayProfilesData();
		$gateways = $gatewaysInfo["gateways"];
		usort($gateways, array($this, "cmp"));
		$tokens = AdminUtilities::get_all_ssh_tokens_with_description();
		$pwdTokens = AdminUtilities::get_all_pwd_tokens();
		$srData = SRUtilities::getEditSRData();
		$crData = CRUtilities::getEditCRData();

		$unselectedCRs = array();
		$unselectedSRs = array();

		foreach( (array)$gatewaysInfo["allCRs"] as $crId => $cr){
			if( ! in_array($cr->computeResourceId, $gatewaysInfo["selectedCRs"]) )
			$unselectedCRs[] = $cr;
		}

		foreach( (array)$gatewaysInfo["allSRs"] as $index => $sr){
			if( ! in_array($sr->storageResourceId, $gatewaysInfo["selectedSRs"]) )
			$unselectedSRs[] = $sr;
		}

		//$dsData = CRUtilities::getAllDataStoragePreferences( $gateways);
		$gatewayData = array( 
								"gateways" => $gateways, 
								"computeResources" => $gatewaysInfo["allCRs"],
								"crData" => $crData,
								"storageResources" => $gatewaysInfo["allSRs"],
								"srData" => $srData,
								"tokens" => $tokens,
								"pwdTokens" => $pwdTokens,
								"unselectedCRs" => $unselectedCRs,
								"unselectedSRs" => $unselectedSRs,
								"gatewayApprovalStatuses" => AdminUtilities::get_gateway_approval_statuses()
							);
		$view = "admin/manage-gateway";

        Session::put("admin-nav", "gateway-prefs");
		return View::make( $view, $gatewayData);
    }

	public function addGatewayAdminSubmit(){
		//check if username exists
		if(Keycloak::usernameExists( Input::get("username")) )
		{
            Keycloak::updateUserRoles(Input::get("username"), array( "new"=>array( Config::get('wsis::admin-role-name')), "deleted"=>array() ) );
			return Redirect::to("admin/dashboard/users?role=" . Config::get('wsis::admin-role-name'))->with("Gateway Admin has been added.");
		}
		else
		{
			echo ("username doesn't exist."); exit;
		}
	}

	public function updateGateway(){

        $rules = array(
            "password" => "min:6|max:48|regex:/^.*(?=.*[a-z])(?=.*[A-Z])(?=.*[0-9])(?=.*[@!$#*&]).*$/",
            "confirm_password" => "same:password",
            "email" => "email",
        );
        $messages = array(
            'password.regex' => 'Password needs to contain at least (a) One lower case letter (b) One Upper case letter and (c) One number (d) One of the following special characters - !@#$&*',
        );
        $checkValidation = array();
        $checkValidation["password"] = Input::get("gatewayAdminPassword");
        $checkValidation["confirm_password"] = Input::get("gatewayAdminPasswordConfirm");
        $checkValidation["email"] = Input::get("gatewayAdminEmail");

        $validator = Validator::make( $checkValidation, $rules, $messages);
        if ($validator->fails()) {
            if(Request::ajax()){
                return json_encode(array("errors" => true, "validationMessages" => $validator->messages()));
            } else {
                Session::put("message", "An error has occurred while updating the Gateway: " + $validator->messages());
                return Redirect::back();
            }
        }

	    $gateway = TenantProfileService::getGateway( Session::get('authz-token'), Input::get("internal_gateway_id"));
		$returnVal = AdminUtilities::update_gateway( Input::get("internal_gateway_id"), Input::except("oauthClientId","oauthClientSecret"));
		if( Request::ajax()){
			if( $returnVal == 1) {
                $email = Config::get('pga_config.portal')['admin-emails'];
                EmailUtilities::gatewayUpdateMailToProvider($gateway->emailAddress, Input::get("gateway_id"));
                EmailUtilities::gatewayUpdateMailToAdmin($email, Input::get("gateway_id"));
                if (isset($gatewayData["createTenant"]))
                    Session::put("successMessages", "Tenant has been created successfully!");
                else
                    Session::put("successMessages", "Gateway has been updated successfully!");
                return json_encode(array("errors" => false, "gateway" => AdminUtilities::get_gateway(Input::get("internal_gateway_id"))));
            }
			else {
                return json_encode(array("errors" => true)); // anything other than positive update result
            }
		}
		else{
			if( $returnVal) {
                $email = Config::get('pga_config.portal')['admin-emails'];
                EmailUtilities::gatewayUpdateMailToProvider($gateway->emailAddress, Input::get("gateway_id"));
                EmailUtilities::gatewayUpdateMailToAdmin($email, Input::get("gateway_id"));
                Session::put("message", "Gateway has been updated successfully!");
            }
			else {
                Session::put("message", "An error has occurred while updating your Gateway. Please make sure you've entered all the details correctly. Try again or contact the Admin to report the issue.");
            }

			return Redirect::back();

		}
		//return 1;
	}

	public function rolesView(){
		$roles = Keycloak::getAllRoles();
		sort($roles);
		Session::put("admin-nav", "manage-roles");
		return View::make("admin/manage-roles", array("roles" => $roles));
	}

	public function experimentsView(){
        Session::put("admin-nav", "exp-statistics");

        $applications = AppUtilities::get_all_applications();
        uksort($applications, 'strcasecmp');
        $hostnames = CRUtilities::getAllCRObjects(true);
        uksort($hostnames, 'strcasecmp');
        return View::make("admin/manage-experiments", array("applications" => $applications, "hostnames" => $hostnames));
	}

	public function resourcesView(){
		$data = CRUtilities::getBrowseCRData(false);
		$allCRs = $data["crObjects"];
		return View::make("admin/manage-resources", array("resources" => $allCRs) );
	}

	public function addRole(){
		WSIS::addRole( Input::get("role") );
		return Redirect::to("admin/dashboard/roles")->with( "message", "Role has been added.");
	}

    public function addRolesToUser(){
        $currentRoles = Keycloak::getUserRoles(Input::get("username"));
		if(!is_array($currentRoles))
			$currentRoles = array($currentRoles);
        $roles["new"] = array_diff(Input::all()["roles"], $currentRoles);
        $roles["deleted"] = array_diff($currentRoles, Input::all()["roles"]);

        $index = array_search('Internal/everyone',$roles["new"]);
        if($index !== FALSE){
            unset($roles["new"][$index]);
        }

        $index = array_search('Internal/everyone',$roles["deleted"]);
        if($index !== FALSE){
            unset($roles["deleted"][$index]);
        }

        $username = Input::all()["username"];
        Keycloak::updateUserRoles($username, $roles);
        $newCurrentRoles = Keycloak::getUserRoles($username);
        if(in_array(Config::get("pga_config.wsis")["admin-role-name"], $newCurrentRoles) || in_array(Config::get("pga_config.wsis")["read-only-admin-role-name"], $newCurrentRoles)
                || in_array(Config::get("pga_config.wsis")["user-role-name"], $newCurrentRoles)){
            $userProfile = Keycloak::getUserProfile($username);
            $recipients = array($userProfile["email"]);
            $this->sendAccessGrantedEmailToTheUser(Input::get("username"), $recipients);

            // remove the initial role when the initial role isn't a privileged
            // role and the admin has now assigned the user to a privileged
            // role, unless the admin is trying to add the user back to the
            // initial role
            if (!$this->isInitialRoleOneOfPrivilegedRoles()) {

                $initialRoleName = CommonUtilities::getInitialRoleName();
                if(in_array($initialRoleName, $newCurrentRoles) && !in_array($initialRoleName, $roles["new"])) {
                    $userRoles["new"] = array();
                    $userRoles["deleted"] = $initialRoleName;
                    Keycloak::updateUserRoles( $username, $userRoles);
                } else if(in_array($initialRoleName, $newCurrentRoles) && in_array($initialRoleName, $roles["new"])) {
                    // When initial role added remove all roles except for initial role and Internal/everyone
                    $userRoles["new"] = array();
                    $userRoles["deleted"] = array_diff($newCurrentRoles, array($initialRoleName, "Internal/everyone"));
                    Keycloak::updateUserRoles( $username, $userRoles);
                }
            }
        }
        return Redirect::to("admin/dashboard/roles")->with( "message", "Roles has been added.");
    }

    /*
     * Return true if the initial-role-name is one of the four privileged
     * roles. This is used to figure out whether the initial-role-name is a
     * 'user-pending' kind of role (returns false), or whether the initial role
     * is a privileged role (returns true) and no admin intervention is
     * necessary.
     */
    private function isInitialRoleOneOfPrivilegedRoles() {

        $initialRoleName = CommonUtilities::getInitialRoleName();
        $adminRoleName = Config::get("pga_config.wsis")["admin-role-name"];
        $adminReadOnlyRoleName = Config::get("pga_config.wsis")["read-only-admin-role-name"];
        $userRoleName = Config::get("pga_config.wsis")["user-role-name"];
        $gatewayProviderRoleName = "gateway-provider";
        return in_array($initialRoleName, array($adminRoleName, $adminReadOnlyRoleName, $userRoleName, $gatewayProviderRoleName));
    }

    public function removeRoleFromUser(){
        $roles["deleted"] = array(Input::all()["roleName"]);
        $roles["new"] = array();
        $username = Input::all()["username"];
        Keycloak::updateUserRoles($username, $roles);
        return Redirect::to("admin/dashboard/roles")->with( "message", "Role has been deleted.");
    }

	public function getRoles(){
		$roles = Keycloak::getUserRoles(Input::get("username"));
		sort($roles);
		return json_encode((array)$roles);
	}

	public function deleteRole(){
		WSIS::deleteRole( Input::get("role") );
		return Redirect::to("admin/dashboard/roles")->with( "message", "Role has been deleted.");

	}

	public function credentialStoreView(){
        Session::put("admin-nav", "credential-store");
        $tokens = AdminUtilities::get_all_ssh_tokens_with_description();
		$pwdTokens = AdminUtilities::get_all_pwd_tokens();
        //var_dump( $tokens); exit;
		return View::make("admin/manage-credentials", array("tokens" => $tokens , "pwdTokens" => $pwdTokens) );
	}

	private function sendAccessGrantedEmailToTheUser($username, $recipients){

		$mail = new PHPMailer;

		$mail->isSMTP();
		$mail->SMTPDebug = 3;
		$mail->Host = Config::get('pga_config.portal')['portal-smtp-server-host'];

		$mail->SMTPAuth = true;

		$mail->Username = Config::get('pga_config.portal')['portal-email-username'];
		$mail->Password = Config::get('pga_config.portal')['portal-email-password'];

		$mail->SMTPSecure = "tls";
		$mail->Port = intval(Config::get('pga_config.portal')['portal-smtp-server-port']);

		$mail->From = Config::get('pga_config.portal')['portal-email-username'];
        $gatewayURL = $_SERVER['SERVER_NAME'];
        $portalTitle = Config::get('pga_config.portal')['portal-title'];
        $mail->FromName = "$portalTitle ($gatewayURL)";

		foreach($recipients as $recipient){
			$mail->addAddress($recipient);
		}

		$mail->isHTML(true);

		$mail->Subject = "Your user account (".$username.") privileges changed!";
		$userProfile = Keycloak::getUserProfile($username);
		$wsisConfig = Config::get('pga_config.wsis');
		$tenant = $wsisConfig['tenant-domain'];

		$str = "Please re-login into the portal to use new privileges" ."<br/><br/>";
		$str = $str . "Gateway Portal: " . $_SERVER['SERVER_NAME'] ."<br/>";
		$str = $str . "Tenant: " . $tenant . "<br/>";
		$str = $str . "Username: " . $username ."<br/>";
		$str = $str . "Name: " . $userProfile["firstname"] . " " . $userProfile["lastname"] . "<br/>";
		$str = $str . "Email: " . $userProfile["email"] ;

		$mail->Body = $str;
		$mail->send();
	}

    public function experimentStatistics()
    {
        if (Request::ajax()) {
            $inputs = Input::all();
            $username = Input::get('username');
            $appname = Input::get('appname');
            $hostname = Input::get('hostname');
            $expStatistics = AdminUtilities::get_experiment_execution_statistics(strtotime($inputs['fromTime']) * 1000
                , strtotime($inputs['toTime']) * 1000, $username, $appname, $hostname);
            return View::make("admin/experiment-statistics", array("expStatistics" => $expStatistics,
                      "username" => $username, "appname" => $appname, "hostname" => $hostname));
        }
    }

    public function getExperimentsOfTimeRange()
    {
        if (Request::ajax()) {
            $inputs = Input::all();
            $expContainer = AdminUtilities::get_experiments_of_time_range($inputs);
            $expStates = ExperimentUtilities::getExpStates();
            return View::make("partials/experiment-container", 
            	array(	"expContainer" => $expContainer,
                		"expStates" => $expStates,
                		"dashboard" => true
                	));
        }
    }

	public function createSSH(){
        $description = Input::get("description");
        $newToken = AdminUtilities::create_ssh_token_for_gateway($description);
        return Redirect::to("admin/dashboard/credential-store")->with("message", "SSH Key was successfully created");
	}

	public function createPWD(){
		AdminUtilities::create_pwd_token(Input::all());
		return Redirect::to("admin/dashboard/credential-store")->with("message", "Password Credential was successfully created");

	}

	public function removeSSH(){
		$removeToken = Input::get("token");
		if( AdminUtilities::remove_ssh_token( $removeToken) )
            return Redirect::to("admin/dashboard/credential-store")->with("message", "SSH Key was successfully deleted");
		else
            return Redirect::to("admin/dashboard/credential-store")->with("error-message", "Unable to delete SSH Key");

	}

	public function removePWD(){
		$removeToken = Input::get("token");
		if( AdminUtilities::remove_pwd_token( $removeToken) )
			return Redirect::to("admin/dashboard/credential-store")->with("message", "Password Credential was successfully deleted");
		else
			return Redirect::to("admin/dashboard/credential-store")->with("error-message", "Unable to delete Password Credential"); 

	}


	/* ---- Super Admin Functions ------- */

    public function createGateway(){

        return View::make("admin/create-gateway");

    }

	public function addGateway(){
		$inputs = Input::all();

		$rules = array(
            "password" => "required|min:6|max:48|regex:/^.*(?=.*[a-z])(?=.*[A-Z])(?=.*[0-9])(?=.*[@!$#*&]).*$/",
            "confirm_password" => "required|same:password",
            "email" => "required|email",
        );

        $messages = array(
            'password.regex' => 'Password needs to contain at least (a) One lower case letter (b) One Upper case letter and (c) One number (d) One of the following special characters - !@#$&*',
        );

        $checkValidation = array();
        $checkValidation["password"] = $inputs["admin-password"];
        $checkValidation["confirm_password"] = $inputs["admin-password-confirm"];
        $checkValidation["email"] = $inputs["admin-email"];

        $validator = Validator::make( $checkValidation, $rules, $messages);
        if ($validator->fails()) {
            Session::put("validationMessages", [$validator->messages()] );
            return Redirect::back()
                ->withErrors($validator);
        }
        else{
            $username = Session::get("username");
            $returnVal = AdminUtilities::add_gateway(Input::all());

            if ($returnVal == 1){
                $email = Config::get('pga_config.portal')['admin-emails'];
                $user_profile = Keycloak::getUserProfile($username);
                EmailUtilities::gatewayRequestMail($user_profile["firstname"], $user_profile["lastname"], $email, Input::get("gateway-name"));
                Session::put("message", "Gateway " . $inputs["gateway-name"] . " has been added.");
            }
            else{
                Session::put("errorMessages", "Error: A Gateway already exists with the same GatewayId, Name or URL! Please make a new request.");
            }

			return Redirect::back();
		}
	}

	public function checkRequest(){
	    $inputs = Input::all();

        $rules = array(
            "email" => "required|email",
        );

        $messages = array(
            'email.format' => 'Please enter a valid Email ID',
        );

        $checkValidation = array();
        $checkValidation["email"] = $inputs["email-address"];

        $validator = Validator::make( $checkValidation, $rules, $messages);
        if ($validator->fails()) {
            Session::put("validationMessages", [$validator->messages()] );
            return Redirect::to("admin/dashboard")
                ->withInput()
                ->withErrors($validator);
        }
        else{
            $username = Session::get("username");
            $returnVal = AdminUtilities::check_request(Input::all());

            if ($returnVal == 1) {
                $email = Config::get('pga_config.portal')['admin-emails'];
                $user_profile = Keycloak::getUserProfile($username);
                EmailUtilities::gatewayRequestMail($user_profile["firstname"], $user_profile["lastname"], $email, $inputs["gateway-name"]);
                Session::put("message", "Your Gateway request for " . $inputs["gateway-name"] . " has been created. Your new Gateway request is yet to be approved. You will be notified of the approval status via email notification.");
            }
            else{
                $error = "A Gateway already exists with the same GatewayId, Name or URL! Please make a new request.";
                return Redirect::to("admin/dashboard")
                    ->withInput()
                    ->withErrors($error);
            }
            return Redirect::to("admin/dashboard");
        }
    }

	public function requestGateway(){
		$inputs = Input::all();
		
		$rules = array(
            "username" => "required",
            "password" => "required|min:6|max:48|regex:/^.*(?=.*[a-z])(?=.*[A-Z])(?=.*[0-9])(?=.*[@!$#*&]).*$/",
            "confirm_password" => "required|same:password",
            "email" => "required|email",
        );

        $messages = array(
            'password.regex' => 'Password needs to contain at least (a) One lower case letter (b) One Upper case letter and (c) One number (d) One of the following special characters - !@#$&*',
        );

        $checkValidation = array();
        $checkValidation["username"] = $inputs["admin-username"];
        $checkValidation["password"] = $inputs["admin-password"];
        $checkValidation["confirm_password"] = $inputs["admin-password-confirm"];
        $checkValidation["email"] = $inputs["email-address"];

        $validator = Validator::make( $checkValidation, $rules, $messages);
        if ($validator->fails()) {
            Session::put("validationMessages", $validator->messages() );
            return Redirect::to("admin/dashboard")
            	->withInput(Input::except('password', 'password_confirm'))
            	->withErrors($validator);
        }
        else{
	        $gateway = AdminUtilities::request_gateway(Input::all());
			Session::put("message", "Your request for Gateway " . $inputs["gateway-name"] . " has been created.");
			
            return Redirect::to("admin/dashboard");
		}
	}

    public function enableComputeResource(){
        $resourceId = Input::get("resourceId");
        $computeResource = CRUtilities::get_compute_resource($resourceId);
        $computeResource->enabled = true;
        CRUtilities::register_or_update_compute_resource($computeResource, true);
    }

    public function disableComputeResource(){
        $resourceId = Input::get("resourceId");
        $computeResource = CRUtilities::get_compute_resource($resourceId);
        $computeResource->enabled = false;
        CRUtilities::register_or_update_compute_resource($computeResource, true);
    }

    public function enableStorageResource(){
        $resourceId = Input::get("resourceId");
        $storageResource = SRUtilities::get_storage_resource($resourceId);
        $storageResource->enabled = true;
        SRUtilities::register_or_update_storage_resource($storageResource, true);
    }

    public function disableStorageResource(){
        $resourceId = Input::get("resourceId");
        $storageResource = SRUtilities::get_storage_resource($resourceId);
        $storageResource->enabled = false;
        SRUtilities::register_or_update_storage_resource($storageResource, true);
    }

    public function viewAllocationRequests(){
    	return 'result';
    }

	public function noticesView(){
        Session::put("admin-nav", "notices");
        $notices = array();
        $noticePriorities = CommonUtilities::get_notice_priorities();
        $notices = CommonUtilities::get_all_notices();
		return View::make("admin/manage-notices", array("notices" => $notices, "priorities" => $noticePriorities));
	}

	public function addNotice(){
		$inputs = Input::all();
		$newNotice = AdminUtilities::add_or_update_notice( $inputs);
			return json_encode( $newNotice);
	}

	public function updateNotice(){
		$inputs = Input::all();
		return AdminUtilities::add_or_update_notice( $inputs, true);
	}

	public function deleteNotice(){
		$inputs = Input::all();
		if( AdminUtilities::delete_notice( $inputs["notificationId"]))
		{
			//ajax
			return 1;
		}
		else
			return 0;
	}

}
