<?php


class ProjectController extends BaseController
{

    /**
     * Limit used in fetching paginated results
     * @var int
     */
    var $limit = 20;

    /**
     *    Instantiate a new ProjectController Instance
     **/

    public function __construct()
    {
        $this->beforeFilter('verifylogin');
        $this->beforeFilter('verifyauthorizeduser');
        Session::put("nav-active", "project");

    }

    public function createView()
    {
        if (Config::get('pga_config.airavata')["data-sharing-enabled"]){
            return View::make("project/create", array("users" => json_encode(array()), "owner" => json_encode(array())));
        }else{
            return View::make("project/no-sharing-create");
        }

    }

    public function createSubmit()
    {
        if (isset($_POST['save'])) {
            $projectId = ProjectUtilities::create_project();
            return Redirect::to('project/summary?projId=' . urlencode($projectId));
        } else {
            return Redirect::to('project/create');
        }
    }

    public function summary()
    {
        if (Input::has("projId")) {
            Session::put("projId", Input::get("projId"));

            $project = ProjectUtilities::get_project(Input::get('projId'));
            $experiments = ProjectUtilities::get_experiments_in_project(Input::get("projId"));

            if(Config::get('pga_config.airavata')["data-sharing-enabled"]){
                $users = SharingUtilities::getProfilesForSharedUsers(Input::get('projId'));

                $owner = array();
                if (strcmp(Session::get("username"), $project->owner) !== 0) {
                    $owner[$project->owner] = $users[$project->owner];
                    $users = array_diff_key($users, $owner);
                }

                $experiment_can_write = array();
                foreach($experiments as $experiment) {
                    if (SharingUtilities::userCanWrite(Session::get("username"), $experiment->experimentId)) {
                        $experiment_can_write[$experiment->experimentId] = true;
                    }
                    else {
                        $experiment_can_write[$experiment->experimentId] = false;
                    }
                }

                return View::make("project/summary",
                    array("projectId" => Input::get("projId"),
                        "experiments" => $experiments,
                        "users" => json_encode($users),
                        "owner" => json_encode($owner),
                        "project_can_write" => SharingUtilities::userCanWrite(Session::get("username"), Input::get("projId")),
                        "experiment_can_write" => $experiment_can_write
                    ));
            }else{
                return View::make("project/no-sharing-summary",
                    array("projectId" => Input::get("projId"),
                        "experiments" => $experiments
                    ));
            }

        } else
            return Redirect::to("home");
    }

    public function editView()
    {
        if (Input::has("projId") || Input::has("projectId")) {
            $projectId = Input::get("projId") ? Input::get("projId") : Input::get("projectId");
            $project = ProjectUtilities::get_project($projectId);
            return $this->createEditView($projectId, $project, null);
        } else {
            return Redirect::to("home");
        }
    }

    public function editSubmit()
    {
        $projectDetails = new stdClass();
        $projectDetails->owner = Input::get("projectOwner");
        $projectDetails->name = Input::get("project-name");
        $projectDetails->description = Input::get("project-description");

        if(Config::get('pga_config.airavata')["data-sharing-enabled"]){
            if (isset($_POST['save']) && SharingUtilities::userCanWrite(Session::get("username"), Input::get("projectId"))) {

                try {
                    ProjectUtilities::update_project(Input::get("projectId"), $projectDetails);
                } catch (Exception $ex) {
                    // Decode JSON into assoc. array
                    $shareSettings = json_decode(Input::get('share-settings'), true);
                    return $this->createEditView(Input::get("projectId"), $projectDetails, $shareSettings)->with("errorMessage", "Failed to update project: " . $ex->getMessage());
                }
            }
        }else{
            try {
                ProjectUtilities::update_project(Input::get("projectId"), $projectDetails);
            } catch (Exception $ex) {
                return $this->createEditView(Input::get("projectId"), $projectDetails, null)->with("errorMessage", "Failed to update project: " . $ex->getMessage());
            }
        }
        return Redirect::to("project/summary?projId=" . urlencode(Input::get("projectId")))->with("project_edited", true);
    }

    /**
     * Create the edit view either from existing data or user submitted data.
     * @param $projectId String
     * @param $projectDetails stdClass instance
     * @param $shareSettings array
     */
    private function createEditView($projectId, $projectDetails, $shareSettings)
    {
        if (Config::get('pga_config.airavata')["data-sharing-enabled"]) {
            if (SharingUtilities::userCanWrite(Session::get("username"), $projectId)) {
                if ($shareSettings) {

                    $profiles = SharingUtilities::getUserProfiles(array_keys($shareSettings));

                    foreach ($profiles as $username => $profile) {
                        $profile["access"] = $shareSettings[$username];
                        $profiles[$username] = $profile;
                    }
                    $users = $profiles;
                } else {
                    $users = SharingUtilities::getProfilesForSharedUsers($projectId);
                }
                $owner = array();
                if (strcmp(Session::get("username"), $projectDetails->owner) !== 0) {
                    $owner[$projectDetails->owner] = $users[$projectDetails->owner];
                    $users = array_diff_key($users, $owner);
                }
                $canEditSharing = strcmp(Session::get("username"), $projectDetails->owner) === 0;
                return View::make("project/edit",
                    array("projectId" => $projectId,
                        "project" => $projectDetails,
                        "users" => json_encode($users),
                        "owner" => json_encode($owner),
                        "canEditSharing" => $canEditSharing
                    ));
            }else {
                return Redirect::to('project/summary?projId=' . urlencode($projectId))->with("error", "You do not have permission to edit this project.");
            }
        } else {
            return View::make("project/no-sharing-edit",
                array("projectId" => $projectId,
                    "project" => $projectDetails,
                ));
        }
    }

    public function browseView()
    {
        $pageNo = Input::get('pageNo');
        $prev = Input::get('prev');
        $isSearch = Input::get('search');
        if (empty($pageNo) || isset($isSearch) ) {
            $pageNo = 1;
        } else {
            if (isset($prev)) {
                $pageNo -= 1;
            } else {
                $pageNo += 1;
            }
        }

        $searchValue = Input::get("search-value");
        if(!empty($searchValue)){
            $projects = ProjectUtilities::get_proj_search_results_with_pagination(Input::get("search-key"),
                Input::get("search-value"), $this->limit, ($pageNo - 1) * $this->limit);
        }else{
            $projects = ProjectUtilities::get_all_user_accessible_projects_with_pagination($this->limit, ($pageNo - 1) * $this->limit);
        }

        $can_write = array();
        $user = Session::get("username");
        foreach($projects as $project) {
            if(Config::get('pga_config.airavata')["data-sharing-enabled"]){
                $can_write[$project->projectID] = SharingUtilities::userCanWrite($user, $project->projectID);
            } else {
                $can_write[$project->projectID] = true;
            }
        }

        return View::make('project/browse', array(
            'pageNo' => $pageNo,
            'limit' => $this->limit,
            'projects' => $projects,
            'can_write' => $can_write
        ));
    }

    /**
     * Generate JSON containing permissions information for this project.
     *
     * This function retrieves the user profile and permissions for every user
     * other than the client that has access to the project. In the event that
     * the project does not exist, return an error message.
     */
    public function sharedUsers()
    {
        if (Session::has("authz-token") && array_key_exists('resourceId', $_GET)) {
            return Response::json(SharingUtilities::getProfilesForSharedUsers($_GET['resourceId']));
        }
        else {
            return Response::json(array("error" => "Error: No project specified"));
        }
    }

    public function unsharedUsers()
    {
        if (Session::has("authz-token") && array_key_exists('resourceId', $_GET)) {
            return Response::json(SharingUtilities::getProfilesForUnsharedUsers($_GET['resourceId']));
        }
        else {
            return Response::json(array("error" => "Error: No project specified"));
        }
    }

    public function allUsers()
    {
        return Response::json(SharingUtilities::getAllUserProfiles());
    }
}

?>
