import factory


from app.models import User
from app.models import UniqueIDMixin
from app.models import Role
import json
from datetime import datetime

class UniqueIDMixinFactory(factory.mongoengine.MongoEngineFactory):
    class Meta:
        model = UniqueIDMixin

    # Customize the public_id field to generate a unique identifier
    public_id = factory.Faker('uuid4')
    

class RoleFactory(factory.mongoengine.MongoEngineFactory):
    class Meta:
        model = Role

    name = factory.Iterator(['admin', 'publisher', 'advertiser'])
    description = factory.Faker('sentence')
    permissions = factory.Faker('words', nb=3)

class UserFactory(factory.mongoengine.MongoEngineFactory):
    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'])
    roles = factory.List([factory.SubFactory(RoleFactory) for _ in range(2)])
    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):
    # Load configuration settings from the Config class
    app.config.from_object(Config)
    # app.config["JWT_TOKEN_LOCATION"] = ["headers", "cookies", "json", "query_string"]
    # app.config["JWT_HEADER_NAME"] = "Authorization"
    # Initialize the api extension
    api.init_app(app)
    # Initialize the database extension
    db.init_app(app)
    jwt = JWTManager(app)

 
    api.add_namespace(genre_namespace)
    api.add_namespace(program_namespace)
    api.add_namespace(channel_namespace)
    api.add_namespace(schedule_namespace)
    api.add_model('Program', program_model)
    api.add_model("Schedule", schedule_model)
    api.add_model("Genre",genre_model)
    # api.add_namespace(brand_namespace)

    return app
        instance = cls.create()
        return dict(instance)
    


