#!/usr/bin/env python3

import sys
import json
import requests
import subprocess

if len(sys.argv) < 6:
    print('Usage: ' + sys.argv[0] + ' <token> <import_url> <group_id> <project_name> <student-mail1,student-mail2,...,student-mailN> <expires_at>')
    exit(1)

token = sys.argv[1]
import_url = sys.argv[2]
group_id = sys.argv[3]
# split '@' in the case when project name = student's email
project_name = sys.argv[4].split('@')[0]

base_url = 'https://gitedu.hesge.ch/api/v4'
headers = {'PRIVATE-TOKEN': token}

# Get students ids from their emails
users_emails = sys.argv[5].split(',')
user_ids = []
for email in users_emails:
    user_requested = requests.get(base_url + '/users', params={'search': email}, headers=headers).json()
    if len(user_requested) == 0:
        print('No user %s found, operation aborted' % email)
        exit(1)
    user_id = user_requested[0]['id']
    user_ids.append(user_id)

# Create project from name, basis and group given
params = {'name': project_name, 'import_url': import_url, 'namespace_id': group_id, 'visibility': 'private'}
project = requests.post(base_url + '/projects', params=params, headers=headers).json()

if 'message' in project:
    print('Error in creating project: %s' % project)
    exit(1)
print("Project '" + project['name'] + "' at '" + project['web_url'] + "' created")

# Allow users with developer access level to push and merge on master
access_level = 30
params = {'name': 'master', 'push_access_level': str(access_level), 'merge_access_level': str(access_level)}
requests.post(base_url + '/projects/' + str(project['id']) + '/protected_branches', params=params, headers=headers).json()

# Add each student as project's developer (level 30)
for user_id in user_ids:
    params = {'user_id': user_id, 'access_level': access_level}
    if len(sys.argv) > 6:
        expires_at = sys.argv[6]
        params['expires_at'] = expires_at
    new_user = requests.post(base_url + '/projects/' + str(project['id']) + '/members', params=params, headers=headers).json()

    if 'message' in new_user:
        print('Error in adding user: %s' % new_user)
    else:
        out = ("Adding '" + new_user['name'] + "' (" + new_user['username'] + ") in '"
            + project['name'] + "' with access level: " + str(new_user['access_level']))
        if len(sys.argv) > 6:
            out += ", expires at: " + new_user['expires_at']
        print(out)

# Do not forget : students have to add second remote in their local repositories for pulling last changes.