import factory
from app.models.base import Base
from app.models.user import User
from app.models.blacklist import Blacklist
import json
from datetime import datetime




class BaseFactory(factory.Factory):
    class Meta:
        model = Base

    # Define factory attributes
    public_id = factory.Faker('uuid4')
    tags = factory.Faker('words', nb=3)  # Generates a list of random words as tags
    deleted = False
    created_at = factory.Faker('date_time_this_decade', before_now=True, after_now=False)
    updated_at = factory.Faker('date_object')
    deleted_at = None
    

    @classmethod
    def to_json(cls):
        instance = cls.build()
        return json.dumps(instance)

    @classmethod
    def to_dict(cls):
        instance = cls.build()
        return dict(instance)
    
class UserFactory(factory.Factory):
    class Meta:
        model = User

    username = factory.Faker('user_name')
    email = factory.Faker("email")
    password = factory.Faker('password')
    company_name = factory.Iterator(['Aicha', 'Orange', 'Medi1TV', '2M'])
    company_type = factory.Iterator(['Anonymous Company', 'Brands Company', 'Ad Agency Company', 'TV Channels Company'])
    role = "default"
    is_verified = False
    is_superuser = False
    is_admin = False
    is_active = True
    is_staff = False
    is_online = False
    is_blocked = False
    notif_enabled = True
    last_login = None
    date_joined = factory.LazyFunction(datetime.utcnow)
    last_seen_at = None

    @classmethod
    def to_json(cls):
        instance = cls.build()
        return json.dumps(instance)

    @classmethod
    def to_dict(cls):
        instance = cls.build()
        return dict(instance)
    


class BlacklistFactory(factory.Factory):
    class Meta:
        model = Blacklist

    token = factory.Faker('word')
    token_type = factory.Faker('word')
    jti = factory.Faker('uuid4')
    reason = factory.Faker('word')