<?php
    define("URL", "http://gitlab.example.com/");
    define("PER_PAGE", 100);
    $set_hook_param = array(
        'url'                        => 'http://gitlab-download-app.example.com/update_projects_json.php',
        'token'                      => '',
        'push_events'                => 'TRUE',
        'push_events_branch_filter'  => '',
        'tag_push_events'            => 'FALSE',
        'note_events'                => 'FALSE',
        'confidential_note_events'   => 'FALSE',
        'issues_events'              => 'FALSE',
        'confidential_issues_events' => 'FALSE',
        'merge_requests_events'      => 'FALSE',
        'job_events'                 => 'FALSE',
        'pipeline_events'            => 'FALSE',
        'wiki_page_events'           => 'FALSE',
        'deployment_events'          => 'FALSE',
        'releases_events'            => 'FALSE',
        'enable_ssl_verification'    => 'FALSE'
    );
    define("SET_HOOK_PARAM", $set_hook_param);
    $headers = array(
        "private-token: XXXXXXXXXXXXXXXXXXXX"
    );
    static $set_hook_param = SET_HOOK_PARAM;
    if ($argc > 1) {
        add_hook_project($argv[1], $headers);
    } else {
        add_hook_all_projects($headers);
    }

    function add_hook_all_projects($headers)
    {
        $ret = request_projects($headers);
        if ($ret == false) {
            return;
        }
        $projects_arr = $ret;
        for ($n = 0; $n < count($projects_arr); $n ++) {
            if ($projects_arr[$n]["visibility"]=="internal") {
                unset($projects_arr[$n]);
                $projects_arr = array_values($projects_arr);
            }
        }
        foreach ($projects_arr as $project) {
            $ret = add_hook_project($project["path_with_namespace"], $headers);
            if ($ret == false) {
                return;
            }
        }
    }
    function add_hook_project($path_with_namespace, $headers)
    {
        $ret = request_project_hooks($path_with_namespace, $headers);
        if ($ret == false) {
            return false;
        }
        $hooks = $ret;
        $set_hook = true;
        if (! empty($hooks)) {
            $hooks_arr = json_decode($hooks, true);
            foreach ($hooks_arr as $hook_arr) {
                if ($hook_arr["url"] == SET_HOOK_PARAM["url"]) {
                    $set_hook = false;
                    break;
                }
            }
        }
        if ($set_hook == true) {
            $ret = set_project_hook($path_with_namespace, $headers);
            if ($ret == false) {
                return false;
            }
        }
        return true;
    }
    function request_projects($headers)
    {
        $projects = array();
        $url = URL . 'api/v4/projects/';
        for ($n = 1; ; $n ++) {
            $params = [
                'order_by' => 'name',
                'simple' => 'false',
                'sort' => 'asc',
                'd_after' => 0,
                'per_page' => PER_PAGE,
                'page' => $n
            ];
            $curl = curl_init($url);
            curl_setopt($curl, CURLOPT_CUSTOMREQUEST, 'GET');
            curl_setopt($curl, CURLOPT_HTTPHEADER, $headers);
            curl_setopt($curl, CURLOPT_POSTFIELDS, $params);
            curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, false);
            curl_setopt($curl, CURLOPT_SSL_VERIFYHOST, false);
            curl_setopt($curl, CURLOPT_RETURNTRANSFER, true);
            $ret = curl_exec($curl);
            $rcode = curl_getinfo($curl, CURLINFO_HTTP_CODE);
            curl_close($curl);
            if ($rcode != 200) {
                return false;
            }
            $projects_arr = json_decode($ret, true);
            if (0 < count($projects_arr)) {
                $projects = array_merge_recursive($projects, $projects_arr);
            }
            if (count($projects_arr) < PER_PAGE) {
                break;
            }
        }
        return($projects);
    }
    function request_project_hooks($path_with_namespace, $headers)
    {
        $url = URL . 'api/v4/projects/' . urlencode($path_with_namespace) . '/hooks';
        $curl = curl_init($url);
        curl_setopt($curl, CURLOPT_CUSTOMREQUEST, 'GET');
        curl_setopt($curl, CURLOPT_HTTPHEADER, $headers);
        curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, false);
        curl_setopt($curl, CURLOPT_SSL_VERIFYHOST, false);
        curl_setopt($curl, CURLOPT_RETURNTRANSFER, true);
        $ret = curl_exec($curl);
        $rcode = curl_getinfo($curl, CURLINFO_HTTP_CODE);
        curl_close($curl);
        if ($rcode == 0) {
            return false;
        }
        if ($rcode >= 400) {
            return false;
        }
        return($ret);
    }
    function set_project_hook($path_with_namespace, $headers)
    {
        $url = URL . 'api/v4/projects/' . urlencode($path_with_namespace) . '/hooks';
        $curl = curl_init($url);
        curl_setopt($curl, CURLOPT_CUSTOMREQUEST, 'POST');
        curl_setopt($curl, CURLOPT_HTTPHEADER, $headers);
        curl_setopt($curl, CURLOPT_POSTFIELDS, SET_HOOK_PARAM);
        curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, false);
        curl_setopt($curl, CURLOPT_SSL_VERIFYHOST, false);
        curl_setopt($curl, CURLOPT_RETURNTRANSFER, true);
        $ret = curl_exec($curl);
        $rcode = curl_getinfo($curl, CURLINFO_HTTP_CODE);
        curl_close($curl);
        if ($rcode == 0) {
            return false;
        }
        if ($rcode >= 400) {
            return false;
        }
        return($ret);
    }