from pydoc import describe
import factory
from apps.accounts.models import User
from django.contrib.auth.hashers import make_password
from apps.process.models import File, Media, Status
from apps.subscriptions.models import Plan, Subscription, Payment, Extention
from faker import Faker
from datetime import datetime

faker = Faker()

class SuperUserFactory(factory.django.DjangoModelFactory):
    """This class generate a Superuser"""
    class Meta:
        model = User

    first_name = factory.Faker('first_name')
    last_name = factory.Faker('last_name')
    email = faker.email
    username = faker.name
    password = factory.LazyFunction(lambda: make_password('pi3.1415'))
    is_staff = True
    is_superuser = True

class NormalUserFactory(factory.django.DjangoModelFactory):
    """This class ganarate normal user"""
    class Meta:
        model = User

    first_name = factory.Faker('first_name')
    last_name = factory.Faker('last_name')
    email = faker.email
    username = factory.Faker('email')
    password = factory.LazyFunction(lambda: make_password('pi3.1415'))
    is_staff = False
    is_superuser = False


class ExtentionFactory(factory.django.DjangoModelFactory):
    """This class generate extentions"""
    class Meta:
        model = Extention
    name = factory.Sequence(lambda n:"Extention: #%s"%n)

class BasicPlanFactory(factory.django.DjangoModelFactory):
    """This class generate basic plan for normal user"""
    class Meta:
        model = Plan

    plan_id =faker.bban()
    plan_type = 'Basic'
    plan_name = 'Basic'
    describe = faker.paragraph(nb_sentences=5)
    price = '3.99'
    paymentSource = 'paypal'
    duration_days = '30'

    videos_per_day = '1'
    time_per_video = '00:10:00'
    upload_youtube_perm = False
    download_youtube_perm = False
    file_size = 153600.0
    parts_limits = 1
    created = datetime.now()

    @factory.post_generation
    def valid_extentions(self, create, extracted, **kwargs):
        if not create:
            # Simple build, do nothing.
            return

        if extracted:
            # A list of groups were passed in, use them
            for extention in extracted:
                self.extentions.add(extention)

class PopularPlanFactory(factory.django.DjangoModelFactory):
    """This class generate popular plan for normal user"""
    class Meta:
        model = Plan

    plan_id = str(faker.bban())
    plan_type = 'Normal'
    plan_name = 'Polupar'
    describe = faker.paragraph(nb_sentences=5)
    price = '8.99'
    paymentSource = 'paypal'
    duration_days = '30'

    videos_per_day = '3'
    time_per_video = '00:15:00'
    upload_youtube_perm = False
    download_youtube_perm = True
    file_size = 1048576.0
    parts_limits = 5

    created = datetime.now()

    @factory.post_generation
    def valid_extentions(self, create, extracted, **kwargs):
        """this method generate random many-to-many extentions"""
        if not create:
            # Simple build, do nothing.
            return

        if extracted:
            # A list of groups were passed in, use them
            for extention in extracted:
                self.extentions.add(extention)



class ProPlanFactory(factory.django.DjangoModelFactory):
    class Meta:
        model = Plan

    plan_id = faker.bban()
    plan_type = 'Pro'
    plan_name = 'Premium'
    describe = faker.paragraph(nb_sentences=5)
    price = '9.99'
    paymentSource = 'paypal'
    duration_days = '60'

    videos_per_day = '10'
    time_per_video = '23:59:59'
    upload_youtube_perm = True
    download_youtube_perm = True
    file_size = 5242880.0
    parts_limits = 999999
    created = datetime.now()

    @factory.post_generation
    def valid_extentions(self, create, extracted, **kwargs):
        if not create:
            # Simple build, do nothing.
            return

        if extracted:
            # A list of groups were passed in, use them
            for extention in extracted:
                self.extentions.add(extention)


class BasicSubscriptionFactory(factory.django.DjangoModelFactory):
    class Meta:
        model = Subscription

    created_at = datetime.now()
    modified_at = datetime.now()
    plan = factory.SubFactory(BasicPlanFactory)
    user = factory.SubFactory(NormalUserFactory)
    start_time = datetime.now()
    ends_time = None
    is_active = True
    paid_status = True

class PopularSubscriptionFactory(factory.django.DjangoModelFactory):
    class Meta:
        model = Subscription

    created_at = datetime.now()
    modified_at = datetime.now()
    plan = factory.SubFactory(PopularPlanFactory)
    user = factory.SubFactory(NormalUserFactory)
    start_time = datetime.now()
    ends_time = None
    is_active = True
    paid_status = True

class ProSubscriptionFactory(factory.django.DjangoModelFactory):
    class Meta:
        model = Subscription

    created_at = datetime.now()
    modified_at = datetime.now()
    plan = factory.SubFactory(ProPlanFactory)
    user = factory.SubFactory(NormalUserFactory)
    start_time = datetime.now()
    ends_time = None
    is_active = True
    paid_status = True


class PaymentFactory(factory.django.DjangoModelFactory):
    class Meta:
        model = Payment

    created_at = datetime.now()
    modified_at = datetime.now()
    transactionID = faker.bban()
    conversationID = faker.aba()
    reference_no = None
    sub_id = "I-"+faker.aba()
    subscription = factory.SubFactory(BasicSubscriptionFactory)



