from datetime import date, time

from factory import DjangoModelFactory, Sequence, SubFactory, LazyFunction
from factory.fuzzy import FuzzyText, FuzzyDate, FuzzyInteger
from factory.django import FileField

from ..models import (CollectionType, CollectionMethod, Flaw, ADFGPermit,
                      Collection, DatasheetAttachment, CollectionTrap)
from ccdb.projects.tests.factories import ProjectFactory
from ccdb.locations.tests.factories import (StudyLocationFactory,
                                            StorageLocationFactory)
from ccdb.processing.tests.factories import ProcessTypeFactory, ReagentFactory


class CollectionTypeFactory(DjangoModelFactory):
    class Meta:
        model = CollectionType

    name = Sequence(lambda n: 'collection_type{}'.format(n))
    code = Sequence(lambda n: 'ct{}'.format(n))
    sort_order = Sequence(lambda n: n)


class CollectionMethodFactory(DjangoModelFactory):
    class Meta:
        model = CollectionMethod

    name = Sequence(lambda n: 'collection_method{}'.format(n))
    code = Sequence(lambda n: 'cm{}'.format(n))
    collection_method_class = FuzzyText(length=50)
    sort_order = Sequence(lambda n: n)


class FlawFactory(DjangoModelFactory):
    class Meta:
        model = Flaw

    name = Sequence(lambda n: 'flaw{}'.format(n))
    description = FuzzyText(length=255)
    sort_order = Sequence(lambda n: n)


class ADFGPermitFactory(DjangoModelFactory):
    class Meta:
        model = ADFGPermit

    name = Sequence(lambda n: 'adfg_permit{}'.format(n))
    sort_order = Sequence(lambda n: n)


class CollectionFactory(DjangoModelFactory):
    class Meta:
        model = Collection

    project = SubFactory(ProjectFactory)
    study_location = SubFactory(StudyLocationFactory)
    collection_type = SubFactory(CollectionTypeFactory)
    collection_method = SubFactory(CollectionMethodFactory)
    number_of_traps = FuzzyInteger(0)
    collection_start_date = FuzzyDate(date(2012, 1, 1))
    collection_start_time = None
    collection_end_date = FuzzyDate(date(2015, 1, 1))
    collection_end_time = None
    storage_location = SubFactory(StorageLocationFactory)
    specimen_state = FuzzyText(length=50)
    process_type = SubFactory(ProcessTypeFactory)
    reagent = SubFactory(ReagentFactory)
    adfg_permit = SubFactory(ADFGPermitFactory)
    flaw = SubFactory(FlawFactory)


class DatasheetAttachmentFactory(DjangoModelFactory):
    class Meta:
        model = DatasheetAttachment

    collection = SubFactory(CollectionFactory)
    datasheet = FileField()


class CollectionTrapFactory(DjangoModelFactory):
    class Meta:
        model = CollectionTrap

    collection = SubFactory(CollectionFactory)
    number_of_traps = FuzzyInteger(0)
    date_opened = FuzzyDate(date(2012, 1, 1))
    time_opened = LazyFunction(time)
    date_closed = FuzzyDate(date(2015, 1, 1))
    time_closed = LazyFunction(time)