import django, sys, os
sys.path.append("..")
os.environ['DJANGO_SETTINGS_MODULE'] = 'apiserver.settings'
django.setup()

import random
import string
import datetime
from uuid import uuid4
import requests
from apiserver.api import models

API_URL = 'http://localhost:8002'

if len(sys.argv) == 2:
    token = sys.argv[1]
else:
    raise('Please provide a login token in the command line')

members = models.Member.objects.all()
member_ids = list(members.values_list('id', flat=True))
courses = models.Course.objects.all()
course_ids = list(courses.values_list('id', flat=True))


randstr = lambda: str(uuid4()).split('-')[-1]

build_user = lambda: dict(
    first_name='test',
    last_name='tester',
    username=randstr()+'.tester',
    password1='protospace',
    password2='protospace',
    email=randstr()+'@domain.com',
    existing_member='false',
)

change_member = lambda: dict(
    street_address=randstr(),
    city=randstr(),
    postal_code=randstr(),
    first_name=randstr(),
)

build_transaction = lambda member_id: dict(
    member_id=member_id,
    date='2020-02-02',
    amount=0,
    account_type='Clearing',
    info_source='DB Edit',
    memo='Test transaction, ignore'
)

build_card = lambda member_id: dict(
    member_id=member_id,
    card_number=randstr(),
    active_status='card_active',
    notes='qot',
)

build_search = lambda: dict(
    q=random.choice(string.ascii_lowercase),
    seq=123,
)

build_session = lambda: dict(
    datetime=datetime.datetime.now(),
    course=random.choice(course_ids),
    cost=0,
)

def poster(headers, payload, route):
    r = requests.post(API_URL + route, data=payload, headers=headers, timeout=5)
    if r.status_code < 300:
        print(r.text.strip())
    else:
        print(r.text)
        raise Exception('Bad response code ' + str(r.status_code))

def patcher(headers, payload, route):
    r = requests.patch(API_URL + route, data=payload, headers=headers, timeout=5)
    if r.status_code < 300:
        print(r.text.strip())
    else:
        print(r.text)
        raise Exception('Bad response code ' + str(r.status_code))


def register_member():
    payload = build_user()
    poster({}, payload, '/registration/')

def edit_member():
    payload = change_member()
    headers = {'Authorization': 'Token ' + token}
    patcher(headers, payload, '/members/'+str(random.choice(member_ids))+'/')

def create_transaction():
    headers = {'Authorization': 'Token ' + token}
    payload = build_transaction(random.choice(member_ids))
    poster(headers, payload, '/transactions/')

def create_card():
    headers = {'Authorization': 'Token ' + token}
    payload = build_card(random.choice(member_ids))
    poster(headers, payload, '/cards/')

def perform_search():
    headers = {'Authorization': 'Token ' + token}
    payload = build_search()
    poster(headers, payload, '/search/')

def create_session():
    headers = {'Authorization': 'Token ' + token}
    payload = build_session()
    poster(headers, payload, '/sessions/')



while True:
    register_member()
    edit_member()
    perform_search()
    create_transaction()
    create_card()
    create_session()