import datetime from typing import TypeVar, cast from audience_common.auth.account import Account from faker import Faker from campaigns.core.types import EncryptedToken, PlainToken T = TypeVar("T") class FakerTyped: def __init__(self) -> None: self._faker = Faker(["es-ES"]) def uuid4_string(self) -> str: return cast(str, self._faker.uuid4()) def pystr(self) -> str: return cast(str, self._faker.pystr()) def plain_token(self) -> PlainToken: return cast(PlainToken, self.pystr()) def encrypted_token(self) -> EncryptedToken: return cast(EncryptedToken, self.pystr()) def email(self) -> str: return cast(str, self._faker.email()) def user_name(self) -> str: return cast(str, self._faker.user_name()) def domain_name(self) -> str: return cast(str, self._faker.domain_name()) def name(self) -> str: return cast(str, self._faker.name()) def image_url(self) -> str: return cast(str, self._faker.image_url()) def video_url(self) -> str: url = cast(str, self._faker.url()) return f"{url}video.mp4" def uri(self) -> str: return cast(str, self._faker.uri()) def integer(self, length: int = 5, fixed_length: bool = True) -> int: return cast(int, self._faker.random_number(digits=length, fix_len=fixed_length)) def numeric_string(self, length: int = 5, fixed_length: bool = True) -> str: return str(self.integer(length, fixed_length)) def choice(self, items: list[T]) -> T: return cast(T, self._faker.random_choices(elements=items, length=1)[0]) def ipv4(self) -> str: return cast(str, self._faker.ipv4()) def country(self) -> str: return cast(str, self._faker.country()) def country_code(self) -> str: return cast(str, self._faker.country_code()) def region(self) -> str: return cast(str, self._faker.region()) def city(self) -> str: return cast(str, self._faker.city()) def date_time(self, tzinfo: datetime.tzinfo | None = None) -> datetime.datetime: return cast(datetime.datetime, self._faker.date_time(tzinfo=tzinfo)) def date_time_utc(self) -> datetime.datetime: return cast(datetime.datetime, self._faker.date_time(tzinfo=datetime.UTC)) def bytes(self) -> bytes: return cast(bytes, self._faker.binary(length=50)) def account( self, vendor_id: int | None = None, subaccount_id: int | None = None ) -> Account: return Account( vendor_id=vendor_id if vendor_id else self.integer(), subaccount_id=subaccount_id if subaccount_id is not None else self.integer(), )