<?php

class AccountController extends BaseController
{

    public function createAccountView()
    {
        return View::make('account/create');
    }

    public function createAccountSubmit()
    {
        $rules = array(
            "username" => "required|min:6",
            "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 - !@#$%&*',
        );

        $validator = Validator::make(Input::all(), $rules, $messages);
        if ($validator->fails()) {
            return Redirect::to("create")
                ->withInput(Input::except('password', 'password_confirm'))
                ->withErrors($validator);
        }

        $first_name = $_POST['first_name'];
        $last_name = $_POST['last_name'];
        $username = $_POST['username'];
        $password = $_POST['password'];
        $email = $_POST['email'];

//        Fixme - Save these user information
//        $organization = $_POST['organization'];
//        $address = $_POST['address'];
//        $country = $_POST['country'];
//        $telephone = $_POST['telephone'];
//        $mobile = $_POST['mobile'];
//        $im = $_POST['im'];
//        $url = $_POST['url'];

        $organization = "";
        $address = "";
        $country = "";
        $telephone = "";
        $mobile = "";
        $im = "";
        $url = "";


        if (WSIS::usernameExists($username)) {
            return Redirect::to("create")
                ->withInput(Input::except('password', 'password_confirm'))
                ->with("username_exists", true);
        } else {
//            We are using account confirmation now
//            WSIS::addUser($username, $password);
//
//            //update user profile
//            WSIS::updateUserProfile($username, $email, $first_name, $last_name);
//
//            CommonUtilities::print_success_message('New user created!');
//
//            if(Config::get('pga_config.wsis')['auth-mode']=="oauth"){
//                return View::make('home');
//            }else{
//                return View::make('account/login');
//            }

            WSIS::registerUserAccount($username, $password, $email, $first_name, $last_name,
                Config::get('pga_config.wsis')['tenant-domain']);

            /*add user to role - user_pending */

            $allRoles = WSIS::getAllRoles();
            if(! in_array( "user_pending", $allRoles)){
                WSIS::addRole( "user_pending");
            }
            //$userRoles = (array)WSIS::getUserRoles( $username);

            $userRoles["new"] = "user_pending";
            $userRoles["deleted"] = array();
            WSIS::updateUserRoles( $username, $userRoles);

            CommonUtilities::print_success_message('Account confirmation request was sent to your email account');
            return View::make('home');
        }
    }

    public function loginView()
    {
//        if(Config::get('pga_config.wsis')['auth-mode'] == "oauth"){
//            $url = WSIS::getOAuthRequestCodeUrl();
//            return Redirect::away($url);
//        }else{
//            return View::make('account/login');
//        }
        return View::make('account/login');
    }

    public function loginSubmit()
    {
        if (CommonUtilities::form_submitted()) {
            $wsisConfig = Config::get('pga_config.wsis');
            if( $wsisConfig['tenant-domain'] == "")
                $username = Input::get("username");
            else
                $username = Input::get("username") . "@" . $wsisConfig['tenant-domain'];

            $password = $_POST['password'];
            $response = WSIS::authenticate($username, $password);
            if(!isset($response->access_token)){
                return Redirect::to("login")->with("invalid-credentials", true);
            }

            $accessToken = $response->access_token;
            $refreshToken = $response->refresh_token;
            $expirationTime = time() + $response->expires_in - 5; //5 seconds safe margin

            $userProfile = WSIS::getUserProfileFromOAuthToken($accessToken);
            $username = $userProfile['username'];
            $userRoles = (array)WSIS::getUserRoles($username);

            $authzToken = new Airavata\Model\Security\AuthzToken();
            $authzToken->accessToken = $accessToken;
            $authzToken->claimsMap = array('userName'=>$username);
            Session::put('authz-token',$authzToken);
            Session::put('oauth-refresh-code',$refreshToken);
            Session::put('oauth-expiration-time',$expirationTime);
            Session::put("user-profile", $userProfile);

            if (in_array(Config::get('pga_config.wsis')['admin-role-name'], $userRoles)) {
                Session::put("admin", true);
            }
            if (in_array(Config::get('pga_config.wsis')['read-only-admin-role-name'], $userRoles)) {
                Session::put("admin-read-only", true);
            }
            if (in_array(Config::get('pga_config.wsis')['user-role-name'], $userRoles)) {
                Session::put("authorized-user", true);
            }

            //only for super admin
            if(  Config::get('pga_config.portal')['super-admin-portal'] == true){
                Session::put("super-admin", true);
            }

            CommonUtilities::store_id_in_session($username);
            Session::put("gateway_id", Config::get('pga_config.airavata')['gateway-id']);

            if(Session::get("admin") || Session::get("admin-read-only") || Session::get("authorized-user")){
                return $this->initializeWithAiravata($username);
            }

            if(Session::get("admin") || Session::get("admin-read-only")){
                return Redirect::to("admin/dashboard");
            }else{
                return Redirect::to("home");
            }
        }

    }

//    public function oauthCallback()
//    {
//        if (!isset($_GET["code"])) {
//            return Redirect::to('home');
//        }
//
//        $code = $_GET["code"];
//        $response = WSIS::getOAuthToken($code);
//        if(!isset($response->access_token)){
//            return Redirect::to('home');
//        }
//
//        $accessToken = $response->access_token;
//        $refreshToken = $response->refresh_token;
//        $expirationTime = time() + $response->expires_in - 5; //5 seconds safe margin
//
//        $userProfile = WSIS::getUserProfileFromOAuthToken($accessToken);
//        $username = $userProfile['username'];
//
//        //Fixme - OpenID profile takes some time to get synced (WSO2 IS Issue)
//        //$userRoles = $userProfile['roles'];
//        $userRoles = (array)WSIS::getUserRoles($username);
//
//        $username = $userProfile['username'];
//
//        $authzToken = new Airavata\Model\Security\AuthzToken();
//        $authzToken->accessToken = $accessToken;
//        $authzToken->claimsMap = array('userName'=>$username);
//        Session::put('authz-token',$authzToken);
//        Session::put('oauth-refresh-code',$refreshToken);
//        Session::put('oauth-expiration-time',$expirationTime);
//        Session::put("user-profile", $userProfile);
//
//        if (in_array(Config::get('pga_config.wsis')['admin-role-name'], $userRoles)) {
//            Session::put("admin", true);
//        }
//        if (in_array(Config::get('pga_config.wsis')['read-only-admin-role-name'], $userRoles)) {
//            Session::put("admin-read-only", true);
//        }
//        if (in_array(Config::get('pga_config.wsis')['user-role-name'], $userRoles)) {
//            Session::put("authorized-user", true);
//        }
//
//        CommonUtilities::store_id_in_session($username);
//        Session::put("gateway_id", Config::get('pga_config.airavata')['gateway-id']);
//
//        if(Session::get("admin") || Session::get("admin-read-only") || Session::get("authorized-user")){
//            return $this->initializeWithAiravata($username);
//        }
//        return Redirect::to("home");
//    }

    private function initializeWithAiravata($username){
        //Check Airavata Server is up
        try{
            //creating a default project for user
            $projects = ProjectUtilities::get_all_user_projects(Config::get('pga_config.airavata')['gateway-id'], $username);
            if($projects == null || count($projects) == 0){
                //creating a default project for user
                ProjectUtilities::create_default_project($username);
            }
        }catch (Exception $ex){
            CommonUtilities::print_error_message("Unable to Connect to the Airavata Server Instance!");
            return View::make('home');
        }

        return Redirect::to("admin/dashboard");
    }

    public function forgotPassword()
    {
        return View::make("account/forgot-password");
    }

    public function forgotPasswordSubmit()
    {
        $username = Input::get("username");
        if(empty($username)){
            CommonUtilities::print_error_message("Please provide a valid username");
            return View::make("account/forgot-password");
        }else{
            $wsisConfig = Config::get('pga_config.wsis');
            if( $wsisConfig['tenant-domain'] == "")
                $username = $username;
            else
                $username = $username . "@" . $wsisConfig['tenant-domain'];
            try{
                $key = WSIS::validateUser($username);
                if(!empty($key)){
                    $result = WSIS::sendPasswordResetNotification($username, $key);
                    if($result===true){
                        CommonUtilities::print_success_message("Password reset notification was sent to your email account");
                        return View::make("home");
                    }else{
                        CommonUtilities::print_error_message("Failed to send password reset notification email");
                        return View::make("home");
                    }
                }else{
                    CommonUtilities::print_error_message("Failed to validate the given username");
                    return View::make("account/forgot-password");
                }
            }catch (Exception $ex){
                CommonUtilities::print_error_message("Password reset operation failed");
                return View::make("home");
            }
        }
    }

    public function resetPassword()
    {
        $confirmation = Input::get("confirmation");
        $username = Input::get("username");
        if(empty($username) || empty($confirmation)){
            return View::make("home");
        }else{
            $wsisConfig = Config::get('pga_config.wsis');
            if( $wsisConfig['tenant-domain'] == "")
                $username = $username;
            else
                $username = $username . "@" . $wsisConfig['tenant-domain'];
            try{
                $key = WSIS::validateConfirmationCode($username, $confirmation);
                if(!empty($key)){
                    return View::make("account/reset-password", array("key" => $key, "username"=>$username));
                }else{
                    return View::make("home");
                }
            }catch (Exception $e){
                return View::make("home");
            }
        }

    }

    public function confirmAccountCreation()
    {
        $confirmation = Input::get("confirmation");
        $username = Input::get("username");
        if(empty($username) || empty($confirmation)){
            return View::make("home");
        }else{
            try{
                $result = WSIS::confirmUserRegistration($username, $confirmation, Config::get('pga_config.wsis')['tenant-domain']);
                if($result){
                    $this->sendAccountCreationNotification2Admin($username);
                    return Redirect::to("login");
                }else{
                    CommonUtilities::print_error_message("Account confirmation failed!");
                    return View::make("home");
                }
            }catch (Exception $e){
                CommonUtilities::print_error_message("Account confirmation failed!");
                return View::make("home");
            }
        }
    }

    private function sendAccountCreationNotification2Admin($username){

        $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'];
        $mail->FromName = "Airavata PHP Gateway";

        $recipients = Config::get('pga_config.portal')['admin-emails'];
        foreach($recipients as $recipient){
            $mail->addAddress($recipient);
        }

        $mail->isHTML(true);

        $mail->Subject = "New User Account Was Created Successfully";
        $userProfile = WSIS::getUserProfile($username);
        $wsisConfig = Config::get('pga_config.wsis');
        if( $wsisConfig['tenant-domain'] == "")
            $username = $username;
        else
            $username = $username . "@" . $wsisConfig['tenant-domain'];

        $str = "Gateway Portal: " . $_SERVER['SERVER_NAME'] ."<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 resetPasswordSubmit()
    {
        $rules = array(
            "new_password" => "required|min:6",
            "confirm_new_password" => "required|same:new_password",
        );

        $validator = Validator::make(Input::all(), $rules);
        if ($validator->fails()) {
            return Redirect::to("reset-password")
                ->withInput(Input::except('new_password', 'confirm)new_password'))
                ->withErrors($validator);
        }

        $key =  $_POST['key'];
        $username =  $_POST['username'];
        $new_password =  $_POST['new_password'];

        try{
            $result = WSIS::resetPassword($username, $new_password, $key);
            if($result){
                CommonUtilities::print_success_message("User password was reset successfully");
                return View::make("account/login");
            }else{
                CommonUtilities::print_error_message("Resetting user password operation failed");
                return View::make("account/home");
            }
        }catch (Exception $e){
            CommonUtilities::print_error_message("Resetting user password operation failed");
            return View::make("account/home");
        }
    }


    public function logout()
    {
//        Session::flush();
//        if(Config::get('pga_config.wsis')['auth-mode'] == "oauth"){
//            return Redirect::away(WSIS::getOAuthLogoutUrl());
//        }
//        return Redirect::to('home');

        Session::flush();
        return Redirect::to('home');
    }

}
