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,ProcessedMedia,UploadType
from apps.subscriptions.models import Plan, Subscription, Payment, Extention
from faker import Faker
from datetime import datetime
from django.utils import timezone

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 = factory.Sequence(lambda n: f'user{n}@example.com')
    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)


class FileFactory(factory.django.DjangoModelFactory):
    class Meta:
        model = File

    existingPath = factory.Faker('file_path')
    name = factory.Faker('file_name', extension='mp4')
    eof = False

class MediaFactory(factory.django.DjangoModelFactory):
    class Meta:
        model = Media

    # You can use Faker to generate realistic fake data for your model fields
    title = factory.LazyFunction(lambda: faker.sentence(nb_words=4))
    author = factory.LazyFunction(lambda: faker.name())
    audio_path = factory.LazyFunction(lambda: faker.file_path(depth=1))
    size = factory.LazyFunction(lambda: faker.numerify('### MB'))
    duration = factory.LazyFunction(lambda: faker.pyfloat(min_value=0, max_value=3600, right_digits=2))
    youtube_id = factory.LazyFunction(lambda: faker.uuid4())

    # Set the foreign key fields
    user = factory.SubFactory(NormalUserFactory)
    original_file = factory.SubFactory(FileFactory)

class ProcessedMediaFactory(factory.django.DjangoModelFactory):
    class Meta:
        model = ProcessedMedia

    user = factory.SubFactory(NormalUserFactory)
    video_path = factory.Faker('file_name', extension='mp4')
    audio_path = factory.Faker('file_name', extension='mp3')
    converted_time = factory.Faker('date_time_this_month', tzinfo=timezone.utc)
    parts = factory.Faker('sentence')
    status = Status.Initialing
    media = factory.SubFactory(MediaFactory)