import datetime

from django.contrib.auth.models import User

from web.models import Location, AppointmentType, Subject, Worker, Visit, Appointment, ConfigurationItem
from web.models.constants import SEX_CHOICES_MALE, SUBJECT_TYPE_CHOICES_CONTROL
from web.views.notifications import get_today_midnight_date


def create_get_suffix(params):
    result = "?"
    for key in params:
        result += key + "=" + str(params[key]) + "&"
    return result


def create_location(name="test"):
    return Location.objects.create(name=name)


def get_test_location():
    locations = Location.objects.filter(name="test")
    if len(locations) > 0:
        return locations[0]
    else:
        return create_location()


def create_appointment_type():
    return AppointmentType.objects.create(
        code="C",
        default_duration="10",
        description="test",
    )


def create_subject(id=1):
    return Subject.objects.create(
        first_name="Piotr",
        last_name="Gawron",
        default_location=get_test_location(),
        sex=SEX_CHOICES_MALE,
        type=SUBJECT_TYPE_CHOICES_CONTROL,
        screening_number="piotr's number" + str(id),
        country="france")


def create_user(username=None, password=None):
    if username is None:
        username = 'piotr'
    if password is None:
        password = 'top_secret'
    user = User.objects.create_user(
        username=username,
        email='jacob@bla',
        password=password)

    create_worker(user)
    return user


def create_worker(user=None, with_test_location=False):
    worker = Worker.objects.create(
        first_name='piotr',
        last_name="gawron",
        email='jacob@bla',
        user=user,
    )
    if with_test_location:
        worker.locations = [get_test_location()]
        worker.save()
    return worker


def create_visit(subject=None):
    if subject is None:
        subject = create_subject()
    return Visit.objects.create(datetime_begin=get_today_midnight_date() + datetime.timedelta(days=-31),
                                datetime_end=get_today_midnight_date() + datetime.timedelta(days=31),
                                subject=subject,
                                is_finished=False)


def create_appointment(visit=None, when=None):
    if visit is None:
        visit = create_visit()
    return Appointment.objects.create(
        visit=visit,
        length=30,
        location=get_test_location(),
        datetime_when=when)


def create_configuration_item():
    item = ConfigurationItem.objects.create()
    item.type = "TEST"
    item.value = "xxx"
    item.name = "yyy"
    item.save()
    return item;