<?php

use Airavata\Model\Workspace\Gateway;
use Airavata\Model\Workspace\GatewayApprovalStatus;
use Airavata\Model\Workspace\Notification;
use Airavata\Model\Workspace\NotificationPriority;
use Airavata\Model\Credential\Store\SummaryType;
use Illuminate\Support\Facades\Log;

class AdminUtilities
{

    /**
     * To create a new gateway
     * @param $input
     * @return string
     */
    public static function add_gateway($inputs)
    {
        $gateway = new Gateway();
        $id = preg_replace('~^[^a-zA-Z0-9]+|[^a-zA-Z0-9]+$~', '', $inputs["gateway-name"]);
        $id = strtolower(preg_replace('~[^a-zA-Z0-9]+~', '-', $id));
        $gateway->gatewayId = $id;
        $gateway->gatewayName = $inputs["gateway-name"];
        $gateway->emailAddress = $inputs["email-address"];
        $gateway->gatewayURL = $inputs["gateway-url"];
        $gateway->gatewayAdminFirstName = $inputs["admin-firstname"];
        $gateway->gatewayAdminEmail = $inputs["admin-email"];
        $gateway->gatewayAdminLastName = $inputs["admin-lastname"];
        $gateway->identityServerUserName = $inputs["admin-username"];
        $token = AdminUtilities::create_pwd_token([
            "username" => $inputs["admin-username"],
            "password" => $inputs["admin-password"],
            "description" => "Admin user password for Gateway " . $id
        ]);
        $gateway->identityServerPasswordToken  = $token;
        $gateway->reviewProposalDescription = $inputs["project-details"];
        $gateway->gatewayPublicAbstract = $inputs["public-project-description"];
        $gateway->requesterUsername = Session::get('username');
        $gateway->gatewayApprovalStatus = GatewayApprovalStatus::APPROVED;

         $logoutURI = $gateway->gatewayURL;
         if(!(AdminUtilities::endsWith($logoutURI,"/"))) {
             $logoutURI = $logoutURI."/";
         }
         $redirectURI = $logoutURI."auth/callback*";
         $gateway->redirectURLs = array($logoutURI,$redirectURI);
         $gateway->scope = "openid profile email org.cilogon.userinfo" ;

        try {

            TenantProfileService::addGateway(Session::get('authz-token'), $gateway);
            return 1;
        }
        catch (Exception $ex) {
            return -1;
        }
    }

    public static function get_gateway( $gateway_id)
    {
        return TenantProfileService::getGateway( Session::get("authz-token"), $gateway_id);
    }

    public static function get_gateways_for_requester( $username )
    {
        return TenantProfileService::getAllGatewaysForUser( Session::get("authz-token"), $username );
    }

    public static function check_request( $inputs)
    {
        $gateway = new Gateway( $inputs);
        $id = preg_replace('~^[^a-zA-Z0-9]+|[^a-zA-Z0-9]+$~', '', $inputs["gateway-name"]);
        $id = strtolower(preg_replace('~[^a-zA-Z0-9]+~', '-', $id));
        $gateway->gatewayId = $id;
        $gateway->gatewayApprovalStatus = GatewayApprovalStatus::REQUESTED;
        //$gateway->domain = 'airavata.' . $inputs["gateway-acronym"];
        $gateway->gatewayName = $inputs["gateway-name"];
        $gateway->emailAddress = $inputs["email-address"];
        $gateway->gatewayPublicAbstract = $inputs["public-project-description"];
        $gateway->requesterUsername = Session::get('username');

        try {
            TenantProfileService::addGateway(Session::get('authz-token'), $gateway);
            return 1;
        } catch (Exception $ex) {
            return -1;
        }
    }

    public static function request_gateway( $inputs)
    {
        $gateway = new Gateway( $inputs);
        $id = preg_replace('~^[^a-zA-Z0-9]+|[^a-zA-Z0-9]+$~', '', $inputs["gateway-name"]);
        $id = strtolower(preg_replace('~[^a-zA-Z0-9]+~', '-', $id));
        $gateway->gatewayId = $id;
        $gateway->gatewayApprovalStatus = GatewayApprovalStatus::APPROVED;
        //$gateway->domain = 'airavata.' . $inputs["gateway-acronym"];
        $gateway->gatewayName = $inputs["gateway-name"];
        $gateway->emailAddress = $inputs["email-address"];
        //$gateway->gatewayAcronym = $inputs["gateway-acronym"];
        $gateway->gatewayURL = $inputs["gateway-url"];
        $gateway->gatewayAdminFirstName = $inputs["admin-firstname"];
        $gateway->gatewayAdminLastName = $inputs["admin-lastname"];
        $gateway->identityServerUserName = $inputs["admin-username"];
        $token = AdminUtilities::create_pwd_token([
            "username" => $inputs["admin-username"],
            "password" => $inputs["admin-password"],
            "description" => "Admin user password for Gateway " . $id
        ]);
        $gateway->identityServerPasswordToken  = $token;
        $gateway->reviewProposalDescription = $inputs["project-details"];
        $gateway->gatewayPublicAbstract = $inputs["public-project-description"];
        $gateway->requesterUsername = Session::get('username');


        $logoutURI = $gateway->gatewayURL;
        if(!(AdminUtilities::endsWith($logoutURI,"/"))) {
            $logoutURI = $logoutURI."/";
        }
        $redirectURI = $logoutURI."auth/callback*";
        $gateway->redirectURLs = array($logoutURI,$redirectURI);
        $gateway->scope = "openid profile email org.cilogon.userinfo" ;

        $logoutURI = $gateway->gatewayURL;
        $redirectURI = $logoutURI."auth/callback*";
        $gateway->redirectURLs = array($logoutURI,$redirectURI);
        $gateway->scope = "openid profile email org.cilogon.userinfo" ;


        return TenantProfileService::addGateway(Session::get('authz-token'), $gateway);
    }

    public static function get_gateway_approval_statuses()
    {
        $gatewayApprovalStatusObject = new GatewayApprovalStatus();
        return $gatewayApprovalStatusObject::$__names;
    }

    public static function update_form( $gatewayId, $gatewayData){

        if( isset( $gatewayData["updateRequest"])) {
            return TenantProfileService::getGateway( Session::get('authz-token'), $gatewayId);
        }

    }

    public static function user_update_gateway( $gatewayId, $gatewayData){
        $gateway = TenantProfileService::getGateway( Session::get('authz-token'), $gatewayId);
        $gateway->gatewayApprovalStatus = GatewayApprovalStatus::APPROVED;
        $gateway->emailAddress = $gatewayData["email-address"];
        $gateway->gatewayURL = $gatewayData["gateway-url"];
        $gateway->reviewProposalDescription = $gatewayData["project-details"];
        $gateway->gatewayPublicAbstract = $gatewayData["public-project-description"];

        $logoutURI = $gateway->gatewayURL;
        if(!(AdminUtilities::endsWith($logoutURI,"/"))) {
            $logoutURI = $logoutURI."/";
        }
        $redirectURI = $logoutURI."auth/callback*";
        $gateway->redirectURLs = array($logoutURI,$redirectURI);
        $gateway->scope = "openid profile email org.cilogon.userinfo" ;


        if( TenantProfileService::updateGateway( Session::get('authz-token'), $gateway) ){
            return 1;
              }
        else{
            //Need to find a better way for this.
            // retun echo "Tenant Name is already in use";
            return -1;
        }
    }

    public static function update_gateway( $gatewayId, $gatewayData){

        $gateway = TenantProfileService::getGateway( Session::get('authz-token'), $gatewayId);
        if( isset( $gatewayData["cancelRequest"]))
            $gateway->gatewayApprovalStatus = GatewayApprovalStatus::CANCELLED;
        else{
            $gateway->gatewayName = $gatewayData["gatewayName"];
            $gateway->gatewayURL = $gatewayData["gatewayURL"];
            $gateway->declinedReason = $gatewayData["declinedReason"];
        }
        if( isset($gatewayData["createTenant"])) {
            $gatewayData["declinedReason"] = " ";
            if ($gateway->identityServerPasswordToken == null)
            {
                Session::flash("errorMessages", "Error: Please provide an admin password.");
                return -1;
            }
            foreach ($gatewayData as $key => $data) {
                // Don't check these fields, see related check above
                // where we make sure that password is provided
                if ($key == "gatewayAdminPassword" || $key == "gatewayAdminPasswordConfirm") {
                    continue;
                }
                if ($data == null) {
                    return -1;
                }
            }
            $logoutURI = $gateway->gatewayURL;
            if(!(AdminUtilities::endsWith($logoutURI,"/"))) {
                $logoutURI = $logoutURI."/";
            }
            $redirectURI = $logoutURI."auth/callback*";
            $gateway->redirectURLs = array($logoutURI,$redirectURI);
            $gateway->scope = "openid profile email org.cilogon.userinfo" ;

            $gateway = IamAdminServices::setUpGateway( Session::get('authz-token'), $gateway);
            $gateway->gatewayApprovalStatus = GatewayApprovalStatus::CREATED;
        }
        elseif( isset( $gatewayData["approveRequest"])){
            $gateway->emailAddress = $gatewayData["emailAddress"];
            $gateway->gatewayURL = $gatewayData["gatewayURL"];
            $gateway->gatewayAdminFirstName = $gatewayData["gatewayAdminFirstName"];
            $gateway->gatewayAdminLastName = $gatewayData["gatewayAdminLastName"];
            $gateway->gatewayAdminEmail = $gatewayData["gatewayAdminEmail"];
            $gateway->identityServerUserName = $gatewayData["identityServerUserName"];
            if (!empty($gatewayData["gatewayAdminPassword"])) {

                $token = AdminUtilities::create_pwd_token([
                    "username" => $gatewayData["identityServerUserName"],
                    "password" => $gatewayData["gatewayAdminPassword"],
                    "description" => "Admin user password for Gateway " . $gateway->gatewayName
                ]);
                $gateway->identityServerPasswordToken = $token;
            }
            $gateway->reviewProposalDescription = $gatewayData["reviewProposalDescription"];
            $gateway->gatewayPublicAbstract = $gatewayData["gatewayPublicAbstract"];
            $gateway->gatewayApprovalStatus = GatewayApprovalStatus::APPROVED;

            $logoutURI = $gateway->gatewayURL;
            $logoutURI = $gateway->gatewayURL;
            if(!(AdminUtilities::endsWith($logoutURI,"/"))) {
                $logoutURI = $logoutURI."/";
            }
            $redirectURI = $logoutURI."auth/callback*";
            $gateway->redirectURLs = array($logoutURI,$redirectURI);
            $gateway->scope = "openid profile email org.cilogon.userinfo" ;
        }
        elseif( isset( $gatewayData["denyRequest"])){
            $gateway->gatewayApprovalStatus = GatewayApprovalStatus::DENIED;
        }
        elseif( isset( $gatewayData["updateGateway"])){
            $gateway->emailAddress = $gatewayData["emailAddress"];
            $gateway->gatewayURL = $gatewayData["gatewayURL"];
            $gateway->gatewayAdminFirstName = $gatewayData["gatewayAdminFirstName"];
            $gateway->gatewayAdminLastName = $gatewayData["gatewayAdminLastName"];
            $gateway->gatewayAdminEmail = $gatewayData["gatewayAdminEmail"];
            $gateway->identityServerUserName = $gatewayData["identityServerUserName"];
            if (!empty($gatewayData["gatewayAdminPassword"])) {
                $token = AdminUtilities::create_pwd_token([
                    "username" => $gatewayData["identityServerUserName"],
                    "password" => $gatewayData["gatewayAdminPassword"],
                    "description" => "Admin user password for Gateway " . $gateway->gatewayName
                ]);
                $gateway->identityServerPasswordToken = $token;
            }
            $gateway->reviewProposalDescription = $gatewayData["reviewProposalDescription"];
            $gateway->gatewayPublicAbstract = $gatewayData["gatewayPublicAbstract"];
            $gateway->gatewayApprovalStatus = GatewayApprovalStatus::APPROVED;
            $logoutURI = $gateway->gatewayURL;
            if(!(AdminUtilities::endsWith($logoutURI,"/"))) {
                $logoutURI = $logoutURI."/";
            }
            $redirectURI = $logoutURI."auth/callback*";
            $gateway->redirectURLs = array($logoutURI,$redirectURI);
            $gateway->scope = "openid profile email org.cilogon.userinfo" ;
        }
        elseif( isset( $gatewayData["deployGateway"])){
            $gateway->gatewayApprovalStatus = GatewayApprovalStatus::DEPLOYED;
        }
        elseif( isset( $gatewayData["deactivateGateway"])){
            $gateway->gatewayApprovalStatus = GatewayApprovalStatus::DEACTIVATED;
        }


        if( TenantProfileService::updateGateway( Session::get('authz-token'), $gateway) ){
            return 1;
        }
        else{
            //Need to find a better way for this.
           // retun echo "Tenant Name is already in use";
            return -1;
        }
    }

    public static function add_tenant( $gateway){
        $tenants = WSIS::getTenants();
        $tenantExists = false;
        foreach( $tenants as $tenant){
            if( $tenant->tenantDomain == $gateway->domain){
                $tenantExists = true;
            }
        }
        if( !$tenantExists){
            $gatewayDomain = $gateway->domain;

            //finally create tenant
            return WSIS::createTenant(1, $gateway->identityServerUserName, $gateway->identityServerPasswordToken, $gateway->emailAddress, $gateway->gatewayAdminFirstName, $gateway->gatewayAdminLastName, $gatewayDomain);
        }
        else
            return false;
    }

    /**
     * Method to get experiment execution statistics object
     * @param $fromTime
     * @param $toTime
     * @return \Airavata\Model\Experiment\ExperimentStatistics
     */
    public static function get_experiment_execution_statistics($fromTime, $toTime, $username, $appname, $hostname)
    {
        if (trim($username) == '') {
            $username = null;
        }
        if (trim($appname) == '') {
            $appname = null;
        }
        if (trim($hostname) == '') {
            $hostname = null;
        }
        return Airavata::getExperimentStatistics(Session::get('authz-token'),
            Config::get('pga_config.airavata')['gateway-id'], $fromTime, $toTime, $username, $appname, $hostname);
    }

    /**
     * Method to get experiments of a particular time range
     * @param $inputs
     * @return array
     */
    public static function get_experiments_of_time_range($inputs)
    {
        $experimentStatistics = AdminUtilities::get_experiment_execution_statistics(
            strtotime($inputs["from-date"]) * 1000,
            strtotime($inputs["to-date"]) * 1000,
            $inputs['username'],
            $inputs['appname'],
            $inputs['hostname']
        );
        $experiments = array();
        if ($inputs["status-type"] == "ALL") {
            $experiments = $experimentStatistics->allExperiments;
        }else if ($inputs["status-type"] == "COMPLETED") {
            $experiments = $experimentStatistics->completedExperiments;
        }else if ($inputs["status-type"] == "CREATED") {
            $experiments = $experimentStatistics->createdExperiments;
        }else if ($inputs["status-type"] == "RUNNING") {
            $experiments = $experimentStatistics->runningExperiments;
        } elseif ($inputs["status-type"] == "FAILED") {
            $experiments = $experimentStatistics->failedExperiments;
        } else if ($inputs["status-type"] == "CANCELED") {
            $experiments = $experimentStatistics->cancelledExperiments;
        }

        $expContainer = array();
        $expNum = 0;
        foreach ($experiments as $experiment) {
            //var_dump( $experiment); exit;
            $expValue = ExperimentUtilities::get_experiment_values($experiment, true);
            $expContainer[$expNum]['experiment'] = $experiment;
            $expValue["editable"] = false;
            $expContainer[$expNum]['expValue'] = $expValue;
            $expNum++;
        }

        return $expContainer;
    }

    public static function create_ssh_token_for_gateway($description) {
        $token = Airavata::generateAndRegisterSSHKeys(Session::get('authz-token'), $description);
    }

    public static function create_ssh_token_for_user($description) {
        return Airavata::generateAndRegisterSSHKeys(Session::get('authz-token'), $description);
    }

    public static function create_pwd_token($inputs){
        $username = $inputs['username'];
        $password = $inputs['password'];
        $description = $inputs['description'];
       
        return $newToken = Airavata::registerPwdCredential( Session::get('authz-token'),
            $username, $password, $description);

    }

    public static function get_all_ssh_tokens_with_description(){
        return Airavata::getAllCredentialSummaries( Session::get('authz-token'), "SSH");
    }

    public static function get_all_pwd_tokens(){
        $credential_summaries = Airavata::getAllCredentialSummaries(Session::get('authz-token'), SummaryType::PASSWD);
        $result = [];
        foreach ($credential_summaries as $credential_summary) {
            $result[$credential_summary->token] = $credential_summary->description;
        }
        return $result;
    }

    public static function remove_ssh_token( $token){
        return Airavata::deleteSSHPubKey( Session::get('authz-token'), $token);
    }

    public static function remove_pwd_token( $token){
        return Airavata::deletePWDCredential( Session::get('authz-token'), $token);
    }

    public static function add_or_update_notice( $notifData, $update = false){
        $notification = new Notification();
        $notification->gatewayId = Session::get("gateway_id");
        $notification->title = $notifData["title"];
        $notification->notificationMessage = $notifData["notificationMessage"];
        $notification->publishedTime = strtotime( $notifData["publishedTime"])* 1000;
        $notification->expirationTime = strtotime( $notifData["expirationTime"]) * 1000;
        $notification->priority = intval($notifData["priority"]);

        if( $update){
            $notification->notificationId =  $notifData["notificationId"];
            if( Airavata::updateNotification( Session::get("authz-token"), $notification) )
            {
                return json_encode( Airavata::getNotification(  Session::get('authz-token'),
                                                                Session::get("gateway_id"),
                                                                $notifData["notificationId"] ));
            }
            else
                0;
        }
        else
            return Airavata::getNotification(
                    Session::get('authz-token'),
                    Session::get("gateway_id"),
                    Airavata::createNotification( Session::get("authz-token"), $notification) );
    }

    public static function delete_notice( $notificationId){
        return Airavata::deleteNotification( Session::get('authz-token'), Session::get("gateway_id"), $notificationId);
    }

    public static function add_or_update_IDP($inputs)
    {
        $gatewayId = $inputs['gatewayId'];
        $identityServerTenant = $inputs['identityServerTenant'];
        $identityServerPwdCredToken = $inputs['identityServerPwdCredToken'];

        $gp = Airavata::getGatewayResourceProfile(Session::get('authz-token'), $gatewayId);
        if(!empty($identityServerTenant)){
            $gp->identityServerTenant = $identityServerTenant;
        }else{
            $gp->identityServerTenant = "";
        }

        if(!empty($identityServerPwdCredToken) and $identityServerPwdCredToken != 'DO-NOT-SET'){
            $gp->identityServerPwdCredToken = $identityServerPwdCredToken;
        }else{
            $gp->identityServerPwdCredToken = null;
        }


        Airavata::updateGatewayResourceProfile(Session::get('authz-token'), $gatewayId, $gp);

        return true;
    }


     public static  function endsWith($haystack, $needle) {
        return substr_compare($haystack, $needle, -strlen($needle)) === 0;
     }

}
