import random
import string
from typing import Optional

from pydantic import BaseModel

from lnbits.wallets import get_funding_source, set_funding_source


class FakeError(Exception):
    pass


class DbTestModel(BaseModel):
    id: int
    name: str
    value: Optional[str] = None


class DbTestModel2(BaseModel):
    id: int
    label: str
    description: Optional[str] = None
    child: DbTestModel
    child_list: list[DbTestModel]


class DbTestModel3(BaseModel):
    id: int
    user: str
    child: DbTestModel2
    active: bool = False
    children: list[DbTestModel]
    children_ids: list[int] = []


def get_random_string(iterations: int = 10):
    return "".join(
        random.SystemRandom().choice(string.ascii_uppercase + string.digits)
        for _ in range(iterations)
    )


async def get_random_invoice_data():
    return {"out": False, "amount": 10, "memo": f"test_memo_{get_random_string(10)}"}


set_funding_source()
funding_source = get_funding_source()
is_fake: bool = funding_source.__class__.__name__ == "FakeWallet"
is_regtest: bool = not is_fake
